一 : 梳理思路:
- 想要签到 , 必须有一个可以签到的软件 , 网页 , 小程序等
 - 抓包 你想要进行签到的 软件 , 网页 , 小程序等(不会抓包或抓不到包的点击抓包 的超链接去学习)
 - 然后就是分析(很有可能需要解密的相关知识)你抓的数据包 , 直到找到 签到 (或其他操作) 包
 - 使用测试工具进行测试,确定是否可以请求成功(不成功自己寻找并解决问题)直到可以成功请求
 - 最后就是写脚本了, 只要前面的完成了, 写脚本那就很快了
 
二: 思路有了, 那就开始吧!
有任何错误笑笑就好了 , 当然更加欢迎您指出我的错误 , 万分感激的!
首先确定一个目标(今天来个简单的例子)
微信小程序:骁友会 (直接搜索或扫码进入:扫码有邀请 没啥用的,在意的自己搜索)
- 注册登录后可以找到 任务列表 里面有 每日签到 跟其他的很多任务(今天就搞这个签到)
 - 然后就是下一步了
 
进行 签到 (相关操作)的抓包
根据不同的机型 , 我们需要分类讨论了 首先来说说ios吧
ios 抓包相关
抓包软件
- 免费的 : stream 图标就是个心电图是的 , 免费软件 , 国区可自行下载
 收费软件:
- 不得不说的就是 圈x ios绕不开的软件 , 操作教程找科技玩家小姐姐(点击超链接即可)(不会告诉你我搬运到我的bolg了) , 需要自行外区下载
 - thor 也叫锤子 , 就是长得像索尔的吧 , 需要自行外区下载 (有这个软件的应该不需要教程)
 - Http Catcher 也叫网球 ,可能就是长得像吧 国区可下载 , 高级功能需要付费解锁 , 有这个软件的也不需要教程
 - 别的没怎么用过 , 听说过了
 
抓包操作
- 不同的软件 , 操作也有所差异 , 但是本质都是一样的 , 都是通过建立 vpn 进行代理网络流量 , 从而进行捕获数据包 . 想要捕获https 数据包 , 都需要进行证书的信任工作 , 记得有两个关于证书的操作就够了,一个地方安装证书 , 一个地方信任证书 ; 详细教程自己百度 , google 去吧!
 
Android 抓包相关
相对比 ios 来说 , 安卓的抓包就有利有弊了,得益于安卓的生态,也毁在安卓的生态(个人见解哈)
抓包软件
- 小黄鸟(3.3.6) , 小蓝鸟 , 还有各种小黄鸟的改版 ; 安卓端知名的抓包软件 , 推荐3.3.6版本,别问为啥
 - 抓包精灵 跟小黄鸟差不多的
 - 还有好多好多好多好多没听说过的软件
 
- 抓包操作 同ios 自行搜索研究去吧!
 
PC 抓包相关
- 上面的软件基本都是基于手机的 , 总有这样那样的不方便的地方,个人觉得还是配合电脑抓包,才能更好 , 更更快的分析数据包 (当然,你只有手机就当我在)
 PC 抓包软件推荐
- Fiddler 首推fd,mac的话可以考虑 charles , fd的强大是人尽皆知的:学习链接 -- 52破解基础基础 进阶教程
 - charles (也叫花瓶、青花瓷等)mac用户首推这个 , 当然win也有这个 分类很好用; 看雪charles教程
 - 别的没怎么用过 , 当然抓包工具还有超级多的
 
抓包签到
- 打开你的抓包软件 , 或者手机连上你的电脑抓包软件
 - 确定开始正常抓包后去app执行签到相关操作
 - 返回抓包工具 , 停止抓包 , 备注刚才抓包的app 进行的操作(不能备注的也没办法)
 - 至此,抓包结束
 
分析刚才抓的数据包
分析数据包这个东西吧 , 没法教 ,主要看自己的悟性(就是猜) , 自己的英语水平 (数据包基本没有中文,只有部分中文的提示,基本全是英语) , 还有就是自己的经验(废话) ,我们一点点来说吧!
首先可以根据 url 链接,寻找关键字进行定位
- 例如: 某个url如下
 https://qualcomm.growthideadata.com/qualcomm-app/api/user/signIn?userId=xxx请你判断下这个url 是做什么工作的 用户登录我们来分析下这个 url
