Python爬虫 - 00.实现什么值得买签到

什么值得买是一个不错的hao yang mao网站,通过坚持不断签到就能会得到金币积分等奖励
下面通过Python来实现一个签到的脚本,然后把脚本放到服务器上,让它每天定时执行,这样就可以实现自动签到了

一、分析实现流程

  1. 通过浏览器抓取签到接口
  2. 分析接口的请求参数和响应数据
  3. 编写代码实现

二、通过浏览器抓取签到接口

由于现在张大妈的登录需要验证码,验证码是一个比较复杂的问题,这里就跳过验证码的问题,直接用Cookie进行免登录发送请求

打开 Chrome / Firefox 浏览器访问 什么值得买, 然后登录你的帐号
SMZDM

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模块发送了一个请求。只要把上面的代码替换为你自己的cookieuser-agent运行即可

如果想让这个脚本每天定时运行,可以把这个脚本放到Linux服务器中,用crond 服务设置一个定时任务,让它每天定时运行。如果没有服务器,可以放到手机中运行,装一个termux APP,后面操作就和服务器差不多了,大家有兴趣可以去研究一下,这里就不展开了,我就是这么干的

五、总结

优点:

  • 简单易懂

不足之处:

  • 没有对登录进行处理,不能自动更新cookie,如果cookie过期,这个脚本就会失效
  • 没有做错误处理,如果发生网络错误,服务器错误等导致签到失败,程序不能及时通知用户,没有重复尝试机制
  • 张大妈的APP签到和网页签到好像是两个不同的接口,网页端签到完成,APP不显示已签到,后期可以发掘一下
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值