1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/55RK8C若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/55RK8C若失效,可用地址
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 osimport timefrom datetime import datetimefrom pathlib import Pathfrom playwright.sync_api import sync_playwright, TimeoutError as PWTimeoutErrorHOME_URL = "https://jimeng.jianying.com/ai-tool/home"# 登录态目录(保存 Cookie / LocalStorage 等)STATE_DIR = Path(os.getenv("JIMENG_STATE_DIR", "./jimeng_state"))STATE_DIR.mkdir(parents=True, exist_ok=True)# 截图目录SHOT_DIR = Path(os.getenv("JIMENG_SHOT_DIR", "./screenshots"))SHOT_DIR.mkdir(parents=True, exist_ok=True)# 是否无头HEADLESS = os.getenv("JIMENG_HEADLESS", "false").strip().lower() in ("1", "true", "yes", "on")# 首次是否强制等待你手动登录WAIT_LOGIN = os.getenv("JIMENG_WAIT_LOGIN", "true").strip().lower() in ("1", "true", "yes", "on")# 最多尝试找"签到按钮"的次数(有些页面加载慢)MAX_TRY = int(os.getenv("JIMENG_MAX_TRY", "5"))def now_str():return datetime.now().strftime("%Y-%m-%d %H:%M:%S")def save_screenshot(page, name_prefix="jimeng"):fp = SHOT_DIR / f"{name_prefix}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png"page.screenshot(path=str(fp), full_page=True)return str(fp)def wait_user_login(page):"""用于首次登录:给你时间手动完成登录(扫码/手机号等)脚本通过观察页面上是否出现"头像/个人入口/已登录特征"来判断(尽量通用)"""print("🔐 请在打开的浏览器里完成登录(扫码/手机号等均可)")print(" 完成后脚本会自动继续(或你也可以直接回车继续尝试)")# 这里用"轮询 + 常见登录态特征"判断;如果站点改版,最多就是多等一会start = time.time()while time.time() - start < 300: # 最多等 5 分钟try:# 常见:右上角头像、个人中心入口、或者页面出现"资产/画布"等需要登录的功能可用if page.get_by_text("资产").count() > 0 and page.get_by_text("画布").count() > 0:# 不代表一定登录,但通常首页导航存在,继续检查头像/用户入口更稳pass# 尝试找"登录/注册"按钮:如果还存在通常代表没登录if page.get_by_text("登录").count() > 0:time.sleep(2)continue# 尝试找"退出登录/个人中心"等if page.get_by_text("退出").count() > 0 or page.get_by_text("个人").count() > 0:print("✅ 检测到疑似已登录状态")return True# 有些站点头像是按钮/图标,不一定能直接文字识别# 我们退而求其次:如果页面没出现"登录",也认为可能已登录if page.get_by_text("登录").count() == 0:print("✅ 未发现"登录"入口,视为已登录(或已进入登录态页面)")return Trueexcept Exception:passtime.sleep(2)print("⚠️ 等待登录超时(仍会继续尝试执行签到,但大概率会失败)")return Falsedef goto_activity(page):"""进入"活动"页面:- 首页顶栏一般有"活动"入口,直接点击- 如果找不到就尝试滚动/刷新后再找"""page.goto(HOME_URL, wait_until="domcontentloaded")page.wait_for_timeout(1500)# 多次尝试点击"活动"for _ in range(3):try:if page.get_by_text("活动").first.is_visible():page.get_by_text("活动").first.click(timeout=3000)page.wait_for_timeout(2000)return Trueexcept Exception:passpage.reload(wait_until="domcontentloaded")page.wait_for_timeout(1500)return Falsedef click_checkin(page):"""核心签到逻辑:在活动页找"签到/每日签到/立即签到/去签到"等按钮并点击采用"多关键词 + 多轮重试",尽量适配页面文案变化"""keywords = ["每日签到", "立即签到", "去签到", "签到", "领取", "领积分", "领奖励"]for attempt in range(1, MAX_TRY + 1):print(f"🔎 第 {attempt}/{MAX_TRY} 次尝试查找签到入口...")# 尝试滚动触发懒加载try:page.mouse.wheel(0, 900)page.wait_for_timeout(800)except Exception:pass# 逐个关键词找按钮/可点击元素for kw in keywords:try:locator = page.get_by_text(kw).firstif locator.count() > 0 and locator.is_visible():locator.click(timeout=3000)page.wait_for_timeout(2000)return True, f"点击到入口:{kw}"except Exception:continue# 可能需要刷新一下try:page.reload(wait_until="domcontentloaded")page.wait_for_timeout(1500)except Exception:passreturn False, "未找到可点击的签到入口(可能未登录/页面改版/活动入口变化)"def main():print(f"🚀 即梦每日签到脚本启动:{now_str()}")print(f" headless={HEADLESS} state_dir={STATE_DIR.resolve()}")with sync_playwright() as p:browser = p.chromium.launch(headless=HEADLESS)context = browser.new_context(locale="zh-CN",viewport={"width": 1440, "height": 900},user_agent=("Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/122.0.0.0 Safari/537.36"),# 关键:复用登录态storage_state=None,)# 使用持久化上下文:更稳(包含 cookies + localStorage)# Playwright 的 persistent context 需要 launch_persistent_contextbrowser.close()with sync_playwright() as p:context = p.chromium.launch_persistent_context(user_data_dir=str(STATE_DIR),headless=HEADLESS,locale="zh-CN",viewport={"width": 1440, "height": 900},)page = context.new_page()try:page.goto(HOME_URL, wait_until="domcontentloaded")page.wait_for_timeout(1500)# 首次需要人工登录if WAIT_LOGIN and not HEADLESS:wait_user_login(page)ok = goto_activity(page)if not ok:shot = save_screenshot(page, "activity_not_found")print(f"❌ 未能进入活动页,已截图:{shot}")return 1success, msg = click_checkin(page)shot = save_screenshot(page, "checkin_result")if success:print(f"✅ 签到流程执行完成:{msg}")print(f"📸 截图:{shot}")return 0else:print(f"❌ 签到失败:{msg}")print(f"📸 截图:{shot}")return 2except PWTimeoutError as e:shot = save_screenshot(page, "timeout_error")print(f"❌ 页面操作超时:{e}")print(f"📸 截图:{shot}")return 3except Exception as e:shot = save_screenshot(page, "runtime_error")print(f"❌ 程序异常:{e}")print(f"📸 截图:{shot}")return 4finally:try:context.close()except Exception:passif __name__ == "__main__":raise SystemExit(main())
该脚本为即梦签到任务脚本,主要作用是:
每天自动进入即梦网站的"活动"页面,找到签到入口并完成点击签到,从而领取每日奖励/积分(如果站点提供)。
同时为了适配"需要登录的网站",它采用了持久化登录态方式:
第一次你手动登录一次
后面脚本就复用本地浏览器的
user_data_dir(保存 cookie/localStorage)来实现自动签到
主要方法
wait_user_login(page)作用:首次运行时给你时间在浏览器里手动完成登录
逻辑:轮询页面特征(是否还出现"登录"按钮、是否出现个人/退出等特征)判断"疑似已登录"
goto_activity(page)作用:从首页进入**"活动"页**
逻辑:打开首页 → 查找并点击"活动"入口 → 若找不到则刷新重试
click_checkin(page)作用:在活动页执行"签到"
逻辑:用多个关键词(每日签到/立即签到/去签到/签到/领取…)循环查找可点击元素;页面慢就滚动、刷新、多轮重试
save_screenshot(page, prefix)作用:无论成功失败都截图,方便你排查"没找到活动/没找到签到/未登录/页面改版"等问题
main()作用:整体流程编排
流程:启动浏览器(持久化上下文)→ 首页 →(可选等待手动登录)→ 活动页 → 找签到并点击 → 截图并输出结果码
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论