作为一名吧友,日常水贴赚经验是必不可少的,同样每天签到水经验也是基操了,为了能快速签到,度娘也是贴心地提供了一键签到的功能,每天上去点一下即可。虽然这个功能很贴心,但是还是要人为操作一下,如果哪天断签了,经验又要重新开始算,所以我打算写一 Python 签到脚本,然后放服务器中每天定时执行一下,实现全自动化签到。

一、分析

贴吧签到有两种方法实现,一是一个吧一个吧地签到,费时费力,二是一键签到,这个不错。一键签到有个限制,每天的0点到1点不能使用的,只能在其他时间段使用,如果想在这个时间段签到,只能一个一个来。当然最简单的操作就是把定时任务设置在1点钟后。

所以,先实现一键签到的功能,后续再实现逐一签到的功能,步骤如下:

  1. 提取接口
  2. 分析接口的请求头,请求参数及响应数据
  3. 编码
  4. 设置定时任务

二、提取接口

打开浏览器,访问 tieba.baidu.com ,登录贴吧
F12打开开发者工具,选择网络标签,先清空一下,排除干扰项
在页面中找到一键签到的按钮,如图


点击一键签到,弹出如下窗口


点击开始签到,注意观察开发者工具网络标签的变化,啪~ 啪~几下就出现了下面几个请求


后面几个是请求图片文件的,明显不是我们想要的,只有第一个请求,响应类型是json,请求的路径也很明显了,onekeySignin1,所以这个就是目标请求接口了,下面开始分析这个接口的请求数据

三、分析接口

接口
https://tieba.baidu.com/tbmall/onekeySignin1
请求报文

通过开发者工具得到请求报文如下:

POST /tbmall/onekeySignin1 HTTP/1.1
Host: tieba.baidu.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
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 39
Origin: https://tieba.baidu.com
DNT: 1
Connection: keep-alive
Referer: https://tieba.baidu.com/
Cookie: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Pragma: no-cache
Cache-Control: no-cache

这个请求也没有什么特别的,只要保证几个关键请求头信息即可,如CookieUser-AgentReferer这几个常用的反爬的字段

请求参数

请求参数如下:

ie: "utf-8"
tbs: "ba1c01bc6543721c1xxxxxxxxxx"

这里两个参数,第一个是编码,第二个不知道是啥,这是个关键点。

对于这种不明参数,一般都是两种情况,第一是页面或者JS文件中的隐藏数据,第二种就是通过JS动态生成的加密数据,通常都是先去页面中找,如果能找到那就好办了,如果找不到再去分析JS。

先从页面中找,在开发者工具中点击查看器(Elements),按 Ctrl + F 输入参数名称 tbs 按回车,出来两个结果,第一个是一个空值,按回车选择下一个,发现新大陆,这个参数跟上面的有点像,不,不能说有一点像,简直就是一模一样,这样我们就拿到了tbs这个参数

响应结果

响应正确结果如下:

{"no": 0,"error": "","data": {// 响应数据// ......}
}

响应结果肯定有很多种,这里不可能一一列举,而且有一些是很难遇到的,这里只要保证每天第一次签到结果的状态码(no0)和提示不是报错就行,这里列举一两个响应提示

用户已经完成签到的情况

{"no": 2280006,"error": "forums is signed","data": {"signedForumAmount": 1,"signedForumAmountFail": 0,"unsignedForumAmount": 0,"vipExtraSignedForumAmount": 0,"forum_list": null,"gradeNoVip": 999,"gradeVip": 999,"lowlev_presign": 1}
}

用户没有登录的情况

{"no": 1990055,"error": "用户没有实名认证","data": ""
}

四、编码

下面开始编码,分以下几个步骤:

  1. 发送请求下载HTML页面
  2. 从HTML中提取tbs参数
  3. 发送请求进行一键签到
  4. 判断响应结果是否正确,打印消息
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
'''
实现百度贴吧一键签到
API:
一键签到 POST https://tieba.baidu.com/tbmall/onekeySignin1注意事项:
1、百度贴吧0点到1点是不能够使用一键签到的
'''
__author__ = "Conca"import requests
import re
from lxml import etree
import time
from datetime import datetime
import os
import jsonheaders = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0","Referer": "https://tieba.baidu.com/","Cookie": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # 替换为你的cookie
}# 获取页面参数 tbs
def getTbs():try:tbs = ""url = "https://tieba.baidu.com/"# 发送请求,下载贴吧HTML页面response = requests.get(url, headers=headers)response.raise_for_status()response.encoding = response.apparent_encodinghtml = response.text# 用正则表达示从HTML中提取参数 tbs 的值,# 正则表达式学得不太好,用得有点呆板,凑合用match = re.search(r'PageData.tbs = "(.*)";PageData.is_iPad', html)if match:tbs = match.group(0).split('"')[1]return tbsexcept:print("获取参数tbs失败")return None# 一键签到
def tiebaOnekeySignin():    tbs = getTbs()# 获取参数tbs失败则退出签到if not tbs:print("获取参数tbs失败,签到失败")returnurl = "https://tieba.baidu.com/tbmall/onekeySignin1"data = {"ie": "utf-8","tbs": tbs}try:# 发送请求进行签到response = requests.post(url, data=data, headers=headers)response.raise_for_status()response.encoding = response.apparent_encoding# 分析响应结果 content = response.json()code = content.get("no")# 打印提示if code == 0:print("贴吧一键签到成功")elif code == 2280006:print("全部吧都已经签过了")else:print("一键签到失败,请重试")except Exception as e:print("一键签到发生错误:", e)def main():print("-----------百度贴吧开始签到-------------")print("正在执行一键签到……")tiebaOnekeySignin()print("-----------百度贴吧签到结束-------------")if __name__ == "__main__":main()

