前言
公司解散,待业中,耗时一天研究了一下百度墨斗鱼文库创作中心源码。实现了后台自动完成任务并通知。
下面主要分析一下实现思路和难点
一,实现思路
调用接口查询未回答的题目列表
合并多个tab下的题目
设置黑白名单,这里主要是筛选出好答的题目,提高通过率。
过滤出最适合回答的问题,根据题目去gpt等ai平台查询答案,为了提高通过率,只有200字以上的答案才进行上传,否则加入题目黑名单,下次不再检查。
将答案生成到word文档流中
上传文件,这里略微复杂,调用了3次上传接口。
提交文件,并发送钉钉消息。
二,关键接口
-
获取个人信息:fetchmain
-
判断cookie是否有效:getfufeifulltryreadstatus
-
查询题目列表:getquerypacklist
-
文件预览:previewfile
-
获取文件上传配置:getbostoken
-
文件上传(参数不同调用了三次):upload
-
编译文件获取docid:completefile
-
保存文件:addpublicdoc
package com.g7go.reverse.mdy.service;import com.g7go.reverse.mdy.entity.*;import java.util.Map;/*** 百度墨斗鱼** @author liwenchao*/
public interface BaiDuMdyService {/*** 获取个人信息*/FetchmainResult fetchmain();/*** 获取付费全部读取状态*/FufeifulltryreadstatusResult getfufeifulltryreadstatus();/*** @param cid 栏目id* @param pn 页数* @param rn 条数* @param tab 传1*/GetquerypacklistResult getquerypacklist(int cid, int pn, int rn, int tab);/*** 文件预览*/PreviewfileResult previewfile(String filename, String identifier, String totalSize, String fileExt, String token);/*** 获取上传文件配置*/BosTokenResult getbostoken(String filename, String identifier, String totalSize, String fileExt);/*** 上传文件1*/UploadOneResult upload(String securityToken, String ak, String sk, String bucket, String key);/*** 上传文件2*/void upload2(String securityToken, String ak, String sk, String bucket, String key, String uploadId, String totalSize, byte[] bytes);/*** 上传文件3*/UploadThreeResult upload3(String securityToken, String ak, String sk, String bucket, String key, String uploadId, String identifier);/*** 完整文件获取docid*/CompletefileResult completefile(String filename, String identifier, String totalSize, String fileExt, String token);/*** 保存文档*/AddpublicdocResult addpublicdoc(String filename, String docId, String identifier, String queryId, String foldId, String token);/*** 定时完成任务*/void execTask() throws InterruptedException;/*** 查询有效cookie列表,并删除无效cookie*/Map<String, String> queryCookie();/*** 设置新的cookie*/void saveCookie(String cookie);/*** 删除cookie*/void removeCookie(String cookie);}
三,项目难点
上传文件接口签名算法
r.prototype.generateAuthorization = function(e, t, n, r, a, s, c) {var f = a ? new Date(1e3 * a) : new Date, u = i.format("bce-auth-v1/%s/%s/%d", this.ak, f.toISOString().replace(/\.\d+Z$/, "Z"), s || 1800);o("rawSessionKey = %j", u);var d = this.hash(u, this.sk), h = this.uriCanonicalization(t), l = this.queryStringCanonicalization(n || {}), p = this.headersCanonicalization(r || {}, c), b = p[0], m = p[1];o("canonicalUri = %j", h),o("canonicalQueryString = %j", l),o("canonicalHeaders = %j", b),o("signedHeaders = %j", m);var v = i.format("%s\n%s\n%s\n%s", e, h, l, b);o("rawSignature = %j", v),o("sessionKey = %j", d);var g = this.hash(v, d);return m.length ? i.format("%s/%s/%s", u, m.join(";"), g) : i.format("%s//%s", u, g)}
请求头中三个重要参数实现
代码已上传gitee欢迎交流
https://gitee.com/g7go/reverse-engineering-task