Summary: This Python script automates forum login and daily check-in for HuaSheng Forum using requests. It handles session management, formhash extraction, and simulates user interactions to sign in via common Discuz plugins like dsu_paulsign.
阿里云:
服务器购买地址
https://t.aliyun.com/U/G61mcO若失效,可用地址
https://www.aliyun.com/benefit?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=2019052.部署教程
3.代码如下
import reimport timeimport randomimport requestsclass VocBbsSigner:BASE = "https://bbs.voc.com.cn"TIMEOUT = 20def __init__(self, username: str, password: str):self.username = usernameself.password = passwordself.s = requests.Session()self.s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/120.0 Safari/537.36","Referer": f"{self.BASE}/",})# ---------- 基础请求 ----------def _get(self, url: str, **kwargs) -> requests.Response:return self.s.get(url, timeout=self.TIMEOUT, allow_redirects=True, **kwargs)def _post(self, url: str, data: dict, **kwargs) -> requests.Response:return self.s.post(url, data=data, timeout=self.TIMEOUT, allow_redirects=True, **kwargs)@staticmethoddef _sleep(a=0.8, b=1.8):time.sleep(random.uniform(a, b))@staticmethoddef _pick(html: str, patterns: list[str], default: str = "") -> str:for p in patterns:m = re.search(p, html, re.I | re.S)if m:return m.group(1)return default# ---------- 核心流程 ----------def login(self) -> bool:"""登录(通用 Discuz 方式):1) 打开登录页,提取 formhash/loginhash2) POST 提交 username/password3) 用 cookie/页面关键字判断是否登录成功"""login_page = self._get(f"{self.BASE}/member.php?mod=logging&action=login")html = login_page.textloginhash = self._pick(html, [r'loginhash=([a-zA-Z0-9]+)',r'name="loginhash"\s+value="([^"]+)"',])formhash = self._pick(html, [r'name="formhash"\s+value="([^"]+)"',r'formhash=([a-zA-Z0-9]+)',])if not formhash:# 兜底:从首页尝试再提取idx = self._get(f"{self.BASE}/").textformhash = self._pick(idx, [r'name="formhash"\s+value="([^"]+)"',r'formhash=([a-zA-Z0-9]+)',])if not formhash:print("[login] 未获取到 formhash:可能不是 Discuz/页面结构不同/触发风控。")return Falseself._sleep()post_url = f"{self.BASE}/member.php?mod=logging&action=login&loginsubmit=yes"if loginhash:post_url += f"&loginhash={loginhash}"payload = {"formhash": formhash,"referer": f"{self.BASE}/","username": self.username,"password": self.password,"questionid": "0","answer": "","cookietime": "2592000",}resp = self._post(post_url, data=payload)txt = resp.textck = self.s.cookies.get_dict()# Discuz 常见登录 cookieif any(k.lower() in ("discuz_uid", "uid", "auth") for k in ck.keys()):print("[login] cookie 显示已登录。")return Trueif any(k in txt for k in ["退出", "欢迎您回来", "您已登录"]):print("[login] 页面显示已登录。")return Trueif any(k in txt for k in ["验证码", "安全验证", "滑块", "人机验证"]):print("[login] 可能触发验证码/安全验证:建议改用 Playwright 登录一次后复用登录态。")else:print("[login] 登录失败:可能账号密码错误或站点登录机制不同。")return Falsedef sign_try_dsu_paulsign(self) -> bool:"""尝试 Discuz 常见签到插件:dsu_paulsign常见入口:1) plugin.php?id=dsu_paulsign:sign2) plugin.php?id=dsu_paulsign:sign&operation=qiandao这里采取:- 先 GET 入口抓 formhash- 再 POST 提交签到"""entry_urls = [f"{self.BASE}/plugin.php?id=dsu_paulsign:sign",f"{self.BASE}/plugin.php?id=dsu_paulsign:sign&operation=qiandao",]for entry in entry_urls:try:self._sleep()page = self._get(entry)html = page.text# 未安装插件/无权限/跳登录if any(k in html for k in ["您需要先登录", "登录", "未定义操作", "插件不存在", "抱歉"]):# 继续尝试下一个入口continueformhash = self._pick(html, [r'name="formhash"\s+value="([^"]+)"',r'formhash=([a-zA-Z0-9]+)',])if not formhash:# 也可能直接就是"已签到"页if any(k in html for k in ["已签到", "今日已签", "签到成功"]):print("[sign] 页面显示已签到/已成功。入口:", entry)return Truecontinue# 常见提交地址(不同站点会有差异,这里用最常见规则)post_url = f"{self.BASE}/plugin.php?id=dsu_paulsign:sign&operation=qiandao&inajax=1"payload = {"formhash": formhash,# 下面字段在不同站点可能不同/可选:"qdxq": "kx", # 心情:开心(kx) 常见值"qdmode": "1", # 签到模式"todaysay": "签到打卡~", # 签到内容"fastreply": "0",}self._sleep()r = self._post(post_url, data=payload, headers={"Referer": entry})txt = r.textif any(k in txt for k in ["成功", "已签到", "签到成功", "succeed", "success"]):print("[sign] 签到成功/已签到。")return Trueif any(k in txt for k in ["需要先登录", "权限", "抱歉", "间隔", "灌水"]):print("[sign] 被拒绝:可能未登录/无权限/频率限制。返回片段:")print(txt[:200])return Falseexcept Exception as e:print("[sign] 尝试入口异常:", entry, e)print("[sign] 未命中 dsu_paulsign 签到入口。可能:1) 论坛不是 Discuz;2) 签到插件不同;3) 签到在 App/任务中心。")return Falsedef run(self):if not self.login():returnok = self.sign_try_dsu_paulsign()print("[done]", "已尝试签到" if ok else "未完成签到")if __name__ == "__main__":USERNAME = "你的用户名"PASSWORD = "你的密码"VocBbsSigner(USERNAME, PASSWORD).run()
该脚本为华声论坛自动签到脚本,主要作用包括:
模拟网页登录并保持会话:用
requests.Session()保存 cookie,实现后续"签到请求"带登录态。自动签到:尝试访问论坛常见的签到插件入口(
dsu_paulsign),抓取formhash并提交签到表单。输出关键日志:登录失败/验证码/无权限/未找到入口都会明确提示,方便你进一步定位实际签到页。
主要方法
login()打开登录页提取隐藏字段(如
formhash/loginhash)提交账号密码
用 cookie/页面关键字判断是否登录成功
如果触发验证码/安全验证,会提示改用浏览器自动化
sign_try_dsu_paulsign()依次尝试常见签到插件入口 URL
若页面可用则提取
formhash并 POST 提交签到根据返回内容判断"成功/已签到/无权限/未登录/被限流"
run()串联主流程:登录成功才执行签到
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论