简介
CSDN 质量分是一项公开的 CSDN 博文内容质量分析服务,其综合分析了内容的标题、段落结构、正文长度、代码格式及复杂度、链接和超文本内容比例及质量等因素,为 IT 技术文章提供客观公共的质量分析结果
用途
- 可用与对文章质量做评估
- 可申请创作者 (有对文章质量分的要求)
- 注意其他不正当用途 需要自行负责
创作者身份认证审核标准
优质创作者申请条件:
粉丝数在5000以上
近30日(申请日算起)原创文章数不少于4篇
原创博文总数不少于100篇
垂直领域原创数量不低于总文章数的60%
垂直领域近2年原创博文质量平均分不得低于80分
新星创作者申请条件:
粉丝数在2000以上
近30日(申请日算起)原创文章数不少于4篇
原创博文总数不少于50篇
垂直领域原创数量不低于总文章数的60%
垂直领域近2年原创博文质量平均分不得低于70分
其他特殊身份认证申请条件(如果博主有以下特殊身份):
拥有个人发明专利
是技术图书作者
全国技术比赛获奖者
大学讲师
特殊身份认证在申请认证的时候可以描述为「《xxx》书籍作者」「xxx专利发明者」等等,只要提交相关证明同时粉丝数在500以上并原创博文数达到50篇即可申请,若文章不存在抄袭的情况可通过审核。
优质创作者和新星创作者只要满足以上条件基本都会通过审核。但是也有特殊的不会通过审核情况,具体如下:
文章质量过低
认证描述不清不楚
文章存在抄袭行为
文章多为毕设相关
若通过认证后被举报抄袭且被证实将取消认证资格
所以在申请的时候也需要查询自己的文章质量分。
质量分查询
文章质量分查询地址: https://www.csdn.net/qc?utm_source=1966961068 点我跳转查询
输入博客地址即可完成查看
文章平均质量分查询可通过博客主页的「学习成就」进行查询,如下图所示:
但是多篇博客,你想知道哪个哪个博客质量分过低 那该怎么办 总不能一个一个查询吧
质量分批量查询
官方只提供了单个博客质量分查询的地址 ,批量查询只能靠我们自己实现了
主要有两步
- 查询自己所有博客的url
- 将每个博客url 作为参数 循环调用单个文章质量分查询
- 汇总结果
查询自己所有博客的url
这里使用手工方式
username 替换为自己的博客地址 分页的size 传入的是500 但是测试下来 分页参数实际上最大只支持100 如果有个超过100篇文章 需要自行替换 分页的页码 参数即 page 第一页传入1 第二页page 传入2 然后将查询的结果保存为json文件 (可使用chrome插件 FeHelper) 依次类推 直到没有文章为止
https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=500&businessType=blog&orderby=&noMore=false&year=&month=&username=xxx
例如
批量查询
-
文件准备
将下载好的json文件 放入自己的项目里 (java项目即可)
-
依赖引入 hutool guava (可选) 改造较小 fastjson
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
-
批量查询代码
- 需要修改地方 json文件位置
- header 参数 需要先访问质量分查询地址 查询文章的质量分 然后抓包获取如下参数 完成参数替换
headerMap.put("accept","application/json, text/plain, */*"); headerMap.put("x-ca-key","xxx"); headerMap.put("x-ca-nonce","83117056-93cc-438d-bc28-12d38664ee15"); headerMap.put("x-ca-signature","X+sjLooW01anLpAHxL3VJmxRYEEZ8kNJJ/loBABCc="); headerMap.put("x-ca-signature-headers","x-ca-key,x-ca-nonce"); headerMap.put("x-ca-signed-content-type","multipart/form-data"); headerMap.put("content-type","multipart/form-data; boundary=----WebKitFormBoundary3xxiyRJFc0k4eF4w"); headerMap.put("cookie","xxx");
- 结果文件写入路径
- 代码如下
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.http.HttpGlobalConfig; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import java.io.*; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author leon * @date 2024/08/29 */ @Slf4j public class Test { public static void main(String[] args) throws IOException { //json 文件所在路径 自行替换json文件的位置 List<String> pathList= Lists.newArrayList("file/contents.json","file/contents2.json","file/contents3.json"); List<String> urlList = getAllArticleUrl(pathList); if(CollectionUtil.isEmpty(urlList)){ log.error("文章url为空"); return; } log.info("文章总数: {}",urlList.size()); Map<String,String> headerMap = Maps.newHashMap(); headerMap.put("accept","application/json, text/plain, */*"); headerMap.put("x-ca-key","xxx"); headerMap.put("x-ca-nonce","83117056-93cc-438d-bc28-12d38664ee15"); headerMap.put("x-ca-signature","X+sjLooW01anLpAHxL3VJmxRYEEZ8kNJJ/loBABCc="); headerMap.put("x-ca-signature-headers","x-ca-key,x-ca-nonce"); headerMap.put("x-ca-signed-content-type","multipart/form-data"); headerMap.put("content-type","multipart/form-data; boundary=----WebKitFormBoundary3xxiyRJFc0k4eF4w"); headerMap.put("cookie","xxx"); StringBuilder stringBuilder = new StringBuilder(); for (String url: urlList){ Map<String,Object> param = Maps.newHashMap(); param.put("url",url); try(HttpResponse resp = HttpRequest.post("https://bizapi.csdn.net/trends/api/v1/get-article-score").form(param).timeout(HttpGlobalConfig.getTimeout()) .headerMap(headerMap, true) .execute()){ String body = resp.body(); String res = "文章地址: "+url +" 结果: "+body; stringBuilder.append(res).append(System.lineSeparator()); } } log.info("======开始写入文件====="); String writeContent = stringBuilder.toString(); log.info("writeContent: {}",writeContent); //写到磁盘文件 IOUtils.write(writeContent,new BufferedOutputStream(Files.newOutputStream(Paths.get("/Users/leon/Desktop/AllArticleUrl.txt"))),StandardCharsets.UTF_8); } private static List<String> getAllArticleUrl(List<String> pathList) { if(CollectionUtil.isEmpty(pathList)){ log.info("文件路径配置为空"); return new ArrayList<>(); } ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); List<String> allUrlList = new ArrayList<>(); for (String path : pathList) { InputStream resourceAsStream = contextClassLoader.getResourceAsStream(path); if(null == resourceAsStream){ log.info("文件路径: {} 资源不存在",path); continue; } Type type = new TypeReference<JSONObject>(){}.getType(); JSONObject jo = null; try { jo = JSON.parseObject(resourceAsStream, StandardCharsets.UTF_8, type); JSONObject data = jo.getJSONObject("data"); JSONArray list = data.getJSONArray("list"); List<String> urlList = list.stream().map(obj -> { JSONObject jsonObject = (JSONObject) obj; return jsonObject.getString("url"); }).collect(Collectors.toList()); allUrlList.addAll(urlList); } catch (IOException e) { log.error("文件路径: {} 资源处理失败 错误信息: {[]}",path,e); }finally { try { resourceAsStream.close(); } catch (IOException e) { log.error("文件路径: {} 资源释放失败", path); } } } return allUrlList; } }
运行程序即可
免责声明
本工具仅用于个人学习和研究目的。使用者应该遵守 CSDN 的使用条款和规定。任何使用本工具造成的违规行为和后果,作者概不负责。
请注意,本工具仅提供便利性,不对任何因使用本工具导致的任何问题承担责任。使用本工具即代表您同意自行承担所有风险。
good day !!!