Script automates sign-in for bbs.voc.com.cn using a cookie. It detects plugins (dsu_paulsign/k_misign), extracts formhash, and posts sign-in requests. Requires server setup (Alibaba/Tencent/Huawei Cloud) and Qinglong Panel for scheduling.
阿里云:
服务器购买地址
https://t.aliyun.com/U/kcPAeY若失效,可用地址
https://www.aliyun.com/daily-act/ecs/activity_selection?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.代码如下
# -*- coding: utf-8 -*-import osimport reimport timeimport randomimport requestsfrom bs4 import BeautifulSoupBASE_URL = "https://bbs.voc.com.cn/"TIMEOUT = 20def build_session(cookie: str) -> requests.Session:"""创建带默认头的会话"""s = requests.Session()s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Referer": BASE_URL,})# 直接塞 Cookie(最通用)s.headers["Cookie"] = cookie.strip()return sdef http_get(session: requests.Session, url: str) -> str:"""GET 请求并返回文本"""r = session.get(url, timeout=TIMEOUT, allow_redirects=True)r.raise_for_status()# 有些站点编码不标准,给个兜底r.encoding = r.apparent_encoding or "utf-8"return r.textdef http_post(session: requests.Session, url: str, data: dict) -> str:"""POST 请求并返回文本"""r = session.post(url, data=data, timeout=TIMEOUT, allow_redirects=True)r.raise_for_status()r.encoding = r.apparent_encoding or "utf-8"return r.textdef extract_formhash(html: str) -> str:"""从页面中提取 Discuz 的 formhash"""# 常见:name="formhash" value="xxxx"m = re.search(r'name="formhash"\s+value="([^"]+)"', html)if m:return m.group(1)# 兼容:formhash=xxxxm = re.search(r"formhash=([0-9a-zA-Z]+)", html)if m:return m.group(1)return ""def detect_sign_plugin(html: str) -> str:"""检测常见签到插件类型:dsu_paulsign / k_misign"""# dsu_paulsign 常见入口if "dsu_paulsign:sign" in html:return "dsu_paulsign"# k_misign 常见入口if "k_misign:sign" in html:return "k_misign"# 兜底:页面里出现"签到"且带 plugin.php?id=xxx:signif re.search(r"plugin\.php\?id=[^\"']+:sign", html):return "unknown_sign_plugin"return ""def find_sign_entry_url(html: str) -> str:"""在页面中尝试找签到入口链接"""soup = BeautifulSoup(html, "html.parser")for a in soup.find_all("a", href=True):text = (a.get_text() or "").strip()href = a["href"]# 关键词:签到 / 打卡 / 签到领奖励(尽量宽松)if any(k in text for k in ["签到", "打卡", "每日签到", "签到领奖励"]):if "plugin.php?id=" in href or "sign" in href:return href# 正则兜底:找 plugin.php?id=xxx:signm = re.search(r'(plugin\.php\?id=[^"\']+:sign[^"\']*)', html)if m:return m.group(1)return ""def normalize_url(href: str) -> str:"""把相对链接变成绝对链接"""href = href.strip()if href.startswith("http://") or href.startswith("https://"):return hrefif href.startswith("/"):return BASE_URL.rstrip("/") + hrefreturn BASE_URL + hrefdef sign_by_dsu_paulsign(session: requests.Session, formhash: str) -> str:"""走 dsu_paulsign 插件签到常见流程:1) GET plugin.php?id=dsu_paulsign:sign 取页面 & 可能需要 formhash2) POST plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1..."""sign_page = normalize_url("plugin.php?id=dsu_paulsign:sign")html = http_get(session, sign_page)# 有些站点 formhash 需要从签到页再取一次fh = extract_formhash(html) or formhashif not fh:return "❌ 未获取到 formhash,无法执行 dsu_paulsign 签到"# qdxq / qdmode / todaysay 等字段在不同站点可能不同,这里给通用可跑值# 一般只要 formhash + qdmode + todaysay 就能成功post_url = normalize_url("plugin.php?id=dsu_paulsign:sign&operation=qiandao&inajax=1")payload = {"formhash": fh,"qdmode": "1", # 1 通常是"开心"之类"qdxq": "kx", # 心情枚举(不同站点可不同)"todaysay": "签到", # 签到留言"fastreply": "0",}resp = http_post(session, post_url, payload)# 结果判断(尽量宽松)if any(k in resp for k in ["签到成功", "已签到", "已经签到", "success", "恭喜"]):return "✅ dsu_paulsign:签到成功/已签到"return f"⚠️ dsu_paulsign:返回未知结果(可查看响应片段):{resp[:200]}"def sign_by_k_misign(session: requests.Session, formhash: str) -> str:"""走 k_misign 插件签到常见流程:GET plugin.php?id=k_misign:sign&operation=qiandao&formhash=xxx&inajax=1"""if not formhash:# 尝试先打开 k_misign 页面拿 formhashsign_home = normalize_url("plugin.php?id=k_misign:sign")html = http_get(session, sign_home)formhash = extract_formhash(html)if not formhash:return "❌ 未获取到 formhash,无法执行 k_misign 签到"url = normalize_url(f"plugin.php?id=k_misign:sign&operation=qiandao&formhash={formhash}&inajax=1")resp = http_get(session, url)if any(k in resp for k in ["签到成功", "已签到", "已经签到", "success", "恭喜"]):return "✅ k_misign:签到成功/已签到"return f"⚠️ k_misign:返回未知结果(可查看响应片段):{resp[:200]}"def run_sign() -> None:"""主流程:检查登录态 -> 获取 formhash -> 自动识别插件并签到"""cookie = os.getenv("VOC_COOKIE", "").strip()if not cookie:print("❌ 缺少环境变量 VOC_COOKIE(请填登录后的 Cookie)")returnsession = build_session(cookie)# 1) 先访问首页,判断登录态 + 拿 formhash + 找签到入口home_html = http_get(session, BASE_URL)# 粗略判断是否登录:很多 Discuz 登录后会出现 "退出/设置/消息/提醒/我的"if not any(k in home_html for k in ["退出", "设置", "消息", "提醒", "我的", "uid="]):print("⚠️ 可能未登录或 Cookie 无效(仍会尝试签到,但大概率失败)")formhash = extract_formhash(home_html)entry = find_sign_entry_url(home_html)plugin = detect_sign_plugin(home_html)if entry:entry_url = normalize_url(entry)# 入口页可能更容易拿到 formhash / 插件信息try:entry_html = http_get(session, entry_url)formhash = extract_formhash(entry_html) or formhashplugin = detect_sign_plugin(entry_html) or pluginexcept Exception:passprint(f"🔎 检测结果:plugin={plugin or '未知'},formhash={'已获取' if formhash else '未获取'}")# 2) 按检测结果尝试签到(按优先级)# 随机短等待,稍微"像人"time.sleep(random.uniform(1.0, 2.2))results = []if plugin == "dsu_paulsign":results.append(sign_by_dsu_paulsign(session, formhash))elif plugin == "k_misign":results.append(sign_by_k_misign(session, formhash))else:# 未识别:两种都试一下,成功一个就算results.append(sign_by_dsu_paulsign(session, formhash))time.sleep(random.uniform(0.8, 1.6))results.append(sign_by_k_misign(session, formhash))print("====== 签到结果 ======")for r in results:print(r)if __name__ == "__main__":run_sign()
该脚本为华声论坛任务脚本,主要功能包括:
从环境变量读取 Cookie,以已登录态模拟用户访问
bbs.voc.com.cn自动抓取
formhash(Discuz 常见的 CSRF 校验参数)自动识别并适配常见签到插件(
dsu_paulsign/k_misign)执行签到请求并输出结果(成功 / 已签到 / 失败原因片段)
主要方法
build_session → 创建带默认请求头与 Cookie 的
requests.Session会话,复用连接并保持登录态http_get → 封装 GET 请求并返回页面文本,自动处理编码与跳转
http_post → 封装 POST 请求并返回页面文本,自动处理编码与跳转
extract_formhash → 从 HTML 中提取 Discuz 的
formhash,用于通过 CSRF 校验detect_sign_plugin → 在页面中识别签到插件类型(
dsu_paulsign/k_misign/ 未知)find_sign_entry_url → 从页面里查找"签到/打卡"等入口链接,拿到更准确的签到页
normalize_url → 把相对链接补全为可直接请求的绝对 URL
sign_by_dsu_paulsign → 按
dsu_paulsign插件的常见交互(先取页再提交表单)完成签到sign_by_k_misign → 按
k_misign插件的常见交互(带formhash的签到请求)完成签到run_sign → 主流程:检查 Cookie → 获取 formhash → 自动识别插件 → 执行签到并打印结果
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论