手把手教你给偶像刷票。偶像来了?程序员来了!Charles实战

有人说程序员不懂浪漫,还有一些梗说即使是女神/男神,换行不同也不相为谋。 更别说,有的 女生/男生 有自己喜欢的 小哥哥/小姐姐,黑我们作为程序员不懂他们的追星乐趣。

OK,我们可能不懂追星的那份乐趣,但是如果能够让你们开心。那我们也愿意。

接下来,就实战演示一下,如何讨好你的追星另一半。

(虽然我只在安卓手机上测试过,iphone应该同理)

  1. 首先,你需要一部手机,装一个你想要投票的APP/网页/小程序。
  2. 电脑上安装一个抓包软件,这里我使用的是Charles。
  3. Postman等,能模拟网络请求的工具。

在手机上抓包数据

打开Charles,用手机连接它。

  1. 菜单里面找到 Proxy => ProxySetting =>查看自己的端口(一般都是8888)
  2. 然后查看自己的IP地址,window在CMD中输入ipconfig, Mac/Linux 在terminal中输入 ifconfig 并在手机中配置

填入自己的IP地址即可。图上是我的本机IP地址。

这个时候就可以看到这样的画面了

可以看到左边请求的地址来自于https,进行了加密,我们的请求API也变成了unknown。如果我们想要获取SSL的内容,需要给手机安装证书,获取权限。

在菜单选择Help => SSL Proxying => Install Charles Root….,根据自己的设备进行选择。如果是手机,就选择第四项。如图。

然后会弹出这个画面

在手机上用chrome浏览器(系统默认浏览器可能导致识别证书,就无法安装)访问 chls.pro/ssl 即可下载证书,按照提示安装之后。就会发现,之前unknown的API变的可见啦!

之后你在手机上的每一步操作,都会在这里得到提示。

模拟请求

得到了我们想要的数据之后,我们该怎么做呢? 就拿我使用的这款小程序来说,它的设限是每隔两分钟可以偷一次花,一次可以偷5个人。 但是我每天都要上班,时时刻刻的掏手机给偶像进行投票?可能不太好吧?

这个时候,我们需要的是在手机上先进行一次投票操作,就可以在charles的左边菜单栏获取到对应的请求。 这个时候,我们需要对想要模拟的请求点击右键,选择repeat。就可以进行重复投票了。

点击右边contents可以看到两个参数,一个叫 openid,是你自己在这个小程序的唯一编码,相当于你在这个小程序的身份证。另一个是mid,是偷取的明星的编号。

你偷取5个明星,记录5次API,每隔2分钟,请求这几个API,就能保证自己不会错过任何一朵花。

难道需要一直开着Charles?

答案当然是否定的啦! 这个时候需要另一个工具,叫做Postman。是一个可以模拟HTTP请求的一个工具。 你在里面只要输入,请求的API地址,再填入一大堆配置参数,以及header等等,就可以发送成功了。

有没有简单的方法呢? 有! 在Charles里面对请求点右键,选择Copy cURL Request

然后在Postman里面,点击最上栏的Import。

选择Paste Raw Text 将刚刚复制的地址,粘贴进去。

然后在右侧窗口就会生成一个模拟好的请求,点击Send!

偷取成功!

再进一步,让一切都自动化起来。

这个时候,你在想,我为什么一定要隔2分钟点一次? 我就不能让程序自动化起来吗?

在这里用nodejs做例子。 执行cURL命令去调用API。

var exec = require('child_process').exec;
var sys = require('sys');

const hasFlowers = [];
//通过上面教的方法,将想要偷取的明星mid放入数组。
const idolsIds = [];

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
}

async function createCurlRequestLink() {
  const startTime = new Date();
  //填入你的OpenId
	const openid = 'XXXX';
  await asyncForEach(idolsIds, async (number) => {
    // for(let number = 1150; number<=3000; number++){
    const a = `curl XXXXXXX '{\"openid\":\"${openid}\",\"mid\":${number}}' --compressed`;
    await sleep(280);
    exec(a, (error, stdout, stderr) => {
      try {
        console.log(stdout);
        const json = JSON.parse(stdout);
        if (json.status > 0) {
          hasFlowers.push(number);
          console.log(`鲜花总数: ${hasFlowers.length * 8}`);
        }
      } catch (err) {
        console.log(err);
      }
    });
  });
  const endTime = new Date();
  console.log(`花费时间: ${(endTime - startTime) / 1000}`);
}
createCurlRequestLink();
// 每2分钟去偷取一次
setInterval(createCurlRequestLink, 120000);
复制代码

然后用 node 文件名 就可以运行它了。

把它丢在服务器上,用screen放在background进程里跑起来。

不知不觉中,几十万的花已经到手啦!

原理是什么?开发者就不能进行防护吗?

不论是小程序还是APP,都是在你的手机上。它需要和远程的服务器进行数据交互,也就是API请求。 本质上,我们只是进行了一次模拟请求,相当于你手机进行了点击。 而讲到刚刚的部分,我们也依旧是在合理的操作范围许可内。并没有任何的作弊行为,只不过让偷花的行为变得自动化了起来。能够在凌晨也让电脑替我们偷花。

至于开发者能不能防护呢? 这个答案是肯定的。 比如,对每一个openid进行来源监测,访问设备的监控,请求的时候携带额外参数判断来源。 如果短期内Openid进行了多个设备的更换,标记为可疑,等等。

但是是否值得,就是另一个讨论的范畴了。

总结

看到了这里,你可以随心所欲的给你的女神/男神去刷票啦! 既没有浪费时间去一直等待投票的时间,又得到了心里的满足。 如果你看完了这篇文章,那恭喜你,还学到了新知识。

/为了免去不必要的麻烦,我隐去了我使用的投票软件。/

转载于:https://juejin.im/post/5be45d83e51d454b80298a6e

你可能感兴趣的:(手把手教你给偶像刷票。偶像来了?程序员来了!Charles实战)