当前位置: 首页 > news >正文

Python:百度贴吧实现自动化签到

早知道,还是python。

Github项目仓库在这。

相关API

签到+贴吧列表

签到分为两个接口,PC端签到一次经验+2,而移动端签到则是一次经验+6。该用哪个接口已经很明显了。不过这里还是列出PC端的签到API。

# PC端签到接口
# sign_url = "https://tieba.baidu.com/sign/add"# 移动端签到接口
# sign_url = "https://c.tieba.baidu.com/c/c/forum/sign"

贴吧列表如果是通过“爱逛的吧”去获取,很明显不全。所以我是通过爬取“关注的吧”页面来获取贴吧列表的。

https://tieba.baidu.com/i/i/forum?&pn=1
https://tieba.baidu.com/i/i/forum?&pn=2
...

 

实现思路

获取列表+发起签到请求

获取列表前,需要BDUSS+STOKEN拿到tbs。在发帖和签到的时候payload里头都会包含这个tbs,没有就发不出去,估计是用户标识符一类的东西。

tbs_url = "https://tieba.baidu.com/dc/common/tbs"
response = json.loads(requests.get(tbs_url, cookies={"BDUSS": BDUSS, "STOKEN": STOKEN}).text)
login_state = response["is_login"]
if login_state == 1:logger.debug("登录成功")
else:logger.debug(login_state)raise Exception("登录失败")
return response["tbs"], BDUSS, STOKEN

获取贴吧列表比较简单粗暴,Cookies带上BDUSS和STOKEN,再用get方法获取页面的html,再用正则表达式去拿出贴吧名和对应的贴吧链接。

<tr><td><a href="/f?kw=%C9%EE%DB%DA%BC%BC%CA%F5%B4%F3%D1%A7" title="深圳技术大学">深圳技术大学</a></td><td><a class="cur_exp" target="_blank"href="/f/like/level?kw=%C9%EE%DB%DA%BC%BC%CA%F5%B4%F3%D1%A7&lv_t=lv_nav_intro">17788</a></td><td><a style="display:block;" class="like_badge badge_lv3_1" title="13级会员" target="_blank"href="/f/like/level?kw=%C9%EE%DB%DA%BC%BC%CA%F5%B4%F3%D1%A7&lv_t=lv_nav_intro"><div class="like_badge_title">内牛满面</div><div class="like_badge_lv">13</div></a></td><td><spanonclick="ForumManager.undo_like(this.getAttribute('balvid'), this.getAttribute('balvname'), this.getAttribute('tbs'))"balvid="23311541" balvname="%C9%EE%DB%DA%BC%BC%CA%F5%B4%F3%D1%A7" tbs="a527b042d6559d351726813316"><imgclass="pt" src='//tb1.bdstatic.com/tb/static-member/img/close.gif' /></span></td>
</tr>

不过用PC端的“关注的吧”接口除了bduss之外,还必须得带上stoken才能拿到数据。拿到的贴吧列表存不存到本地,看个人需求。我是选择全部存到本地json。

# 从百度贴吧获取关注的贴吧列表
# 结果保存到tieba_dict.json文件中
def get_tieba_dict():tieba_dict = {}_, BDUSS, STOKEN = get_cookies()Cookies = {"BDUSS": BDUSS,"STOKEN": STOKEN,}page = 1tieba_sum = 0while True:mylike_url = "https://tieba.baidu.com/f/like/mylike?&pn=" + str(page)try:response = requests.get(mylike_url, cookies=Cookies)except Exception as e:raise Exception("请求失败:" + str(e))data = extract_data(response.text)if data == []:breakfor i in data:tieba_name = re.search(r"<a.*?>(.*?)</a>", i).group(1)tieba_url = prefix + re.search(r"href=\"(.*?)\"", i).group(1)if tieba_name is not None:tieba_sum += 1tieba_dict[tieba_name] = tieba_urlpage += 1with open("tieba_dict.json", "w", encoding="utf-8") as f:json.dump(tieba_dict, f, ensure_ascii=False)

发起签到请求分为两部分,payload需要带上贴吧名和tbs标识。如果用的移动端签到接口还需要带上它们md5加密后的十六进制结果。我调这接口的时候一直报“未知错误”,后面参考了其他repo才发现要带上这么个参数。

sign_str = f"kw={tieba_name}tbs={tbs}tiebaclient!!!"
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest()
payload = {"kw": tieba_name,"tbs": tbs,"sign": sign,
}

Cookies只需要bduss,stoken只有在获取贴吧列表时才用得到。

Cookies = {"BDUSS": BDUSS,
}
resp = requests.post(sign_url,cookies=Cookies,data=payload,
)

如果签到成功,返回的json会包含user_info。失败的话直接就是error_code,可以在这做个校验。比如GTA5吧,女权吧这种被关闭的吧,如果直接调接口签到,就会在这报错。

    if "user_info" in resp.json():logger.debug("签到成功:" + tieba_name + "吧")return Trueelif resp.json()["error_code"] == "160002":# 已签到logger.error("签到失败:" + tieba_name + "吧" + " 失败原因:" + resp.json()["error_msg"])else:logger.error("签到失败:" + tieba_name + "吧")logger.debug(str(resp.json()))logger.error("失败原因:" + resp.json()["error_msg"]

目前不知道签到过快会怎么样,总之我加了1~5秒的随机。貌似PC端才会检测签到过快,有时候我一个小时内连续签到98个贴吧就会触发机制,导致当天内的其他在PC端上签到,都需要带上captcha验证码。移动端签到不受影响。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 人工智能课程实训方案
  • Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook
  • html+css(如何用css做出京东页面,静态版)
  • Directives Vue3 自定义指令
  • 由于安全风险,安全领导者考虑禁止人工智能编码
  • 【html】基础(一)
  • SQLServer数据分页
  • 关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误
  • 快速理解TCP协议(一)——TCP协议深度解析
  • Ubuntu20.04 搜索不到任何蓝牙设备
  • 微软宣布弃用面向企业的WSUS更新服务 仍然保留该服务但不再添加任何新功能
  • 50页PPT麦肯锡精益运营转型五步法
  • Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示
  • 只装了WPS,DOC文档无法打开
  • 第二章 SpringBoot环境下yml和properties的几种玩法
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【面试系列】之二:关于js原型
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • co模块的前端实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • JavaScript中的对象个人分享
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • java中具有继承关系的类及其对象初始化顺序
  • 第2章 网络文档
  • 机器学习学习笔记一
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 1.Ext JS 建立web开发工程
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​第20课 在Android Native开发中加入新的C++类
  • ​学习一下,什么是预包装食品?​
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #define 用法
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #知识分享#笔记#学习方法
  • (33)STM32——485实验笔记
  • (C语言)逆序输出字符串
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (七)Activiti-modeler中文支持
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)三元表达式和列表解析
  • (四)linux文件内容查看
  • (转) Face-Resources
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .net Application的目录
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 服务 ServiceController
  • .NET 中的轻量级线程安全
  • .Net(C#)自定义WinForm控件之小结篇
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