前言
公司解散,待业中,耗时一天研究了一下百度墨斗鱼文库创作中心源码。实现了后台自动完成任务并通知。
下面主要分析一下实现思路和难点
一,实现思路
调用接口查询未回答的题目列表
合并多个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