2026年2月15日星期日

HuaSheng Forum Auto Check-in Script Analysis

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.

1.购买服务器

阿里云:

服务器购买地址

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=201905

2.部署教程

2024年最新青龙面板跑脚本教程(一)持续更新中

3.代码如下

import reimport timeimport randomimport requests

class VocBbsSigner:

    BASE = "https://bbs.voc.com.cn"    TIMEOUT = 20
    def __init__(self, username: str, password: str):        self.username = username        self.password = password
        self.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)
    @staticmethod    def _sleep(a=0.8, b=1.8):        time.sleep(random.uniform(a, b))
    @staticmethod    def _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/loginhash        2) POST 提交 username/password        3) 用 cookie/页面关键字判断是否登录成功        """        login_page = self._get(f"{self.BASE}/member.php?mod=logging&action=login")        html = login_page.text
        loginhash = 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}/").text            formhash = self._pick(idx, [                r'name="formhash"\s+value="([^"]+)"',                r'formhash=([a-zA-Z0-9]+)',            ])
        if not formhash:            print("[login] 未获取到 formhash:可能不是 Discuz/页面结构不同/触发风控。")            return False
        self._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.text        ck = self.s.cookies.get_dict()
        # Discuz 常见登录 cookie        if any(k.lower() in ("discuz_uid""uid""auth"for k in ck.keys()):            print("[login] cookie 显示已登录。")            return True
        if any(k in txt for k in ["退出""欢迎您回来""您已登录"]):            print("[login] 页面显示已登录。")            return True
        if any(k in txt for k in ["验证码""安全验证""滑块""人机验证"]):            print("[login] 可能触发验证码/安全验证:建议改用 Playwright 登录一次后复用登录态。")        else:            print("[login] 登录失败:可能账号密码错误或站点登录机制不同。")
        return False
    def sign_try_dsu_paulsign(self) -> bool:        """        尝试 Discuz 常见签到插件:dsu_paulsign        常见入口:          1) plugin.php?id=dsu_paulsign:sign          2) 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 ["您需要先登录""登录""未定义操作""插件不存在""抱歉"]):                    # 继续尝试下一个入口                    continue
                formhash = 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 True                    continue
                # 常见提交地址(不同站点会有差异,这里用最常见规则)                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.text
                if any(k in txt for k in ["成功""已签到""签到成功""succeed""success"]):                    print("[sign] 签到成功/已签到。")                    return True
                if any(k in txt for k in ["需要先登录""权限""抱歉""间隔""灌水"]):                    print("[sign] 被拒绝:可能未登录/无权限/频率限制。返回片段:")                    print(txt[:200])                    return False
            except Exception as e:                print("[sign] 尝试入口异常:", entry, e)
        print("[sign] 未命中 dsu_paulsign 签到入口。可能:1) 论坛不是 Discuz;2) 签到插件不同;3) 签到在 App/任务中心。")        return False
    def run(self):        if not self.login():            return        ok = self.sign_try_dsu_paulsign()        print("[done]""已尝试签到" if ok else "未完成签到")

if __name__ == "__main__":    USERNAME = "你的用户名"    PASSWORD = "你的密码"
    VocBbsSigner(USERNAME, PASSWORD).run()
解析

该脚本为华声论坛自动签到脚本,主要作用包括:

  1. 模拟网页登录并保持会话:用 requests.Session() 保存 cookie,实现后续"签到请求"带登录态。

  2. 自动签到:尝试访问论坛常见的签到插件入口(dsu_paulsign),抓取 formhash 并提交签到表单。

  3. 输出关键日志登录失败/验证码/无权限/未找到入口都会明确提示,方便你进一步定位实际签到页。

主要方法

  • login()

    • 打开登录页提取隐藏字段(如 formhash / loginhash

    • 提交账号密码

    • 用 cookie/页面关键字判断是否登录成功

    • 如果触发验证码/安全验证,会提示改用浏览器自动化

  • sign_try_dsu_paulsign()

    • 依次尝试常见签到插件入口 URL

    • 若页面可用则提取 formhash 并 POST 提交签到

    • 根据返回内容判断"成功/已签到/无权限/未登录/被限流"

  • run()

    • 串联主流程:登录成功才执行签到


注意

本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。


历史脚本txt文件获取>>
服务器搭建,人工服务咨询>>

没有评论:

发表评论

2026小红书营销新策略:自营KOS+KOC矩阵破局增长

2026年小红书营销需转变思维,从流量对抗转向内容深耕。通过自营KOS(关键意见专家)结合政策合规推广,以及KOC(关键意见消费者)矩阵实现口碑传播,形成稳定内容矩阵。此方式能提升流量精准度与转化率,已被多个头部团队验证有效,适用于高客单价赛道及电商带货。 这几天放假,看到好...