Python 实现「食行生鲜」签到领积分功能


Posted in Python onSeptember 26, 2018

用过食行生鲜的同学应该知道,每天可以在食行生鲜签到,签到可以领到 20 积分,在购物时可以抵 2 毛钱。钱虽少,但是积少成多,买菜时可以抵扣一两块钱还是不错的。

今天我们就用 Python 来实现自动签到,省得我每天打开 APP 来操作了。

分析

要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化。但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了。

不过还好,我们有微信。

在微信里面,我们发现也可以登录食行,这时选择在浏览器中打开页面,~哎~ ,柳暗花明了,我们找到了一个可用的网页地址:wechatx.34580.com

Python 实现「食行生鲜」签到领积分功能

下面的操作就好办了,在电脑端的浏览器打开网址,按下 F12,开始起飞~

登录分析

点击签到后,会跳转到用户登录页面: https://wechatx.34580.com/mart/#/sign/in,输入登录信息后,点击登录,同时关注开发调试栏的网络交互信息 。

Python 实现「食行生鲜」签到领积分功能

可以发现,登录的请求地址是: https://wechatx.34580.com/sz/Sign/SignInV2,并且会在请求时带着登录信息 :

{
  "SourceType": "9",
  "Phone": "18800000000",
  "PassWord": "98a53578bd74e150",
  "ZhuGeDeviceMd5": "164edd53b71674-02922cef4808a-47e1039-e1000-164edd53b7222e",
  "DeviceId": ""
}

现在,还无法确定哪些字段是必填的,哪些是可以不传的。

有一个问题是,密码是经过加密的,我在页面输入的 000000 ,这里变成了 98a53578bd74e150。这里我找了半天是如何加密的,也没有找到,若是有大神有办法,还请留言告知!

不过还好,加密方式是固定的,也就是 000000 一直对应的是 98a53578bd74e150,我们只要记下这个加密后的密码,在登录时,传入后台即可。

登录成功后,请求会响应一些 token 数据:

{
  "Error": 0,
  "Message": "返回正确",
  "Data": {
    "CustomerGuid": "d8cd7c84-xxxx-4369-xxxx-b1e86c027407",
    "Phone": "18800000000",
    "AccessToken": "73c7b5fxxxxxxx"
  }
}

只要 Error 字段为 0,就代表登录成功!

签到分析

登录成功后,页面会自动跳转到首页,我们可以看到签到图标,点击它,进入签到页面:

Python 实现「食行生鲜」签到领积分功能

发现进来还是一个签到按钮,套娃啊!再点它!

终于签到成功!

发现签到的请求: https://wechatx.34580.com/sz/SignUp/CustomerSignUp

Python 实现「食行生鲜」签到领积分功能

签到请求中有两个重要的参数,accesstoken 和 customerguid,这两个参数就是登陆后返回的。

签到请求响应:

{
  "Error": 0,
  "Message": "返回正确",
  "Data": {
    "GetPoints": 5,
    "SumGetPoints": 840
  }
}

返回说这次签到获得了 5 个积分,其实连续签到 4 天后,每天就可以获得 20 积分了!

实现

通过上面的分析,我们的签到流程也很清晰了,首先就是登陆获取 accesstoken 和 customerguid,然后再去签到就可以了!

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 实现「食行生鲜」签到领积分功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python 文件管理实例详解
Nov 10 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
vue常用指令代码实例总结
Mar 16 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
python通过新建环境安装tfx的问题
May 20 Python
Linux下python3.6.1环境配置教程
Sep 26 #Python
简单谈谈python基本数据类型
Sep 26 #Python
浅析Python四种数据类型
Sep 26 #Python
详解将Django部署到Centos7全攻略
Sep 26 #Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 #Python
基于Python3.6+splinter实现自动抢火车票
Sep 25 #Python
Python做智能家居温湿度报警系统
Sep 25 #Python
You might like
用Zend Encode编写开发PHP程序
2006/10/09 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
document.all与WEB标准
2020/05/13 Javascript
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
2012/08/30 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jQuery实现购物车表单自动结算效果实例
2015/08/10 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
计算机应用专业应届毕业生中文求职信范文
2013/11/29 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL