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.
阿里云:
服务器购买地址
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 osimport reimport timefrom pathlib import Pathfrom playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutErrorclass 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 = headlessself.slow_mo_ms = slow_mo_ms@staticmethoddef _looks_like_logged_in(page) -> bool:"""粗判断是否登录:页面上出现"退出/个人中心/我的"等字样通常代表已登录。"""text = page.content()return any(k in text for k in ["退出", "个人中心", "我的", "账号", "消息", "设置"])@staticmethoddef _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 Trueexcept Exception:continuereturn Falsedef 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 Trueif ok:print("[checkin] 已执行点击动作,但未在页面中识别到明确成功提示。建议手动看下页面是否已签到。")return Trueprint("[checkin] 未找到"签到/打卡/领积分"按钮或入口,可能签到在 App/小程序/隐藏任务页。")return Falsedef 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()
该脚本为同花顺签到脚本,主要作用包括:
自动打开同花顺官网并完成登录态复用:首次手动登录一次后,脚本把登录态保存到
ths_storage_state.json,以后每天运行无需重复输入账号密码。自动点击"签到/打卡":用"关键词点击"方式适配页面改版。
可视化运行:默认
headless=False,你能肉眼看到有没有"已签到/签到成功"。
主要方法
ensure_login(page)打开首页 → 判断是否已登录
未登录则引导你在浏览器里手动完成登录(合法方式)
保存登录态到
ths_storage_state.jsondo_checkin(page)先尝试进入"个人中心/我的/任务/福利/积分"
再在页面内搜索并点击"签到/打卡/去签到/立即签到/领积分"等按钮
尝试从页面文案判断"已签到/签到成功"
run()串起流程:加载/保存登录态 → 登录 → 签到 → 退出
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。