- 首先前面是固定的 
https://这个是 https 请求 qualcomm.growthideadata.com是他的域名(也就是host)/user/signIn很明显就是/用户/登录了鸭
- 首先前面是固定的 
 - 像这种的根据 url 中的英文单词来判断 这个数据包功能是 非常非常非常 常见的,因为你第一眼看到的就是这玩意了
 
然后我们还可以根据 响应体 来进行判断 (请求头 请求体 响应头 响应体还不懂的自行去补课: 简书
- 例如: 某个响应体如下 ;
 
{
 "code": 0,
 "message": "success!",
 "data": {
 "coins": 5
 }
}
- 请你判断下这个 响应体 可能是什么的 , 我们经常用的数据有哪些? 用户签到获得硬币(金币等) 常用数据:code message coins
 
我们可以根据数据包的类型来进行初步筛选
- 一般请求都是 
post或者get请求 , 我们根据数据包类型减少工作量 - 一般有携带账号密码信息的请求都是使用 
post进行的 - 一些简单的请求可能使用 
get 
我们可以根据获得的数据进行搜索筛选
- 例如: 我们签到获得了5 积分 , 我们就可以直接搜索 
5作为关键字搜索响应体(因为这个数据是服务器发回我们的,所以搜索响应体) ; 搜索出来数据可能超级多 因为5太常见了 ; 如果3378等这样的值这样搜索 效果比较好 - 同理,也可以进行中文的搜索筛选(效果非常不理想,很多返回都是英文的)
 
可以通过软件内的时间来进行辅助定位
- 例如:你签到成功后,很多软件都会给你一个积分(金币)啥的明细表,就是你什么时间,做了什么操作,然后获得了多少积分等
 - 可以根据软件给的时间 来进行辅助定位,很多软件会精确到毫秒 ,所以这不失为一个好方法呢(o)/~
 
没有别的办法那就只能查看所有数据包,慢慢寻找你要的数据包了
- 找的过程也要慢慢积累,尽可能的搞清楚他的命名逻辑,对以后的找包速度会有明显提升
 
下面给出本次试验对象的签到数据包
使用测试工具进行测试
其实这里我不知道该叫什么名字,反正我就按照我自己的理解进行教程,有不对,不合适的地方,请指出
使用抓包工具自带的软件进行测试
很多抓包工具都带有数据包 重发 功能,例如:
- 安卓:小黄鸟、小蓝鸟
 - ios:圈x自带重放 锤子配合 anubis 网球没用过
 - pc: fd自带重放 花瓶(charles)都可以直接进行重放
 
- 一般当你不能确定是否是这条数据包时,重放总是一个不错的选择!
 
使用第三方的调试工具进行测试
- 我比较常用的有 postman apipost等
 - 这里主要是进行数据的重放与必要参数的测试
 
进行数据包参数测试
- 这一步主要是确定服务器会校验那些参数,那也就是我们写脚本必须要加强关注的参数
 - 所谓的服务器校验,也就是你发送过去后 他会判断这个参数是否正常,不正常的话一般会返回一些错误码等等
 - 也就是说,你要保证他检验的数据一定是正确的,你才有可能签到(别的什么操作)成功
 - 得到最简的参数时,这一步可以算完成了
 
接下来就是最后一步了,我们开始写脚本吧
开始写脚本之前我先声明几句
- 我的js是自学的,难免有错误的地方
 - 很多地方都是大佬的开源脚本修改的,可能修改的四不像,但是我用着舒服就行了
 - 脚本我写了很多注释 // 就是双引号后面的内容,希望可以帮你可以尽快的理解这一行的作用
 - 有任何不懂得地方,直接百度、google查一下 很快就懂了
 - 没了没了 开始
 
- 首先,脚本地址:
 - 如果遇到任何问题,请首尝试自己解决它,这样你的成长才会更快;实在解决不了的可以群里问
 - 啰啰嗦嗦几千字了,第一版就先这样吧
 - 下面给懒得同学吧脚本内容搬运下,省的跳过去看了!
 
/**
 * 教程
 * 地址:
 *
 * 教程    这里是写脚本说明的地方
 * 本脚本仅用于学习使用请勿直接运行
 *
 * ========= 青龙 =========
 * 变量格式:export jiaocheng_data=' xxxx & xxx @  xxxx & xxx '  多个账号用 @分割
 *
 */
const jsname = "教程";
const $ = Env(jsname);
const notify = $.isNode() ? require('./sendNotify') : '';      // 这里是 node(青龙属于node环境)通知相关的
const Notify = 1; //0为关闭通知,1为打开通知,默认为1
const debug = 1; //0为关闭调试,1为打开调试,默认为0
//////////////////////
let jiaocheng_data = process.env.jiaocheng_data;               // 这里是 从青龙的 配置文件 读取你写的变量
let jiaocheng_dataArr = [];
let data = '';
let msg = '';
!(async () => {
 if (!(await Envs()))      //多账号分割 判断变量是否为空  初步处理多账号
 return;
 else {
 console.log(`本地脚本4-11 )`);       // console.log是输出信息的,可以在脚本日志中看到输出(打印)的信息
 console.log(`\n\n=========================================    \n脚本执行 - 北京时间(UTC+8):${new Date(
 new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 +
 8 * 60 * 60 * 1000).toLocaleString()} \n=========================================\n`);
 await wyy();
 console.log(`\n=================== 共找到 ${jiaocheng_dataArr.length} 个账号 ===================`)
 if (debug) {
 console.log(`【debug】 这是你的全部账号数组:\n ${jiaocheng_dataArr}`);
 }
 for (let index = 0; index < jiaocheng_dataArr.length; index++) {
 let num = index + 1
 console.log(`\n========= 开始【第 ${num} 个账号】=========\n`)
 data = jiaocheng_dataArr[index].split('&');      // 这里是分割你每个账号的每个小项
 if (debug) {
 console.log(`\n 【debug】 这是你第 ${num} 账号信息:\n ${data}\n`);
 }
 // 这里是开始做任务    需要注意的点
 //     1. await只能运行与async函数中
 //     2. 函数的名字不可以相同
 //      3. 不够可以自己复制
 console.log('开始 xx');
 await signin();
 await $.wait(2 * 1000);
 // 这里是开始做任务
 console.log('开始 yy');
 await yyyy();
 await $.wait(2 * 1000);
 // 这里是开始做任务
 console.log('开始 zz');
 await zzzzz();
 await $.wait(2 * 1000);
 await SendMsg(msg);    // 与发送通知有关系
 }
 }
})()
 .catch((e) => console.logErr(e))
 .finally(() => $.done())
/**
 * 签到  骁友会
 * 下面我们来看看函数需要注意的东西吧
 */
function signin(timeout = 3 * 1000) {
 return new Promise((resolve) => {
 let url = {
 url: `https://qualcomm.growthideadata.com/qualcomm-app/api/user/signIn?userId=${data[1]}`,    // 这是请求的 url 可以直接用我们抓包、精简后的URL
 headers: {            // headers 是请求体  可以直接用精简后的 hd  也就是服务器校验的部分,他需要啥,我们就给他啥
 "userId": data[1],
 "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
 "Host": "qualcomm.growthideadata.com",
 "User-Agent": UA,
 "sessionKey": data[0],
 "Referer": "https://servicewechat.com/wx026c06df6adc5d06/176/page-frame.html",
 "Connection": "keep-alive"
 },
 // body: '',       // 这是一个 get 请求,没有请求体 body   如果是 post 不要忘记他鸭!
 }
 if (debug) {
 console.log(`\n【debug】=============== 这是 签到 请求 url ===============`);
 console.log(JSON.stringify(url));
 }
 $.get(url, async (error, response, data) => {     // 这是一个 get 请求 , 如果是 post  记得把这里改了
 try {
 if (debug) {
 console.log(`\n\n【debug】===============这是 签到 返回data==============`);
 console.log(data)
 }
 let result = JSON.parse(data);
 if (result.code == 200) {        // 这里是根据服务器返回的数据做判断  方便我们知道任务是否完成了
 console.log(`【签到】${result.message} 
  [1]: https://www.jianshu.com/p/eb3e5ec98a66          
