用过食行生鲜的同学应该知道,每天可以在食行生鲜签到,签到可以领到 20 积分,在购物时可以抵 2 毛钱。钱虽少,但是积少成多,买菜时可以抵扣一两块钱还是不错的。
今天我们就用 python 来实现自动签到,省得我每天打开 app 来操作了。
分析
要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化。但是发现食行没有页面,只有 app,这不是一个好消息,这意味着需要抓包处理了。
不过还好,我们有微信。
在微信里面,我们发现也可以登录食行,这时选择在浏览器中打开页面,~哎~ ,柳暗花明了,我们找到了一个可用的网页地址:wechatx.34580.com
下面的操作就好办了,在电脑端的浏览器打开网址,按下 f12,开始起飞~
登录分析
点击签到后,会跳转到用户登录页面:https://wechatx.34580.com/mart/#/sign/in,输入登录信息后,点击登录,同时关注开发调试栏的网络交互信息 。
可以发现,登录的请求地址是: https://wechatx.34580.com/sz/sign/signinv2,并且会在请求时带着登录信息 :
1
2
3
4
5
6
7
|
{
"sourcetype" : "9" ,
"phone" : "18800000000" ,
"password" : "98a53578bd74e150" ,
"zhugedevicemd5" : "164edd53b71674-02922cef4808a-47e1039-e1000-164edd53b7222e" ,
"deviceid" : ""
}
|
现在,还无法确定哪些字段是必填的,哪些是可以不传的。
有一个问题是,密码是经过加密的,我在页面输入的 000000 ,这里变成了 98a53578bd74e150。这里我找了半天是如何加密的,也没有找到,若是有大神有办法,还请留言告知!
不过还好,加密方式是固定的,也就是 000000 一直对应的是 98a53578bd74e150,我们只要记下这个加密后的密码,在登录时,传入后台即可。
登录成功后,请求会响应一些 token 数据:
1
2
3
4
5
6
7
8
9
|
{
"error" : 0 ,
"message" : "返回正确" ,
"data" : {
"customerguid" : "d8cd7c84-xxxx-4369-xxxx-b1e86c027407" ,
"phone" : "18800000000" ,
"accesstoken" : "73c7b5fxxxxxxx"
}
}
|
只要 error 字段为 0,就代表登录成功!
签到分析
登录成功后,页面会自动跳转到首页,我们可以看到签到图标,点击它,进入签到页面:
发现进来还是一个签到按钮,套娃啊!再点它!
终于签到成功!
发现签到的请求: https://wechatx.34580.com/sz/signup/customersignup
签到请求中有两个重要的参数,accesstoken 和 customerguid,这两个参数就是登陆后返回的。
签到请求响应:
1
2
3
4
5
6
7
8
|
{
"error" : 0 ,
"message" : "返回正确" ,
"data" : {
"getpoints" : 5 ,
"sumgetpoints" : 840
}
}
|
返回说这次签到获得了 5 个积分,其实连续签到 4 天后,每天就可以获得 20 积分了!
实现
通过上面的分析,我们的签到流程也很清晰了,首先就是登陆获取 accesstoken 和 customerguid,然后再去签到就可以了!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import requests, json, sys
def login(phone, password):
url = "https://wechatx.34580.com/sz/sign/signinv2"
payload = {
'sourcetype' : 9 ,
'phone' : phone,
'password' : password
}
# 测试下来发现,连 header 都不需要
response = requests.post(url, data = json.dumps(payload))
data = json.loads(response.text)
is_error = data[ 'error' ]
# 登录失败直接退出
if is_error:
print ( '登录失败:{}' . format (data[ 'message' ]))
sys.exit( 1 )
else :
print ( '登录成功!' )
return data[ 'data' ][ 'customerguid' ], data[ 'data' ][ 'accesstoken' ]
def signin(customerguid, accesstoken):
url = "https://wechatx.34580.com/sz/signup/customersignup"
querystring = { "accesstoken" : accesstoken,
"customerguid" : customerguid, "sourcetype" : "9" }
# 这次不需要 body 中的传入数据
response = requests.post(url, params = querystring)
data = json.loads(response.text)
is_error = data[ 'error' ]
if is_error:
print (data[ 'message' ])
else :
print ( "签到成功,获取到 {} 个积分" . format (data[ 'data' ][ 'getpoints' ]))
if __name__ = = "__main__" :
phone = input ( '请输入账号:' )
password = input ( '请输入密码:' )
customerguid, accesstoken = login(phone.strip(), password.strip())
signin(customerguid, accesstoken)
|
运行:
$ python shsx.py
请输入账号:188xxxxxxxx
请输入密码:98a53578bd74e150
登录成功!
签到成功,获取到 20 个积分
最后,怎么自动执行?把登录信息写死到代码里,然后放到 linux 下的 crontab 里,每天早上执行一次就行啦~
总结
这里还有一个遗留问题,就是登录密码的获取,现在还只能通过 f12 查看请求获取到,然后记下来。
但是,登录密码是怎么加密的,由于本人 js 方面比较薄弱,有能力有兴趣的同学要是能看出来可以留言分享下啊~
以上所述是小编给大家介绍的python 实现「食行生鲜」签到领积分功能,希望对大家有所帮助
原文链接:http://www.cnblogs.com/hoxis/p/9704889.html