关于如何自己编写签到脚本
GET方法篇(豆瓣时间为例子)
第一步,对我们要实现自动签到的App抓包
推荐使用Thor进行抓包和数据分析,没有的话也可以使用Qx or Surge
大致的抓包流程如下
删除未完成的请求以及一些图片,有一条
check_in的记录映入你的眼帘,你二话不说就点进去看看这条记录,查看了她的消息体(你就是馋她的身子), 你拿出了多年学习英语的经验,知道Good Good Study,Day Day Up的真理, 一眼看去"has_checked":true&"auto_check":{"status":"success"},你知道这个脚本有戏了。然后放进Anubis这个神奇的App进行重放操作,你知道胜败就在此一举,接下来的脚本能否实现就靠它了->
重放于是乎,你查看了重放的结果,果然不出所料。
1、能够返回数据
2、返回数据几乎与手动签到一致,除了部分参数变成了false或者其他
3、可以说找到关键的记录是非常的重要的操作
备注:建议无任何基础者先抓包,找出签到记录(一般记录都会有自己的标识,像上面的这种就比较容易发现)
然后第二天对记录进行重放操作,如果返回的消息体与手动签到近似度达到95%,则可进行下面的操作!
第二步,对抓包数据进行分析
response的数据
可以看到对我们有用的数据在上方已经说明
has_checked&status然后再仔细看看可以看到
"continuous_check_in_count": 1,意味着连续签到天数在下面的脚本编写的过程中会重点用到这几个数据
request的数据
其中的 host:frodo.douban.com 这个是我们要添加到 MiTM中的主机名
而链接
https://......?在?之前我们是需要将其改写然后添加到复写的(至于为什么是?之前,建议百度 GET和POST请求方式)上面的复写就是
^https:\/\/fro\.douban\.com\/api\/v2\/niffler\/check_in\/status可以看和原来的
https://fro.douban\com/api/v2/niffler/check_in/status区别所在(这里涉及到正则语法),但是你依然可以不用管,套模版画葫芦。所以我们最终就可以得到以下一份复写配置指南:
[MiTM]
frodo.douban.com
[rewrite_local] Qx
^https://fro.douban.com/api/v2/niffler/check_in/status url script-request-header dbsj.cookie.js
[rewrite_local] Surge
http-request ^https://fro.douban.com/api/v2/niffler/check_in/status script-path=dbsj.cookie.js
第三步,编写Cookie脚本
3.1 首先从GitHub上下载@chavyleung库中的脚本(这里用 全民K歌的)

我们下载了这三个文件到电脑或者你的手机中,打开将init方法上的名字(全民K歌,qmkg)改掉。
README.md这个文件我们可以暂时不用管

请看下方注释文本,GET方法我们只需要 url和header

激动人心的时候到了,是时候表演真正的技术了,我们将写好的dbsj.cookie.js(注意这里需要改一下文件名)放到本地进行测试,添加MITM&rewrite
第四步,开启测试
我们打开Anubis,选中我们刚刚重放的记录,再次对其进行重放操作(相当于模拟手动签到)
- 成功:那么你会收到Qx或者Surge的获取Cookie成功的通知
- 失败:你不会收到任何通知(
- 这里可能有几种失败的原因,你的复写不正确,你没有进行配置,或者你没有开关软件
第五步,编写签到脚本
在上一步中,我们已经将init()方法上的参数修改了,这里不再赘述
继续看图中的注释内容

我们将返回的数据给了result,此时result就相当于我们手动签到和重放返回的消息体中的数据,参考第二步response的数据。
//这里意味在全名K歌中我们要获取的数据,我们需要对其进行改写
const total = result.data['task.revisionSignInGetAward'].total
const ret = result.data['task.revisionSignInGetAward'].ret
//在豆瓣时间我们确定了对我们有用的数据是 has_checked、continuous_check_in_count以及status
//具体参数的意义可以从英文释义了解到 今日是否签到 连续签到天数 自动签到结果
//那么我们就用这三个判断 重复签到 签到成功还是失败
//下面我们来获取数据,result在第一个{},而我们要获取has_checked就要 result.today_status进入到第二个{}
//然后再result.today_status.has_checked获取到我们想要的数据并赋给 has_checked
const has_checked = result.today_status.has_checked
//对于连续签到天数,我们这里也加上作为演示
const continuous_check_in_count = result.continuous_check_in_count
const status = result.auto_check.status
//然后我们要开始对我们取到的数据进行判断了
if (status == "success") {
//等于true是因为手动签到的时候 “status”: "success" 你要根据你要编写的脚本具体变化
//举个例子, 在某个脚本中关键的地方是 “checked”: 200 那么你就要判断 chencked == 200
subTitle = `签到结果: 成功` //这里我们不改动
//对于连续签到天数,我们放在detail中,那么就需要这样写了
//只需要将获取到的数据放在 ${} 当中的大括号即可
detail = `连续签到天数${continuous_check_in_count}`
} else if(has_checked == true) {
//重放(再次签到)返回的结果是 true 所以我们判定他是重复签到
subTitle = `签到结果: 重复`
} else if(has_checked == false){
//这一个判断你可加可不加
subTitle = `签到结果: 失败`
}
//软件的通知方法
senku.msg(cookieName, subTitle, detail)
senku.done()
对于小白我们就判断
if和else if成功或者重复的情况,找到关键字例如status对其判断就好当然如果你知道那个参数数据是失败的话 那么你就可以用
else if(xxx == xx){subTitle = 签到失败}
最终我们得到这么一份脚本,
init()方法我们不做任何改动
const cookieName = '豆瓣时间'
const signurlKey = 'senku_signurl_dbsj'
const signheaderKey = 'senku_signheader_dbsj'
const signbodyKey = 'senku_signbody_dbsj'
const senku = init()
const signurlVal = senku.getdata(signurlKey)
const signheaderVal = senku.getdata(signheaderKey)
sign()
function sign() {
const url = { url: signurlVal, headers: JSON.parse(signheaderVal)}
senku.get(url, (error, response, data) => {
const result = JSON.parse(data)
let subTitle = ``
let detail = ``
const status = result.auto_check.status
const has_checked = result.today_status.has_checked
const continuous_check_in_count = result.continuous_check_in_count
if (status == "success") {
subTitle = `签到结果: 成功`
detail = `连续签到天数${continuous_check_in_count}`
} else if (has_checked == true) {
subTitle = `签到结果: 重复`
}
else if (has_checked == false) {
subTitle = `签到结果: 失败`
}
senku.msg(cookieName, subTitle, detail)
senku.done()
})
}
我们将脚本放在本地,添加task,然后对其进行手动只需一次,不出意外的话,你会收到软件的通知
[task_local]
1 0 * * * dbsj.js