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读写文件操作示例程序
Dec 02 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python实现各进制转换的总结大全
Jun 18 Python
python绘制条形图方法代码详解
Dec 19 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Python分支语句与循环语句应用实例分析
May 07 Python
Python 继承,重写,super()调用父类方法操作示例
Sep 29 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
Python中bisect的用法及示例详解
Jul 20 Python
golang/python实现归并排序实例代码
Aug 30 Python
Python logging自定义字段输出及打印颜色
Nov 30 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
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
jQuery 1.0.2
2006/10/11 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
Bootstrap笔记之缩略图、警告框实例详解
2017/03/09 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
实例详解Node.js 函数
2018/06/10 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
Python调用C/C++的方法解析
2020/08/05 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
Java面试题及答案
2012/09/08 面试题
2014年科协工作总结
2014/12/09 职场文书
幼儿园元旦主持词
2015/07/06 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
Python制作表白爱心合集
2022/01/22 Python
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL