2026年2月8日星期日

Tonghuashun Auto Check-in Script Guide

Summary: This script automates daily check-ins on Tonghuashun's website. It uses Playwright for browser automation, saves login state for reuse, and clicks check-in buttons via keyword matching. First run requires manual login.

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 osimport reimport timefrom pathlib import Path
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutError

class THSSigner:    """    - 采用 Playwright 真实浏览器,适配 JS 渲染 & 登录跳转    - 首次手动登录保存 storage_state,后续复用免登录    - 自动在页面中查找"签到/打卡/福利/任务/领积分"等按钮并点击    """
    HOME = "https://www.10jqka.com.cn/"    STATE_PATH = Path("ths_storage_state.json")
    def __init__(self, headless: bool = False, slow_mo_ms: int = 0):        self.headless = headless        self.slow_mo_ms = slow_mo_ms
    @staticmethod    def _looks_like_logged_in(page) -> bool:        """粗判断是否登录:页面上出现"退出/个人中心/我的"等字样通常代表已登录。"""        text = page.content()        return any(k in text for k in ["退出""个人中心""我的""账号""消息""设置"])
    @staticmethod    def _smart_click_by_text(page, keywords, timeout_ms=3000) -> bool:        """        在当前页面里尝试点击包含关键词的元素(按钮/链接)。        找到就点一个最匹配的,成功返回 True。        """        for kw in keywords:            # 优先找可见的按钮/链接            locators = [                page.get_by_role("button", name=re.compile(kw)),                page.get_by_role("link", name=re.compile(kw)),                page.locator(f"text={kw}"),            ]            for loc in locators:                try:                    if loc.first.is_visible(timeout=timeout_ms):                        loc.first.click(timeout=timeout_ms)                        return True                except Exception:                    continue        return False
    def ensure_login(self, page) -> None:        """        1) 打开首页        2) 若已有 storage_state 则尝试直接识别为已登录        3) 若未登录:点击"登录"入口 -> 让用户手动完成登录 -> 保存 storage_state        """        page.goto(self.HOME, wait_until="domcontentloaded")        page.wait_for_timeout(800)
        if self._looks_like_logged_in(page):            print("[login] 看起来已登录(可能已有有效登录态)。")            return
        # 尝试点击首页"登录"        clicked = self._smart_click_by_text(page, keywords=["登录""立即登录""账号登录"])        if clicked:            page.wait_for_timeout(1200)
        print("[login] 请在打开的浏览器里手动完成登录(若出现验证码/滑块请正常验证)。")        input("      登录完成后,回到终端按回车继续...")
        # 登录完成后保存状态        page.context.storage_state(path=str(self.STATE_PATH))        print(f"[login] 登录态已保存:{self.STATE_PATH.resolve()}")
    def do_checkin(self, page) -> bool:        """        核心"签到"动作:        - 进入可能的入口:个人中心/我的/任务/福利        - 在页面内寻找"签到/打卡/领积分/去签到/立即签到"等按钮并点击        """        # 先尽量去"个人中心/我的"        self._smart_click_by_text(page, keywords=["个人中心""我的""账号""头像""用户中心""会员中心"])        page.wait_for_timeout(1200)
        # 有些站点签到在"任务/福利/积分"        self._smart_click_by_text(page, keywords=["任务""福利""积分""活动中心""签到""打卡"])        page.wait_for_timeout(1200)
        # 最终:在当前页面找"签到/打卡"并点击        ok = self._smart_click_by_text(            page,            keywords=["立即签到""去签到""签到""打卡""领取""领积分""已签到"],            timeout_ms=4000,        )        page.wait_for_timeout(1200)
        # 结果判断(尽量通用):出现"已签到/签到成功/领取成功"等        html = page.content()        if any(k in html for k in ["已签到""签到成功""领取成功""签到完成""今日已签到"]):            print("[checkin] 页面显示疑似签到成功/已签到。")            return True
        if ok:            print("[checkin] 已执行点击动作,但未在页面中识别到明确成功提示。建议手动看下页面是否已签到。")            return True
        print("[checkin] 未找到"签到/打卡/领积分"按钮或入口,可能签到在 App/小程序/隐藏任务页。")        return False
    def run(self) -> None:        with sync_playwright() as p:            browser = p.chromium.launch(headless=self.headless, slow_mo=self.slow_mo_ms)            context = browser.new_context(                storage_state=str(self.STATE_PATH) if self.STATE_PATH.exists() else None            )            page = context.new_page()
            try:                # 确保登录态                self.ensure_login(page)
                # 做签到                success = self.do_checkin(page)
                # 保存最新状态(避免 token 刷新丢失)                context.storage_state(path=str(self.STATE_PATH))
                if success:                    print("[done] 流程结束(已尝试签到)。")                else:                    print("[done] 流程结束(未完成签到)。")
            except PWTimeoutError as e:                print("[error] 页面等待超时:", e)            finally:                context.close()                browser.close()

if __name__ == "__main__":    # headless=False:可视化浏览器,便于你看到是否已签到    THSSigner(headless=False, slow_mo_ms=50).run()
解析

该脚本为同花顺签到脚本,主要作用包括:

  1. 自动打开同花顺官网并完成登录态复用:首次手动登录一次后,脚本把登录态保存到 ths_storage_state.json,以后每天运行无需重复输入账号密码。 

  2. 自动点击"签到/打卡":用"关键词点击"方式适配页面改版。

  3. 可视化运行默认 headless=False,你能肉眼看到有没有"已签到/签到成功"。

主要方法

  • ensure_login(page)

    • 打开首页 → 判断是否已登录

    • 未登录则引导你在浏览器里手动完成登录(合法方式)

    • 保存登录态到 ths_storage_state.json

  • do_checkin(page)

    • 先尝试进入"个人中心/我的/任务/福利/积分"

    • 再在页面内搜索并点击"签到/打卡/去签到/立即签到/领积分"等按钮

    • 尝试从页面文案判断"已签到/签到成功"

  • run()

    • 串起流程:加载/保存登录态 → 登录 → 签到 → 退出


注意

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


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

没有评论:

发表评论

Tonghuashun Auto Check-in Script Guide

Summary: This script automates daily check-ins on Tonghuashun's website. It uses Playwright for browser automation, saves login state fo...