3分钟写一个脚本,每天定时薅东哥羊毛

经常用京东的朋友都知道,京东有一个常驻的签到送京豆的活动。

签到送的豆子从数量上看比较鸡肋,但打开app时看到断签漏签的提醒就总是让人很不舒服。那么有没有一种方法,能够实现每天自动签到呢?

今天就让我们用python写一个脚本,花3分钟的时间实现这个小需求。

编写脚本,完成签到

首先,我们需要获取到自己账号的用户信息,才能调用签到的接口,而账号的用户信息可以在cookie中找到。

我们可以通过登录移动端京东的网页,在请求头中找到我们需要的cookie值。

根据试验,我们只需要截取cookie中的pt_keypt_pin值就可以了。

这里要注意,获取到cookie后不要退出账号,直接关闭网页就可以,cookie一般几个星期后才会过期。

之后我们需要截取到签到接口的链接,然后就可以发送请求了。这里接口已经帮大家获取好了。

1
2
3
4
5
6
7
8
9
10
11
pt_key="替换为自己的pt_key"
pt_pin="替换为自己的pt_pin"
cookie="pt_key={}; pt_pin={}".format(pt_key, pt_pin)
url = "https://api.m.jd.com/client.action?functionId=signBeanAct&body=%7B%22fp%22%3A%22-1%22%2C%22shshshfp%22%3A%22-1%22%2C%22shshshfpa%22%3A%22-1%22%2C%22referUrl%22%3A%22-1%22%2C%22userAgent%22%3A%22-1%22%2C%22jda%22%3A%22-1%22%2C%22rnVersion%22%3A%223.9%22%7D&appid=ld";
headers = {
    "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
    "User-Agent": "okhttp/3.12.1;jdmall;android;version/10.3.4;build/92451;",
    "Cookie": cookie
}
response = requests.post(url=url, headers=headers)
print(response.text)

附上源码,只需要用自己的pt_keypt_pin替换掉原有的两个变量的值,然后运行脚本就可以啦。

这里由于我当天已经签到过了,所以返回了已签到的信息。至此签到功能的脚本就完成了。

但写完这个脚本之后,我总觉得感觉少了点什么:如果我每天都要把脚本亲手执行一次,那不就成了另一种形式的签到了吗,和在手机上点签到没有区别呀。

所以接下来我们还需要想一个办法,让脚本每天定时执行。

创建云函数,定时执行

定时执行脚本最简单的方法,当然是做一个定时任务放到服务器上,不过考虑到有的朋友可能没有私人服务器,我们选择用阿里云的云函数服务来实现。

这里选择阿里云只是出于个人习惯,使用其他的云函数平台也是完全可以的。不过使用其他平台之前需要关注一下平台的收费策略,阿里云每个月云函数调用次数和外网流量的免费额度对个人用户而言是完全足够的,不需要担心。

首先开通阿里云的FC函数计算服务,点击左侧的服务与函数,然后点击创建服务

进入刚才创建的服务后,点击创建函数,选择使用标准 Runtime 从零创建,将运行环境改为python,完成云函数的创建。

然后就可以对云函数进行修改了,直接将之前的代码复制到云函数的handler方法里。

这里有两个需要注意的点。首先修改云函数代码后一定要点击部署代码,否则代码不会被上传到云;其次为了实现每天运行1次,触发器要选择定时触发器,触发方式选择自定义,CRON 表达式可以设置为CRON_TZ=Asia/Shanghai 0 30 1 * * *,即每天凌晨1:30运行一次。

将云函数部署后,可以测试一下看结果,如果没有问题就万事大吉,等待定时运行就可以了。

如果签到成功,response中就可以看到签到成功的信息,至此云函数创建完成。

但到走这里,我还是觉得少了点什么:如果我想要保证不断签,那我就需要保证cookie值不过期,而为了保证cookie值不过期,我就需要每天登录平台看执行日志,这不又本末倒置了吗?

还好有办法,这里我们可以通过一些公众号提供的消息接口,实现用微信实时接收云函数调用情况的功能。

设置微信提醒,接收执行结果

这里通过个人公众号搭建比较麻烦,更推荐大家使用现有的平台,这里推荐Server酱,可以搜索或者访问https://sct.ftqq.com/login

微信扫码登陆后,可以获取到个人的SendKey,然后通过向指定连接发送get请求,就能在微信接收到消息了,这里同样附上代码。

1
2
3
4
5
6
7
8
9
res = response.json()
returnMes = ""

if(res.get("errorMessage")==None):
    returnMes = "签到成功!"
else:
    returnMes = "签到失败:{}".format(res.get("errorMessage"))

requests.get("https://sctapi.ftqq.com/这里填写你个人的SendKey.send?title={}".format(returnMes))

将以上代码放在原本的处理之后,这样如果云函数执行出现问题,你就能立马在微信接收到执行结果,然后及时更新一下云函数的cookie信息,就能解决问题了。

这里附上一张运行成功的结果图:

至此,京东定时签到的功能就完全完成了。日常签到给的京豆数量比较有限,不过618等活动期间签到给的京豆数目十分可观,到时候大家可以自行爬取活动签到的接口url进行一个替换。同时这套思路也适用于各种其他网站App,更多的运用场景还是要等待大家去发掘。

Python Geek Tech wechat
欢迎订阅 Python 技术,这里分享关于 Python 的一切。