1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/DT4XYh若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/DT4XYh
若失效,可用地址
https://www.aliyun.com/activity/wuying/dj?source=5176.29345612&userCode=49hts92d
腾讯云:
https://curl.qcloud.com/wJpWmSfU
若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console
华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905
2.部署教程
3.代码如下
from DrissionPage import ChromiumOptions, ChromiumPage
import json
import os
import shutil
import time
import requests
def read_cookie():
"""读取 cookie,优先从环境变量读取"""
if "TIEBA_COOKIES" in os.environ:
return json.loads(os.environ["TIEBA_COOKIES"])
else:
print("贴吧Cookie未配置!详细请参考教程!")
return []
def get_level_exp(page):
"""获取等级和经验,如果找不到返回'未知'"""
try:
level_ele = page.ele('xpath://*[@id="pagelet_aside/pagelet/my_tieba"]/div/div[1]/div[3]/div[1]/a/div[2]').text
level = level_ele if level_ele else "未知"
except:
level = "未知"
try:
exp_ele = page.ele('xpath://*[@id="pagelet_aside/pagelet/my_tieba"]/div/div[1]/div[3]/div[2]/a/div[2]/span[1]').text
exp = exp_ele if exp_ele else "未知"
except:
exp = "未知"
return level, exp
if __name__ == "__main__":
print("程序开始运行")
# 通知信息
notice = ''
co = ChromiumOptions().headless()
chromium_path = shutil.which("chromium-browser")
if chromium_path:
co.set_browser_path(chromium_path)
page = ChromiumPage(co)
url = "https://tieba.baidu.com/"
page.get(url)
page.set.cookies(read_cookie())
page.refresh()
page._wait_loaded(15)
over = False
yeshu = 0
count = 0
while not over:
yeshu += 1
page.get(f"https://tieba.baidu.com/i/i/forum?&pn={yeshu}")
page._wait_loaded(15)
for i in range(2, 22):
element = page.ele(
f'xpath://*[@id="like_pagelet"]/div[1]/div[1]/table/tbody/tr[{i}]/td[1]/a/@href'
)
try:
tieba_url = element.attr("href")
name = element.attr("title")
except:
msg = f"全部爬取完成!本次总共签到 {count} 个吧..."
print(msg)
notice += msg + '\n\n'
page.close()
over = True
break
page.get(tieba_url)
page.wait.eles_loaded('xpath://*[@id="signstar_wrapper"]/a/span[1]',timeout=30)
# 判断是否签到
is_sign_ele = page.ele('xpath://*[@id="signstar_wrapper"]/a/span[1]')
is_sign = is_sign_ele.text if is_sign_ele else ""
if is_sign.startswith("连续"):
level, exp = get_level_exp(page)
msg = f"{name}吧:已签到过!等级:{level},经验:{exp}"
print(msg)
notice += msg + '\n\n'
print("-------------------------------------------------")
else:
page.wait.eles_loaded('xpath://a[@class="j_signbtn sign_btn_bright j_cansign"]',timeout=30)
sign_ele = page.ele('xpath://a[@class="j_signbtn sign_btn_bright j_cansign"]')
if sign_ele:
sign_ele.click()
time.sleep(1) # 等待签到动作完成
sign_ele.click()
time.sleep(1) # 等待签到动作完成
page.refresh()
page._wait_loaded(15)
level, exp = get_level_exp(page)
msg = f"{name}吧:成功!等级:{level},经验:{exp}"
print(msg)
notice += msg + '\n\n'
print("-------------------------------------------------")
else:
msg = f"错误!{name}吧:找不到签到按钮,可能页面结构变了"
print(msg)
notice += msg + '\n\n'
print("-------------------------------------------------")
count += 1
page.back()
page._wait_loaded(10)
if "SendKey" in os.environ:
api = f'https://sc.ftqq.com/{os.environ["SendKey"]}.send'
title = u"贴吧签到信息"
data = {
"text":title,
"desp":notice
}
try:
req = requests.post(api, data=data, timeout=60)
if req.status_code == 200:
print("Server酱通知发送成功")
else:
print(f"通知失败,状态码:{req.status_code}")
print(api)
except Exception as e:
print(f"通知发送异常:{e}")
else:
print("未配置Server酱服务...")
解析
该脚本为百度贴吧自动签到脚本,主要作用为:
使用 DrissionPage(Chromium 无头浏览器) 搭配 贴吧 Cookie,自动批量给你关注的所有贴吧签到。
对每个贴吧读取是否已签、等级与经验,汇总成一段文本。
如配置了 Server酱 SendKey,会把签到结果推送通知到你微信。
主要方法
read_cookie()
作用:读取贴吧登录 Cookie。优先从环境变量
TIEBA_COOKIES
(JSON 格式)获取;未配置则给出提示并返回空列表。用途:用于后续浏览器会话注入登录态。
get_level_exp(page)
作用:在当前贴吧页面抓取等级与经验信息。
实现:通过固定 XPath 定位等级与经验元素;找不到时返回"未知"。
用途:签到前后用于展示账号在该吧的等级/经验。
__main__
主流程(脚本整体逻辑)若设置了环境变量
SendKey
,调用 Server酱 API 发送标题"贴吧签到信息"和正文notice
;否则打印"未配置 Server酱服务…"。进入每个吧主页后等待关键元素加载:
无论已签/新签,都会调用
get_level_exp(page)
获取等级、经验,打印并拼接到notice
文本。结束后返回上一页继续下一个吧。
#signstar_wrapper
下的状态文本(判断是否已签)。若 未签到:查找"可签到"按钮(类名
j_signbtn sign_btn_bright j_cansign
),点击两次(带 1 秒间隔),再刷新页面确认。若 已签到:状态文本一般以"连续"开头("连续签到 X 天")。
访问
https://tieba.baidu.com/i/i/forum?&pn={页码}
,逐行(第 2 行到第 21 行)解析关注吧列表的名称与链接。无更多数据时结束循环,并输出"本次总共签到 X 个吧"。
创建
ChromiumOptions().headless()
无头模式;如果能找到本机chromium-browser
路径则显式设置。用
ChromiumPage
打开https://tieba.baidu.com/
,写入read_cookie()
返回的 Cookie 并刷新,确保已登录。浏览器初始化
分页遍历关注的贴吧
逐个贴吧签到
结果通知(可选)
关键点与细节
登录态:完全依赖
TIEBA_COOKIES
注入的 Cookie,未登录或过期会导致无法签到。选择器:大量使用 XPath 精确定位(签到按钮、状态文本、等级/经验元素、关注列表表格定位)。页面结构变动会导致元素找不到。
等待机制:
page._wait_loaded(15)
等待页面加载完成(最多 15 秒)。page.wait.eles_loaded(..., timeout=30)
等待目标元素出现,保证点击/读取前页面已就绪。稳定性处理:
签到按钮点击后再次点击并刷新页面,提升成功率与回显准确性。
抓不到元素时会记录"可能页面结构变了"的提示。
统计输出:
count
记录已处理的吧数量;结束时输出"本次总共签到 X 个吧"。每个吧打印分隔线,便于日志阅读。
需要的环境变量
TIEBA_COOKIES
:必需。JSON 数组格式的 Cookie(DrissionPage 可直接注入的 cookie 列表)。SendKey
:可选。配置后使用 Server酱推送签到汇总到微信。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
【相关文章】
没有评论:
发表评论