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 24 Python
Python中if __name__ == "__main__"详细解释
Oct 21 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Django中提示消息messages的设置方式
Nov 15 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
使用python如何删除同一文件夹下相似的图片
May 07 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入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
utf8的编码算法 转载
2006/12/27 Javascript
js调用flash的效果代码
2008/04/26 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python中的字典使用分享
2016/07/31 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
Python笔试面试题小结
2019/09/07 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
波兰最早的运动鞋精品店之一:Street Supply
2019/08/29 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
公积金单位接收函
2014/01/11 职场文书
质量承诺书怎么写
2014/05/24 职场文书
踏青活动策划方案
2014/08/19 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
停课通知书
2015/04/24 职场文书
小学生读书笔记范文
2015/06/30 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
小学思品教学反思
2016/02/20 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang