
每天打开掘金点「签到」领矿石,坚持三天就忘?本文带你用 Python + Playwright 从零做一个浏览器自动化签到脚本,覆盖 Cookie 持久化、page.evaluate() 直接调掘金 API、CLI 命令分发等完整流程,复制就能跑,部署到服务器还能每天定时白嫖矿石。
一、技术选型:为什么选 Playwright
市面上掘金签到方案大致三类,各有取舍:
① 纯 API 调用:速度快、无浏览器依赖,但要逆向 a_bogus 签名算法,维护成本高。
② Selenium:生态成熟、社区大,但速度慢、API 较旧、反检测能力弱。
③ Playwright(推荐):速度快、API 现代、内置反检测,代价是要下载浏览器驱动。
最终选 Playwright 的四个硬理由:① page.evaluate() 能在浏览器上下文执行 JS,直接 fetch 调 API,天然携带 Cookie 和签名,彻底规避 a_bogus 逆向;② 支持 channel="chrome" 复用系统已装的 Chrome,不用额外下 Chromium;③ 自动等待比 Selenium 显式等待优雅;④ 跨平台(Windows / macOS / Linux 通用)。
二、项目结构:单文件脚本设计
核心原则:所有逻辑集中在一个 juejin_checkin.py(约 500 行),方便 scp 部署;配置外置到 config.json;日志与 Cookie 分目录存储。先看看这份配置长什么样:
{ "headless": false, "checkin_url": "https://juejin.cn/user/center/signin", "home_url": "https://juejin.cn", "cookie_file": "cookies/juejin_cookies.json", "log_dir": "logs", "test_rounds": 3, "test_interval_seconds": 5, "timeout_ms": 30000}
配置用全局 CONFIG 字典加载,各模块直接读 CONFIG["headless"]、CONFIG["test_rounds"] 等,无需层层传参。
三、Cookie 持久化:登录态的保存与加载
脚本最关键的一环是把登录态存下来——首次手动登录后保存 Cookie,以后直接加载,不用每次都扫码。两个函数搞定:
def save_cookies(context): cookies = context.cookies() with open(COOKIE_PATH, "w", encoding="utf-8") as f: json.dump(cookies, f, ensure_ascii=False, indent=2) log.info(f"Cookie 已保存 -> {COOKIE_PATH} (共 {len(cookies)} 条)") def load_cookies(context): if not COOKIE_PATH.exists(): return False with open(COOKIE_PATH, "r", encoding="utf-8") as f: cookies = json.load(f) context.add_cookies(cookies) log.info(f"已加载 {len(cookies)} 条 Cookie") return True
保存用 context.cookies() 导出全部 Cookie 写盘;加载用 context.add_cookies() 注入。文件不存在就返回 False,触发一次手动登录。
四、核心 trick:page.evaluate + fetch 绕过反爬
掘金的签到接口需要 a_bogus 签名,纯手写 API 很难维护。Playwright 的 page.evaluate() 让代码在真实浏览器里跑,由浏览器自己算好签名,我们只要发一个 fetch 并带上 credentials: "include" 即可:
def api_signin(page): # page.evaluate 在浏览器上下文执行 JS,天然携带 Cookie 与签名参数 # 彻底绕过 a_bogus 逆向 result = page.evaluate("""async () => { const resp = await fetch( 'https://api.juejin.cn/growth_api/v1/check_in?aid=2608&uuid=1', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({}) } ); return await resp.json(); }""") return result def check_login(page): result = page.evaluate("""async () => { const resp = await fetch( 'https://api.juejin.cn/user_api/v1/user/get?aid=2608&uuid=1', { credentials: 'include' } ); return await resp.json(); }""") ok = result.get("err_no") == 0 and result.get("data", {}).get("user_name") return bool(ok)
同样的手法也用于 check_login() 验证登录态——只要 err_no == 0 且返回了 user_name,就说明 Cookie 还有效。这一招把「逆向签名」变成了「让浏览器自己签名」,维护成本直线下降。
五、CLI 主流程:login / checkin / test / status
用 sys.argv 做简单的命令分发,日常只需关心四个动作:
def main(): cmd = sys.argv[1].lower() if cmd == "login": interactive_login() # 首次登录,保存 Cookie elif cmd == "checkin": run_once() # 单次签到 elif cmd == "test": rounds = int(sys.argv[2]) if len(sys.argv) > 2 else None multi_round_test(rounds=rounds) elif cmd == "status": check_cookie_valid() # 检查 Cookie 是否仍有效 elif cmd == "help": print_usage() # 用法# python juejin_checkin.py login # 首次手动登录# python juejin_checkin.py checkin # 日常签到# python juejin_checkin.py test 5 # 多轮测试# python juejin_checkin.py status # 检查登录态
首次 login 走一遍手动扫码,之后 checkin 就能静默签到;配合服务器 crontab 或 GitHub Actions 定时跑 checkin,矿石稳定到手。注意:Cookie 长期有效但也会过期,status 可随时自检。
小结
1. 掘金签到三方案:纯 API(逆向难)/ Selenium(慢)/ Playwright(推荐,内置反检测)。
2. Playwright 四大优势:page.evaluate 免逆向、复用系统 Chrome、自动等待、跨平台。
3. Cookie 持久化:context.cookies() 保存、add_cookies() 加载,登录态一存多用。
4. 核心技巧:page.evaluate + fetch + credentials:include,让浏览器自己算签名绕过 a_bogus。
5. CLI 四动作:login 首次登录、checkin 日常签到、test 多轮测试、status 自检登录态。
以上就是“Python + Playwright 写一个自动签到脚本!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14577/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料