// ==UserScript== // @name 库库AI 连签助手 // @name:zh-CN 库库AI 连签助手 // @namespace https://github.com/Walvez/kuku-ai-signin // @version 1.0.0 // @description 打开库库AI网页即自动完成每日连签:自动打开连签活动页并点击「立即签到」,当天签到后不再打扰。 // @author Walvez // @match https://kuku.baidu.com/* // @match https://kukuai.cn/* // @grant GM_getValue // @grant GM_setValue // @grant GM_notification // @grant GM_openInTab // @grant GM_log // @storageName kuku_ai_signin // @run-at document-idle // @tag 库库AI // @tag 自动签到 // @tag 连签 // @license MIT // ==/UserScript== (function () { 'use strict'; var ACT_URL = 'https://kuku.baidu.com/operation/activitys/kukuPcSignAct/main'; var AUTO_MARK = '#kuku-auto=1'; var IS_ACT = /\/operation\/activitys\/kukuPcSignAct\//.test(location.pathname) && /kuku\.baidu\.com$/i.test(location.hostname); function pad(n) { return String(n).padStart(2, '0'); } var DAY = (function () { var d = new Date(); return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); })(); function sleep(ms) { return new Promise(function (r) { setTimeout(r, ms); }); } function g(k, d) { try { return GM_getValue(k, d); } catch (e) { return d; } } function s(k, v) { try { GM_setValue(k, v); } catch (e) {} } function log(m) { try { if (typeof GM_log === 'function') GM_log('[kuku] ' + m); } catch (e) {} } function notify(m) { try { if (typeof GM_notification === 'function') GM_notification({ title: '库库AI 连签', text: m, timeout: 5000 }); } catch (e) {} } function markDone(m) { s('doneDay', DAY); s('lastMessage', m); log(m); notify(m); } function btnEl() { return document.querySelector('button.pc-sign-btn'); } function btnText() { var b = btnEl(); return b ? (b.innerText || b.textContent || '').trim() : ''; } function bodyText() { return (document.body && (document.body.innerText || document.body.textContent)) || ''; } function clickLikeUser(el) { var x = 0, y = 0; try { var r = el.getBoundingClientRect(); x = r.left + r.width / 2; y = r.top + r.height / 2; } catch (e) {} var seq = ['pointerover', 'pointerenter', 'pointerdown', 'mousedown', 'pointerup', 'mouseup', 'click']; for (var i = 0; i < seq.length; i++) { var t = seq[i]; var Ev = (t.indexOf('pointer') === 0 && typeof PointerEvent === 'function') ? PointerEvent : MouseEvent; try { el.dispatchEvent(new Ev(t, { bubbles: true, cancelable: true, composed: true, view: window, clientX: x, clientY: y, button: 0 })); } catch (e) {} } try { el.click(); } catch (e) {} } async function pageSignin() { for (var i = 0; i < 60; i++) { var b = btnEl(); if (b) { var t = btnText(); if (/今日已签|已签到/.test(t) || b.disabled) { markDone('今日已签到'); return 'already'; } if (/立即签到/.test(t)) { clickLikeUser(b); for (var j = 0; j < 24; j++) { await sleep(500); var nb = btnEl(); if ((nb && (/今日已签|已签到/.test((nb.innerText || nb.textContent || '').trim()) || nb.disabled)) || /签到成功|已连续|再签/.test(bodyText())) { markDone('签到成功'); return 'ok'; } } markDone('已点击签到,请查看页面结果'); return 'clicked'; } } if (/登录后领取|立即登录|请先登录/.test(bodyText()) && !b) { markDone('未登录,请先登录库库AI'); return 'login'; } await sleep(500); } log('未找到签到按钮(页面结构可能变化)'); return 'nobtn'; } async function main() { if (IS_ACT) { var selfOpened = false; try { selfOpened = sessionStorage.getItem('kuku_auto') === '1' || location.hash.indexOf('kuku-auto=1') >= 0; } catch (e) {} var r = await pageSignin(); if (selfOpened && (r === 'ok' || r === 'already')) { setTimeout(function () { try { window.close(); } catch (e) {} }, 1500); } return; } // 非活动页:仅当今天还没签、且距上次尝试超过 10 分钟时,后台打开活动页触发签到 if (g('doneDay', '') === DAY) return; var now = Date.now(); var last = Number(g('lastOpen', 0)) || 0; if (now - last < 10 * 60 * 1000) return; s('lastOpen', now); try { if (typeof GM_openInTab === 'function') { GM_openInTab(ACT_URL + AUTO_MARK, { active: false, insert: false, setParent: true }); } else { window.open(ACT_URL + AUTO_MARK, '_blank'); } notify('已打开连签活动页,正在自动签到…'); } catch (e) { log('打开活动页失败:' + e); } } main().catch(function (e) { log("运行异常:" + e); }); })();