Content Summary: This Python script automates the Xilu forum daily check-in task via Playwright. It saves login state for reuse, locates the check-in post, and automatically posts a reply. Execution is visible by default (headless=False). For testing purposes only.
阿里云:
服务器购买地址
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 reimport timefrom pathlib import Pathfrom playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutErrorclass XiLuForumSigner:STATE_PATH = Path("xilu_storage_state.json")SIGN_THREAD_URL = "https://club.xilu.com/web/msgview-11025-1549419.html"def __init__(self, headless: bool = False, slow_mo_ms: int = 50):self.headless = headlessself.slow_mo_ms = slow_mo_ms@staticmethoddef _looks_logged_in(page) -> bool:"""粗判断登录态:页面出现"退出/注销/欢迎您/我的"等字样(论坛样式可能老旧,尽量宽松判断)"""html = page.content()return any(k in html for k in ["退出", "注销", "欢迎", "我的", "个人中心", "消息"])def ensure_login(self, page, context) -> None:"""打开论坛页 -> 如果未登录,提示你手动登录 -> 保存登录态"""page.goto(self.SIGN_THREAD_URL, wait_until="domcontentloaded")page.wait_for_timeout(1200)if self._looks_logged_in(page):print("[login] 看起来已登录(将直接进入签到流程)。")returnprint("[login] 可能尚未登录。请在打开的浏览器里手动登录西陆论坛。")print(" 登录完成后回到终端按回车继续(首次仅需一次,后续自动复用登录态)。")input(" >>> 按回车继续...")context.storage_state(path=str(self.STATE_PATH))print(f"[login] 登录态已保存:{self.STATE_PATH.resolve()}")def reply_checkin(self, page, message: str) -> bool:"""在签到帖页面尝试回帖:- 先找"回复/发表/提交"相关输入框- 填入 message- 点击提交"""page.goto(self.SIGN_THREAD_URL, wait_until="domcontentloaded")page.wait_for_timeout(1500)# 1) 尝试定位 textarea(不同论坛模板名称不一)textarea_candidates = [page.locator("textarea"),page.locator("textarea[name='content']"),page.locator("textarea[name='message']"),page.locator("textarea[name='msg']"),]textarea = Nonefor t in textarea_candidates:try:if t.first.is_visible(timeout=1200):textarea = t.firstbreakexcept Exception:continueif not textarea:print("[reply] 未找到回帖输入框(可能需要进入"回复页",或该帖禁止回复)。")return Falsetextarea.click()textarea.fill(message)page.wait_for_timeout(500)# 2) 尝试点击"提交/发表/回复"按钮btn_keywords = ["发表", "提交", "回复", "发言", "发布", "确定"]clicked = Falsefor kw in btn_keywords:for locator in [page.get_by_role("button", name=re.compile(kw)),page.get_by_role("link", name=re.compile(kw)),page.locator(f"text={kw}"),page.locator(f"input[value*='{kw}']"),]:try:if locator.first.is_visible(timeout=1200):locator.first.click(timeout=3000)clicked = Truebreakexcept Exception:continueif clicked:breakif not clicked:print("[reply] 找到输入框但没找到"提交/发表/回复"按钮。可能需要滚动到底部或是按钮是图片/JS。")return False# 3) 等待提交结果page.wait_for_timeout(2000)html = page.content()if any(k in html for k in ["发表成功", "回复成功", "发布成功", "已发表", "已回复"]):print("[reply] 页面提示疑似回帖成功。")return Trueprint("[reply] 已点击提交,但未识别到明确成功提示;建议你肉眼确认是否已回帖。")return True # 保守:点击已执行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, context)msg = f"签到打卡~ {time.strftime('%Y-%m-%d %H:%M:%S')}"ok = self.reply_checkin(page, msg)context.storage_state(path=str(self.STATE_PATH))print("[done] 结束。结果:", "已尝试回帖签到" if ok else "未完成")except PWTimeoutError as e:print("[error] 页面等待超时:", e)finally:context.close()browser.close()if __name__ == "__main__":# 可视化运行更稳:能看到是否成功回帖XiLuForumSigner(headless=False, slow_mo_ms=50).run()
该脚本为西陆论坛自动签到脚本,主要作用包括:
复用登录态:首次你手动登录一次后保存
xilu_storage_state.json,后续脚本自动带着登录态打开论坛页面。自动"签到":西陆论坛常见的"签到"是进签到帖回帖打卡(比如各种"xx日签到帖")。
可视化执行:默认
headless=False,你能直接看到是否已经回帖成功。
主要方法
ensure_login(page, context)
打开签到帖 → 判断是否已登录 → 未登录则让你手动登录一次 → 保存登录态文件。reply_checkin(page, message)
打开签到帖 → 找到回帖输入框(textarea)→ 填入签到文案 → 点击"发表/提交/回复" → 尝试判断是否成功。run()
串联流程:加载/保存登录态 → 登录 → 回帖签到 → 退出。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论