小白编写签到脚本

Mar 28, 2020

关于如何自己编写签到脚本

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()

对于小白我们就判断 ifelse 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

以上,大概就是我日常用@chavyleung造好的轮子写出来的脚本

同时也欢迎大家自己动手编写,实现仓库的万物皆可签到