只要把你的cookie替换上面的xxxxx运行即可,有些参数可以自定义,如User-Agent

五、设置定时任务

下面简单介绍一下,放到服务器中让脚本自动运行的操作,以Ubuntu为例子。
前提是服务器中安装了Python环境,相关的库

Cron服务常用命令

这里有个小坑,Ubuntu的服务是cron不是crondCentOScrond

用以下命令启动和停止cron服务:

$ service cron start
$ service cron stop
$ service cron restart
$ service cron reload

查看当前用户的crontab

$ crontab -l

编辑crontab

$ crontab -e

删除crontab

$ crontab -r

查看crontab运行状态

$ service cron status

详细教程:Linux crontab 命令

定时任务

下面开始编辑任务

$ crontab -e

输入

1 1 * * * python3 /home/yourname/tieba_signin.py

意思是每天的凌晨01点01分执行命令python3 /home/yourname/tieba_signin.py

Ctrl+O保存, Ctrl+X 退出就可以了

六、总结

这个脚本虽然简单的实现了一键签到,但还是有很多问题没有考虑进去,比如一键签到是有很多限制的,如7级以下的吧不能签到,一次只能50个,如果关注了超过50个,还有7级以下的吧,那么这个脚本就不太灵了,所以后续要进行逐一签到,把这些坑都填上

Python爬虫 - 01.实现贴吧一键签到相关推荐

  1. 写博客没高质量配图?python爬虫教你绕过限制一键搜索下载图虫创意图片!

    目录 前言 分析 理想状态 爬虫实现 其他注意 效果与总结 @(文章目录) 前言 在我们写文章(博客.公众号.自媒体)的时候,常常觉得自己的文章有些老土,这很大程度是因为配图没有选好. 笔者也是遇到相 ...

  2. 用Python爬虫的request方式实现自动签到

    人生苦短,快学Python! 大家好,我是朱小五.之前我曾经写过一个Python改变生活系列的文章,介绍自己如何使用Python解决了各种各样的日常需求.在这其中有一篇文章<Python改变生活 ...

  3. python爬虫微信e校园签到,用Python爬虫的request方式实现自动签到!

    使用selenium实现自动签到确实是一个方便快捷的方式,但不可否认的是这种方式确实有一个硬伤,就是太慢了,模拟浏览器进行加载.点击操作,即使用上显性等待这种高端操作也最多只能把整个运行过程优化到5秒 ...

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

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

  5. Python爬虫01——第一个小爬虫

    原文:https://www.cnblogs.com/Axi8/p/5757270.html Python小爬虫--贴吧图片的爬取 在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写. ...

  6. Python爬虫01—请求模块

    请求模块 一.基本概念 1.请求方法 1.1 GET 1.2 POST 2.Refer 3.状态码 二.获取图片 1.requests模块 2.request模块 三.获取网页源码 urllib.re ...

  7. 生成的头_Python爬虫偷懒神器!快速一键生成Python爬虫请求头

    今天介绍个神奇的网站!堪称爬虫偷懒的神器! 我们在写爬虫,构建网络请求的时候,不可避免地要添加请求头( headers ),以 mdn 学习区为例,我们的请求头是这样的: 一般来说,我们只要添加 us ...

  8. python免费教学视频400集-如何入门 Python 爬虫?400集免费教程视频带你从0-1全面掌握...

    学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础: ...

  9. python爬虫日记01

    PYTHON爬虫日记01 记录自己的学习爬虫日记 选用python作为编程语言 1.环境准备 python3.6+ mysql pycharm 2.思路 以爬取猫眼top100为目标 ​ 1.分析ur ...

  10. python实现微博超话一键签到点赞评论

    用python实现微博超话一键签到点赞评论 不管电影拍得怎么样,<诛仙>这本书一直是我心中的经典,而书中碧瑶一直是我最喜欢的小说人物,最近发现了她竟然有属于自己的超话,心血来潮,决定弄一个 ...

最新文章

  1. 【Qt】在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效的解决方法
  2. 黑白球JAVA_桶中取黑白球 - jiacut的个人页面 - OSCHINA - 中文开源技术交流社区
  3. 【Linux 线程】常用线程函数复习《一》
  4. Csharp关键字----delegate(委托)
  5. __VA_ARGS__宏
  6. 自我引用(Self reference)
  7. bzoj5090[lydsy11月赛]组题
  8. linux gcc编译下的文件读写操作
  9. TreeMap源码解析
  10. mysql 设置 0、1 用什么数据类型_MySQL数据库教程-数据表字段约束
  11. RVC使用指南(一)-基本配置
  12. Java线程中断的理解(转载)
  13. 牛津词典 2018 年度词汇 ——「有毒」!
  14. 电脑投屏电视怎么设置_夏普电视怎么投屏?投屏功能在哪?
  15. CMakeLists.txt 介绍
  16. 汽车系统英文缩写大全,值得收藏
  17. 去除MacBook屏幕下方的白条
  18. office产品处于非活动状态——word无法修改
  19. 排版设计常用术语和常识
  20. 首款鸿蒙手机,华为首款鸿蒙手机入网:不是P50系列

热门文章

  1. NATS 分布式消息队列系统
  2. 音频知识之OGG格式分析
  3. 《上海悠悠接口自动化平台》-1.新增API 与 各参数的描述
  4. pycharm连接github
  5. Honor V10 BKL-AL20 ROOT(Magisk方式)
  6. 【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?
  7. 【分享】外卖优惠券怎么弄微信返利公众号系统的流程和方法
  8. matlab数组从小到大排序,matlab数组排序
  9. java复制文件乱码_为什么用JAVA写的一个复制文本文档的程序复制出来文本文档乱码...
  10. java面试基础篇--hashMap中如何解决hash冲突