Summary: This script automates daily check-ins for ZOL Forum (bbs.zol.com.cn). It uses Playwright with cookie-based login. Steps: 1. Manually log in once to export cookies. 2. Schedule script to auto-load cookies, access forum, find/click check-in buttons, detect success messages, and save screenshots.
阿里云:
服务器购买地址
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 jsonimport sysimport timeimport argparsefrom datetime import datetimefrom pathlib import Pathfrom playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutBASE_URL = "https://bbs.zol.com.cn/"COOKIE_FILE = Path("zol_bbs_cookies.json")SCREENSHOT_DIR = Path("screenshots_zol")SCREENSHOT_DIR.mkdir(exist_ok=True)# 常见"签到/任务/领奖"入口文案CHECKIN_KEYWORDS = ["签到", "打卡", "每日签到", "立即签到", "去签到","领取", "领奖", "领积分", "积分", "任务", "任务中心","福利", "活动"]SUCCESS_HINTS = ["签到成功", "已签到", "今日已签到", "打卡成功", "领取成功", "已领取", "您已签到"]def now_str():return datetime.now().strftime("%Y-%m-%d %H:%M:%S")def log(msg: str):print(f"[{now_str()}] {msg}")def human_wait(min_s=0.8, max_s=1.6):time.sleep((min_s + max_s) / 2)def screenshot(page, name: str):p = SCREENSHOT_DIR / f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{name}.png"page.screenshot(path=str(p), full_page=True)log(f"📸 已截图:{p.resolve()}")def save_cookies(context, path: Path):cookies = context.cookies()path.write_text(json.dumps(cookies, ensure_ascii=False, indent=2), encoding="utf-8")log(f"✅ Cookie 已保存:{path.resolve()}(共 {len(cookies)} 条)")def load_cookies(context, path: Path):if not path.exists():raise FileNotFoundError(f"未找到 Cookie 文件:{path.resolve()},请先运行 --export 手动登录导出一次")cookies = json.loads(path.read_text(encoding="utf-8"))context.add_cookies(cookies)log(f"✅ Cookie 已加载:{path.resolve()}(共 {len(cookies)} 条)")def ensure_logged_in(page) -> bool:"""ZOL论坛登录态粗判:出现"退出/消息/我的/个人中心"等通常说明已登录"""hints = ["退出", "消息", "我的", "个人中心", "设置", "私信", "通知"]for h in hints:try:if page.get_by_text(h, exact=False).first.is_visible(timeout=1500):return Trueexcept Exception:passreturn Falsedef try_click_by_text(page, text: str, timeout_ms=2500) -> bool:"""根据可见文本尝试点击按钮/链接/文本节点"""candidates = [page.get_by_role("button", name=text),page.get_by_role("link", name=text),page.get_by_text(text, exact=False),]for locator in candidates:try:if locator.first.is_visible(timeout=timeout_ms):locator.first.click(timeout=timeout_ms)return Trueexcept Exception:continuereturn Falsedef detect_success(page) -> bool:"""检测是否出现"已签到/签到成功"等提示"""for sh in SUCCESS_HINTS:try:if page.get_by_text(sh, exact=False).first.is_visible(timeout=1200):log(f"✅ 检测到成功提示:{sh}")return Trueexcept Exception:passreturn Falsedef do_checkin(page, max_rounds=3) -> bool:"""自动签到核心流程:多轮尝试点击"签到/打卡/任务/领取"等入口,并检测成功提示"""for r in range(1, max_rounds + 1):log(f"🔎 第 {r}/{max_rounds} 轮:寻找签到入口…")# 1) 优先按关键词点(命中率高)clicked = Falsefor kw in CHECKIN_KEYWORDS:if try_click_by_text(page, kw):clicked = Truelog(f"👉 已点击入口:{kw}")human_wait(1.0, 1.8)break# 2) 若没点到:扫描页面可见 a/button 文本进行关键词匹配(兜底)if not clicked:log("⚠️ 未直接命中入口,开始扫描可见链接/按钮做关键词匹配…")try:nodes = page.locator("a:visible, button:visible").all()for node in nodes[:350]:try:t = (node.inner_text() or "").strip()if not t:continueif any(k in t for k in CHECKIN_KEYWORDS):node.click()clicked = Truelog(f"👉 扫描命中并点击:{t[:30]}")human_wait(1.0, 1.8)breakexcept Exception:continueexcept Exception as e:log(f"⚠️ 扫描元素异常:{e}")# 3) 检测是否成功if detect_success(page):return True# 4) 有些站点点击后会跳转/弹层,需要多走几轮if clicked:human_wait(1.2, 2.2)else:human_wait(0.8, 1.2)return Falsedef export_cookie_flow(headless: bool):"""手动登录并导出 Cookie"""with sync_playwright() as p:browser = p.chromium.launch(headless=headless)context = browser.new_context()page = context.new_page()log(f"🌐 打开:{BASE_URL}")page.goto(BASE_URL, wait_until="domcontentloaded", timeout=60000)log("请在浏览器中手动完成登录(账号/短信/扫码等),登录完成后回到终端按回车保存 Cookie…")input()if ensure_logged_in(page):log("✅ 检测到登录态,准备保存 Cookie")else:log("⚠️ 未明显检测到登录态,但仍会保存 Cookie(如后续失败请重新导出)")save_cookies(context, COOKIE_FILE)screenshot(page, "export_cookie_done")context.close()browser.close()def auto_checkin_flow(headless: bool) -> int:"""自动签到主流程:加载 Cookie -> 打开首页 -> 尝试签到 -> 成功/失败截图返回码:0 = 成功(或检测到已签到)1 = 未检测到成功提示(可能入口变了/风控/需要验证码)2 = 未登录(Cookie失效)"""with sync_playwright() as p:browser = p.chromium.launch(headless=headless)context = browser.new_context()load_cookies(context, COOKIE_FILE)page = context.new_page()log(f"🌐 进入:{BASE_URL}")page.goto(BASE_URL, wait_until="domcontentloaded", timeout=60000)human_wait(1.0, 2.0)if not ensure_logged_in(page):screenshot(page, "not_logged_in")log("❌ 可能未登录(Cookie 失效或未正确导入)。请重新运行 --export 导出 Cookie")return 2try:ok = do_checkin(page, max_rounds=3)except PWTimeout:log("⚠️ 页面等待超时")ok = Falseexcept Exception as e:log(f"⚠️ 签到过程异常:{e}")ok = Falseif ok:screenshot(page, "checkin_success")log("🎉 自动签到流程执行完成:疑似成功/已签到")return 0else:screenshot(page, "checkin_failed")log("❌ 未检测到成功提示:可能需要更新入口关键词/遇到验证码/风控拦截")return 1def main():parser = argparse.ArgumentParser(description="ZOL论坛(bbs.zol.com.cn)自动签到脚本(Cookie方式)")parser.add_argument("--export", action="store_true", help="手动登录并导出 Cookie")parser.add_argument("--headless", action="store_true", help="无头模式运行(默认有头,方便首次登录)")args = parser.parse_args()if args.export:export_cookie_flow(headless=args.headless)return 0else:return auto_checkin_flow(headless=args.headless)if __name__ == "__main__":sys.exit(main())
该脚本为中关村论坛自动签到脚本,主要作用包括:
首次人工登录一次并导出 Cookie 到
zol_bbs_cookies.json后续定时执行脚本时:自动加载 Cookie → 打开
https://bbs.zol.com.cn/→ 自动寻找并点击"签到/打卡/任务/领取"等入口 → 检测"已签到/签到成功"提示 → 截图留证(成功/失败都截图)
主要方法
export_cookie_flow()→ 打开论坛首页,等待你手动登录,然后导出 Cookie 保存到本地文件。auto_checkin_flow()→ 自动签到总流程:加载 Cookie、访问首页、判断登录态、执行签到、截图并返回退出码。do_checkin()→ 多轮尝试寻找"签到/任务/领取"等入口并点击,然后检测是否出现成功提示。try_click_by_text()→ 按文本定位可点击元素并点击,提高在页面结构变动下的通用性。ensure_logged_in()→ 通过页面常见"我的/消息/退出"等关键词,粗判断是否处于登录状态。detect_success()→ 检测页面是否出现"已签到/签到成功"等结果提示。save_cookies()→ 将当前浏览器上下文的 Cookie 导出保存为 JSON 文件。load_cookies()→ 从 JSON 文件读取 Cookie 并注入浏览器上下文,实现免登录访问。screenshot()→ 成功/失败都截图保存,便于排查入口变化或验证码/风控问题。human_wait()→ 增加固定等待,模拟正常用户操作节奏,降低"点击太快"导致的失败概率。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论