什么值得买是一个不错的hao yang mao网站,通过坚持不断签到就能会得到金币积分等奖励
下面通过Python来实现一个签到的脚本,然后把脚本放到服务器上,让它每天定时执行,这样就可以实现自动签到了
一、分析实现流程
- 通过浏览器抓取签到接口
- 分析接口的请求参数和响应数据
- 编写代码实现
二、通过浏览器抓取签到接口
由于现在张大妈的登录需要验证码,验证码是一个比较复杂的问题,这里就跳过验证码的问题,直接用Cookie进行免登录发送请求
打开 Chrome / Firefox 浏览器访问 什么值得买, 然后登录你的帐号
按F12
,点击网络(network)标签,点击页面的签到按钮,看到如下的请求,就是我们需要的签到接口了
三、分析接口的请求参数和响应数据
接口地址:https://zhiyou.smzdm.com/user/checkin/jsonp_checkin?callback=jQuery112402949185715359607_1631598321047&_=1631598321058
请求的报文如下:
GET /user/checkin/jsonp_checkin?callback=jQuery112402949185715359607_1631598321047&_=1631598321058 HTTP/1.1
Host: zhiyou.smzdm.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Referer: https://www.smzdm.com/
Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Sec-Fetch-Dest: script
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-site
Pragma: no-cache
Cache-Control: no-cache
正确请求响应如下:
jQuery112402949185715359607_1631598321047({"error_code":0,"error_msg":"","data":{"add_point":xxx,"checkin_num":"xx","point":xx,"exp":xx,"gold":xx,"prestige":xx,"rank":xx,"slogan":"<div class=\"signIn_data\">\u4eca\u65e5\u5df2\u9886<span class=\"red\">0<\/span>\u79ef\u5206<\/div>","cards":"85","can_contract":0,"continue_checkin_days":4,"continue_checkin_reward_show":false}})
错误响应如下:
jQuery112402949185715359607_1631598321047({"error_code":9999,"error_msg":"","data":[]})
从上面的请求和响应可以看出,该接口需要两个请求参数,一个是callback回调函数名称,一个是时间戳,响应的是JSONP数据,这就好办了,学过JSONP的原理就会知道,回调函数名称可以随便写,时间戳通过time
模块获取一下,至于响应数据,我们只要拿到中间的JSON数据解析即可,一切就绪,下面开始编程实现
四、编程实现
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Desc: 本脚本用于smzdm签到
API:
GET https://zhiyou.smzdm.com/user/checkin/jsonp_checkin?callback=jQuery1124017478852004010437_1631422603307&_=1631422603315
'''
__author__ = 'Conca'
import requests
import time
import json
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0",
"Referer": "https://www.smzdm.com/",
"Cookie": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # 替换为你的cookie
}
# 签到
def smzdm_sign_in():
try:
url = "https://zhiyou.smzdm.com/user/checkin/jsonp_checkin"
params = {
"callback": "myCalback",
"_": int(time.time()*1000)
}
# 发送一个get请求
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
response.encoding = response.apparent_encoding
# 由于返回的是JSONP数据,所以不能用response.json()来解析
content = response.text
# 截取JSONP中的JSON数据
data = json.loads(content[content.find("{"):content.rfind(")")])
if data.get("error_code") == 0:
print("张大妈签到成功!!!总签到天数:", data.get("data").get("checkin_num"))
else:
print("签到失败,原因:", data.get("error_msg"))
except Exception as e:
print("张大妈签到出现错误;", e)
def main():
print("-------------------张大妈签到开始-------------------")
smzdm_sign_in()
print("-------------------张大妈签到结束-------------------")
if __name__ == "__main__":
main()
代码非常简单,只是用requests
模块发送了一个请求。只要把上面的代码替换为你自己的cookie
和user-agent
运行即可
如果想让这个脚本每天定时运行,可以把这个脚本放到Linux服务器中,用crond
服务设置一个定时任务,让它每天定时运行。如果没有服务器,可以放到手机中运行,装一个termux
APP,后面操作就和服务器差不多了,大家有兴趣可以去研究一下,这里就不展开了,我就是这么干的
五、总结
优点:
- 简单易懂
不足之处:
- 没有对登录进行处理,不能自动更新cookie,如果cookie过期,这个脚本就会失效
- 没有做错误处理,如果发生网络错误,服务器错误等导致签到失败,程序不能及时通知用户,没有重复尝试机制
- 张大妈的APP签到和网页签到好像是两个不同的接口,网页端签到完成,APP不显示已签到,后期可以发掘一下