add: 首次提交油猴脚本
This commit is contained in:
+1244
File diff suppressed because it is too large
Load Diff
+1166
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,656 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @name 20260831测试代码
|
||||||
|
// @namespace local.codex.fixed-site-replacer
|
||||||
|
// @version 0.10.1
|
||||||
|
// @description 读取姓名=直接读页面DOM(零请求);提交=登录态confirm→execute拿token
|
||||||
|
// @match *://*.bandainamco-am.co.jp/*
|
||||||
|
// @match *://bandainamco-am.co.jp/*
|
||||||
|
// @match *://baidu.com/*
|
||||||
|
// @match *://www.baidu.com/*
|
||||||
|
// @grant none
|
||||||
|
// @run-at document-end
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// v0.10.1:
|
||||||
|
// 1. 「读取姓名」= 直接解析当前页面 DOM(不发起任何网络请求):
|
||||||
|
// - 编辑页(member_regist):读 input[name=L_NAME/F_NAME] 的 value
|
||||||
|
// - 会员页/其他页:找「氏名」dt 的相邻 dd 文本
|
||||||
|
// 2. 「提交到服务器」= 才联网:GET 编辑页拿 token/字段 → POST confirm →
|
||||||
|
// POST execute(登录态会话,密码验证),永久生效。
|
||||||
|
// 3. 所有错误实时上报服务器。
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
(() => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const LOG_URL = 'https://www.fugui188.site/userscript-log.php?token=***';
|
||||||
|
const ORIGIN = 'https://parks2.bandainamco-am.co.jp';
|
||||||
|
const ICON_ID = 'codex-parks-rename-icon';
|
||||||
|
const PANEL_ID = 'codex-parks-rename-panel';
|
||||||
|
const STYLE_ID = 'codex-parks-rename-style';
|
||||||
|
|
||||||
|
const PAGE = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
|
||||||
|
|
||||||
|
/* ---------- 日志上报 ---------- */
|
||||||
|
|
||||||
|
let _lastLog = 0;
|
||||||
|
function reportLog(msg) {
|
||||||
|
try {
|
||||||
|
const now = Date.now();
|
||||||
|
if (now - _lastLog < 800) return;
|
||||||
|
_lastLog = now;
|
||||||
|
const payload = JSON.stringify({ t: new Date().toISOString(), u: location.href, v: '0.10.1', m: String(msg).slice(0, 500) });
|
||||||
|
if (navigator.sendBeacon) {
|
||||||
|
navigator.sendBeacon(LOG_URL, payload);
|
||||||
|
} else if (window.fetch) {
|
||||||
|
fetch(LOG_URL, { method: 'POST', mode: 'no-cors', body: payload }).catch(() => {});
|
||||||
|
}
|
||||||
|
} catch (e) { /* ignore */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('error', (e) => {
|
||||||
|
reportLog('ERR ' + (e && e.message ? e.message : 'unknown') + (e && e.lineno ? ' line ' + e.lineno : ''));
|
||||||
|
});
|
||||||
|
window.addEventListener('unhandledrejection', (e) => {
|
||||||
|
const r = e && e.reason;
|
||||||
|
reportLog('REJ ' + ((r && (r.message || r)) || 'unknown'));
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
* 读取姓名:直接读页面 DOM,零请求
|
||||||
|
* ================================================================= */
|
||||||
|
|
||||||
|
function readNameFromDom() {
|
||||||
|
const l = document.querySelector('input[name="L_NAME"]');
|
||||||
|
const f = document.querySelector('input[name="F_NAME"]');
|
||||||
|
if (l || f) {
|
||||||
|
const res = {
|
||||||
|
last_name: l ? l.value.trim() : '',
|
||||||
|
first_name: f ? f.value.trim() : '',
|
||||||
|
source: '编辑页input',
|
||||||
|
};
|
||||||
|
reportLog('DOM读取(编辑页): 姓="' + res.last_name + '" 名="' + res.first_name + '"');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 会员页 dl/dt+dd 结构:找包含「氏名」的 dt,取其相邻 dd
|
||||||
|
const dts = Array.from(document.querySelectorAll('dt'));
|
||||||
|
const dt = dts.find((d) => (d.textContent || '').indexOf('氏名') !== -1);
|
||||||
|
if (dt && dt.nextElementSibling) {
|
||||||
|
const txt = (dt.nextElementSibling.textContent || '').replace(/\s+/g, ' ').trim();
|
||||||
|
const parts = txt.split(' ');
|
||||||
|
let last_name = txt, first_name = '';
|
||||||
|
if (parts.length >= 2) {
|
||||||
|
last_name = parts[0];
|
||||||
|
first_name = parts.slice(1).join(' ');
|
||||||
|
} else if (txt.length >= 2) {
|
||||||
|
last_name = txt.charAt(0);
|
||||||
|
first_name = txt.slice(1);
|
||||||
|
}
|
||||||
|
reportLog('DOM读取(会员页): 姓="' + last_name + '" 名="' + first_name + '"');
|
||||||
|
return { last_name, first_name, source: '会员页' };
|
||||||
|
}
|
||||||
|
|
||||||
|
reportLog('DOM读取失败: 页面上没有 L_NAME/F_NAME input 也没有「氏名」区块');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
* 提交:登录态 confirm → execute(拿 token)
|
||||||
|
* ================================================================= */
|
||||||
|
|
||||||
|
function pageFetch(url, options) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const id = '__npF_' + Date.now() + '_' + Math.random().toString(36).slice(2);
|
||||||
|
const opt = {
|
||||||
|
method: (options && options.method) || 'GET',
|
||||||
|
credentials: 'same-origin',
|
||||||
|
redirect: 'follow',
|
||||||
|
headers: (options && options.headers) || {},
|
||||||
|
};
|
||||||
|
if (options && options.body) opt.body = options.body;
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.textContent =
|
||||||
|
'(function(){var id=' + JSON.stringify(id) +
|
||||||
|
';window[id]={p:1};fetch(' + JSON.stringify(url) + ',' + JSON.stringify(opt) +
|
||||||
|
').then(function(r){return r.text().then(function(t){window[id]={s:r.status,u:r.url,t:t};});}).catch(function(e){window[id]={e:String(e&&e.message||e)};});})();';
|
||||||
|
try {
|
||||||
|
document.documentElement.appendChild(script);
|
||||||
|
script.remove();
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const start = Date.now();
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
const box = (PAGE && PAGE[id]) || window[id];
|
||||||
|
if (box && box.e) {
|
||||||
|
clearInterval(timer);
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
reject(new Error(box.e));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (box && typeof box.t === 'string') {
|
||||||
|
clearInterval(timer);
|
||||||
|
const out = { status: Number(box.s || 0), url: box.u || url, text: box.t };
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
resolve(out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Date.now() - start > 60000) {
|
||||||
|
clearInterval(timer);
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
reject(new Error('请求超时'));
|
||||||
|
}
|
||||||
|
}, 60);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function httpGet(path, referer) {
|
||||||
|
const url = path.startsWith('http') ? path : ORIGIN + path;
|
||||||
|
const headers = { Referer: referer || ORIGIN + '/member_mypage.html' };
|
||||||
|
try {
|
||||||
|
const r = await PAGE.fetch(url, { method: 'GET', credentials: 'include', headers });
|
||||||
|
return { status: r.status, text: await r.text(), url: r.url };
|
||||||
|
} catch (e1) {
|
||||||
|
return await pageFetch(url, { method: 'GET', headers });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function httpPost(path, body, referer) {
|
||||||
|
const url = path.startsWith('http') ? path : ORIGIN + path;
|
||||||
|
const headers = {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||||
|
Origin: ORIGIN,
|
||||||
|
Referer: referer || ORIGIN + '/member_regist.html?request=edit',
|
||||||
|
};
|
||||||
|
const bodyStr = new URLSearchParams(body).toString();
|
||||||
|
try {
|
||||||
|
const r = await PAGE.fetch(url, { method: 'POST', credentials: 'include', headers, body: bodyStr });
|
||||||
|
return { status: r.status, text: await r.text(), url: r.url };
|
||||||
|
} catch (e1) {
|
||||||
|
return await pageFetch(url, { method: 'POST', headers, body: bodyStr });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeRe(name) {
|
||||||
|
return String(name).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseInput(html, name) {
|
||||||
|
const re = new RegExp('<input\\b[^>]*\\bname=["\']' + escapeRe(name) + '["\'][^>]*>', 'i');
|
||||||
|
const m = html.match(re);
|
||||||
|
if (!m) return '';
|
||||||
|
const v = m[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1].trim() : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseSelected(html, name) {
|
||||||
|
const sm = html.match(new RegExp('<select[^>]*name=["\']' + escapeRe(name) + '["\'][^>]*>([\\s\\S]*?)</select>', 'i'));
|
||||||
|
if (!sm) return '';
|
||||||
|
const opt = sm[1].match(/<option[^>]*\bselected\b[^>]*>/i) || sm[1].match(/<option[^>]*selected=["']selected["'][^>]*>/i);
|
||||||
|
if (!opt) return '';
|
||||||
|
const v = opt[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1].trim() : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCheckedRadio(html, name) {
|
||||||
|
const re = new RegExp('<input\\b[^>]*\\bname=["\']' + escapeRe(name) + '["\'][^>]*>', 'gi');
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(html))) {
|
||||||
|
const tag = m[0];
|
||||||
|
if (!/\bchecked\b/i.test(tag)) continue;
|
||||||
|
const v = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1] : '';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseFormChunk(html, formName) {
|
||||||
|
const head = html.match(new RegExp('<form[^>]*name=["\']' + escapeRe(formName) + '["\'][^>]*>', 'i'));
|
||||||
|
const body = html.match(new RegExp('<form[^>]*name=["\']' + escapeRe(formName) + '["\'][^>]*>([\\s\\S]*?)</form>', 'i'));
|
||||||
|
let action = '';
|
||||||
|
if (head) {
|
||||||
|
const am = head[0].match(/\baction=["']([^"']+)/i);
|
||||||
|
if (am) action = am[1];
|
||||||
|
}
|
||||||
|
return { action, chunk: body ? body[1] : '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHiddenFields(chunk) {
|
||||||
|
const fields = {};
|
||||||
|
const re = /<input\b[^>]*>/gi;
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(chunk))) {
|
||||||
|
const tag = m[0];
|
||||||
|
if (!/type=["']hidden["']/i.test(tag) && !/type=["']checkbox["']/i.test(tag) && !/type=["']radio["']/i.test(tag)) {
|
||||||
|
const nm = tag.match(/\bname=["']([^"']+)["']/i);
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
if (nm && !/^jp\.co\.interfactory\.framework\./i.test(nm[1])) {
|
||||||
|
fields[nm[1]] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const nm = tag.match(/\bname=["']([^"']+)["']/i);
|
||||||
|
if (!nm) continue;
|
||||||
|
const name = nm[1];
|
||||||
|
if (/^jp\.co\.interfactory\.framework\./i.test(name)) continue;
|
||||||
|
if (/type=["']checkbox["']/i.test(tag)) {
|
||||||
|
if (/\bchecked\b/i.test(tag)) {
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '1';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/type=["']radio["']/i.test(tag)) {
|
||||||
|
if (/\bchecked\b/i.test(tag)) {
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
const selRe = /<select\b[^>]*name=["']([^"']+)["'][^>]*>([\s\S]*?)<\/select>/gi;
|
||||||
|
let sm;
|
||||||
|
while ((sm = selRe.exec(chunk))) {
|
||||||
|
const name = sm[1];
|
||||||
|
const opt = sm[2].match(/<option[^>]*\bselected\b[^>]*>/i);
|
||||||
|
if (!opt) continue;
|
||||||
|
const v = opt[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = v ? v[1] : '';
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractParksError(html) {
|
||||||
|
const text = html || '';
|
||||||
|
const pats = [
|
||||||
|
/form-error-message[\s\S]*?<li>([^<]+)/i,
|
||||||
|
/<li[^>]*>([^<]{4,200})<\/li>/i,
|
||||||
|
/class="error[^"]*"[^>]*>([^<]+)/i,
|
||||||
|
/errorMessage[^>]*>([^<]+)/i,
|
||||||
|
];
|
||||||
|
for (let i = 0; i < pats.length; i++) {
|
||||||
|
const m = text.match(pats[i]);
|
||||||
|
if (m && m[1] && m[1].trim()) return m[1].replace(/\s+/g, ' ').trim();
|
||||||
|
}
|
||||||
|
if (text.includes('セッションがタイムアウト') || text.includes('セキュリティのため')) {
|
||||||
|
return '会话超时,请刷新页面重新登录后再提交';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function looksExecuteSuccess(resp) {
|
||||||
|
const t = (resp && resp.text) || '';
|
||||||
|
const u = (resp && resp.url) || '';
|
||||||
|
if (t.includes('会員情報を更新しました')) return true;
|
||||||
|
if (t.includes('form-message') && t.includes('更新しました')) return true;
|
||||||
|
if (u.includes('member_regist_confirm') && t.includes('更新')) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseToken(html) {
|
||||||
|
const m = (html || '').match(/name="token"\s+value="([0-9a-f]+)"/i);
|
||||||
|
return m ? m[1] : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMemberData(html) {
|
||||||
|
const m = (html || '').match(/var\s+member_data\s*=\s*(\{[\s\S]*?\})\s*;/);
|
||||||
|
if (!m) return {};
|
||||||
|
try {
|
||||||
|
return JSON.parse(m[1]);
|
||||||
|
} catch (e) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseProfile(html) {
|
||||||
|
const md = parseMemberData(html);
|
||||||
|
let tel = parseInput(html, 'TEL');
|
||||||
|
if (!tel) {
|
||||||
|
const tm = html.match(/(?<!\d)(070\d{8}|080\d{8}|090\d{8})(?!\d)/);
|
||||||
|
if (tm) tel = tm[1];
|
||||||
|
}
|
||||||
|
const y = parseInput(html, 'BIRTH_YEAR');
|
||||||
|
const mo = parseInput(html, 'BIRTH_MONTH');
|
||||||
|
const d = parseInput(html, 'BIRTH_DAY');
|
||||||
|
let birthday = (md.birth || '').replace(/\//g, '-');
|
||||||
|
if (y && mo && d) {
|
||||||
|
birthday = `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
|
||||||
|
}
|
||||||
|
const sex = parseCheckedRadio(html, 'SEX') || (md.sex || 'M').toString().charAt(0).toUpperCase();
|
||||||
|
return {
|
||||||
|
email: parseInput(html, 'PC_MAIL'),
|
||||||
|
last_name: parseInput(html, 'L_NAME'),
|
||||||
|
first_name: parseInput(html, 'F_NAME'),
|
||||||
|
last_name_kana: parseInput(html, 'L_KANA') || parseInput(html, 'L_NAME_KANA'),
|
||||||
|
first_name_kana: parseInput(html, 'F_KANA') || parseInput(html, 'F_NAME_KANA'),
|
||||||
|
nickname: parseInput(html, 'NICKNAME'),
|
||||||
|
addr1: parseSelected(html, 'ADDR1') || parseInput(html, 'ADDR1') || '東京都',
|
||||||
|
zip: (parseInput(html, 'ZIP') || '').replace(/-/g, ''),
|
||||||
|
addr2: parseInput(html, 'ADDR2'),
|
||||||
|
addr_street: parseInput(html, 'MEMBER.FREE_ITEM16'),
|
||||||
|
addr3: parseInput(html, 'ADDR3'),
|
||||||
|
tel,
|
||||||
|
gender: sex === 'F' || sex === '2' ? 'F' : (sex === 'M' || sex === '1' ? 'M' : 'M'),
|
||||||
|
birthday: birthday || '1990-01-01',
|
||||||
|
formFields: parseHiddenFields(parseFormChunk(html, 'memberFrm').chunk || html),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeBirthday(raw) {
|
||||||
|
const s = String(raw || '').trim();
|
||||||
|
if (!s) return '';
|
||||||
|
const m1 = s.match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);
|
||||||
|
if (m1) {
|
||||||
|
return `${m1[1]}-${String(parseInt(m1[2], 10)).padStart(2, '0')}-${String(parseInt(m1[3], 10)).padStart(2, '0')}`;
|
||||||
|
}
|
||||||
|
const digits = s.replace(/\D/g, '');
|
||||||
|
if (digits.length === 8) {
|
||||||
|
return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function bdayParts(bday) {
|
||||||
|
const norm = normalizeBirthday(bday) || '1990-01-01';
|
||||||
|
const m = norm.match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);
|
||||||
|
if (!m) return { y: '1990', mo: '1', d: '1' };
|
||||||
|
return { y: m[1], mo: String(parseInt(m[2], 10)), d: String(parseInt(m[3], 10)) };
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 提交时(登录态)读取资料 + token */
|
||||||
|
async function loadProfileForSubmit() {
|
||||||
|
reportLog('提交: 开始读取编辑页');
|
||||||
|
const r = await httpGet('/member_regist.html?request=edit');
|
||||||
|
const loggedIn = r.text.includes('ログアウト') || !!parseMemberData(r.text).member_id || !!parseInput(r.text, 'PC_MAIL');
|
||||||
|
if (!loggedIn) {
|
||||||
|
reportLog('提交: 未登录');
|
||||||
|
throw new Error('未登录:请用 Safari 打开 parks2 完成登录(不要用无痕模式)');
|
||||||
|
}
|
||||||
|
const p = parseProfile(r.text);
|
||||||
|
if (!p.tel) {
|
||||||
|
reportLog('提交: 未解析到手机号');
|
||||||
|
throw new Error('未读取到手机号,无法安全提交');
|
||||||
|
}
|
||||||
|
reportLog('提交: 编辑页读取成功 ' + p.last_name + ' ' + p.first_name);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 提交到服务器:confirm(拿 token)→ execute */
|
||||||
|
async function submitNameBirthday(profile, ln, fn, birthday, password) {
|
||||||
|
const lk = profile.last_name_kana;
|
||||||
|
const fk = profile.first_name_kana;
|
||||||
|
const nick = profile.nickname || ln;
|
||||||
|
const bday = normalizeBirthday(birthday) || profile.birthday || '1990-01-01';
|
||||||
|
const { y, mo, d } = bdayParts(bday);
|
||||||
|
const editRef = ORIGIN + '/member_regist.html?request=edit';
|
||||||
|
const zip7 = String(profile.zip || '').replace(/-/g, '');
|
||||||
|
const addr1 = profile.addr1 || '東京都';
|
||||||
|
const addr2 = profile.addr2 || '';
|
||||||
|
const addrStreet = profile.addr_street || '';
|
||||||
|
const addr3 = profile.addr3 || '';
|
||||||
|
const sex = profile.gender || 'M';
|
||||||
|
if (!zip7 || !addr2 || !addrStreet) {
|
||||||
|
throw new Error('当前资料缺邮编/市区町村/番地(官网已改为必填)。请先在「会員情報変更」填完整地址,再回来改名字。');
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirm = Object.assign({}, profile.formFields || {}, {
|
||||||
|
request: 'confirm',
|
||||||
|
PC_MAIL_OLD: profile.email,
|
||||||
|
FOREIGN_LOGIN_PROVIDER_KIND: '',
|
||||||
|
MOBILE_MAIL_OLD: '',
|
||||||
|
mode: '1',
|
||||||
|
CART_MEMBER_REGIST: '',
|
||||||
|
MAIL_FLG_OLD: '1',
|
||||||
|
'SOCIAL_PLUS:SOCIAL_PLUS_ID': '',
|
||||||
|
'SOCIAL_PLUS:PROVIDER': '',
|
||||||
|
NICKNAME: nick,
|
||||||
|
'jp.co.interfactory.framework.trim.NICKNAME': '',
|
||||||
|
PC_MAIL: profile.email,
|
||||||
|
'jp.co.interfactory.framework.trim.PC_MAIL': '',
|
||||||
|
PASSWORD: password,
|
||||||
|
PASSWORD2: password,
|
||||||
|
SEX: sex,
|
||||||
|
BIRTH_YEAR: y,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_YEAR': '',
|
||||||
|
BIRTH_MONTH: mo,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_MONTH': '',
|
||||||
|
BIRTH_DAY: d,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_DAY': '',
|
||||||
|
ZIP: zip7,
|
||||||
|
'jp.co.interfactory.framework.trim.ZIP': '',
|
||||||
|
ADDR1: addr1,
|
||||||
|
ADDR2: addr2,
|
||||||
|
'jp.co.interfactory.framework.trim.ADDR2': '',
|
||||||
|
'MEMBER.FREE_ITEM16': addrStreet,
|
||||||
|
'jp.co.interfactory.framework.trim.MEMBER.FREE_ITEM16': '',
|
||||||
|
ADDR3: addr3,
|
||||||
|
'jp.co.interfactory.framework.trim.ADDR3': '',
|
||||||
|
TEL: profile.tel,
|
||||||
|
'jp.co.interfactory.framework.trim.TEL': '',
|
||||||
|
L_NAME: ln,
|
||||||
|
F_NAME: fn,
|
||||||
|
L_KANA: lk,
|
||||||
|
'jp.co.interfactory.framework.trim.L_KANA': '',
|
||||||
|
F_KANA: fk,
|
||||||
|
'jp.co.interfactory.framework.trim.F_KANA': '',
|
||||||
|
PC_MAIL_TYPE: '1',
|
||||||
|
MOBILE_MAIL_TYPE: '1',
|
||||||
|
});
|
||||||
|
if (!addr3) confirm['MEMBER.FREE_ITEM19'] = '1';
|
||||||
|
else delete confirm['MEMBER.FREE_ITEM19'];
|
||||||
|
|
||||||
|
reportLog('提交: POST confirm');
|
||||||
|
const r1 = await httpPost('/member_regist.html', confirm, editRef);
|
||||||
|
if (r1.text.includes('sms_authentication') || r1.url.includes('sms_authentication')) {
|
||||||
|
reportLog('提交: 触发 SMS 验证');
|
||||||
|
throw new Error('触发了 SMS 验证(请勿改手机号)');
|
||||||
|
}
|
||||||
|
const confirmParsed = parseFormChunk(r1.text, 'confirmForm');
|
||||||
|
const hidden = parseHiddenFields(confirmParsed.chunk);
|
||||||
|
const token = hidden.token || parseToken(r1.text);
|
||||||
|
if (!token) {
|
||||||
|
const err = extractParksError(r1.text) || 'confirm 失败,请检查密码是否正确';
|
||||||
|
reportLog('提交: confirm 未拿到 token → ' + err + ' | 响应片段: ' + String(r1.text || '').slice(0, 200));
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
reportLog('提交: token 已获取 (' + token.slice(0, 8) + '…)');
|
||||||
|
|
||||||
|
const execute = Object.assign({}, hidden, {
|
||||||
|
request: 'execute',
|
||||||
|
token,
|
||||||
|
MAIL_FLG: hidden.MAIL_FLG || '1',
|
||||||
|
SEX: sex,
|
||||||
|
BIRTH_YEAR: y,
|
||||||
|
BIRTH_MONTH: mo,
|
||||||
|
BIRTH_DAY: d,
|
||||||
|
BIRTH: y + '/' + mo + '/' + d,
|
||||||
|
ZIP: zip7 || hidden.ZIP || '',
|
||||||
|
ADDR1: addr1 || hidden.ADDR1 || '',
|
||||||
|
ADDR2: addr2 || hidden.ADDR2 || '',
|
||||||
|
'MEMBER.FREE_ITEM16': addrStreet || hidden['MEMBER.FREE_ITEM16'] || '',
|
||||||
|
ADDR3: addr3 || hidden.ADDR3 || '',
|
||||||
|
TEL: profile.tel,
|
||||||
|
L_NAME: ln,
|
||||||
|
F_NAME: fn,
|
||||||
|
L_KANA: lk,
|
||||||
|
F_KANA: fk,
|
||||||
|
NICKNAME: nick,
|
||||||
|
PC_MAIL: profile.email,
|
||||||
|
PASSWORD: password,
|
||||||
|
PASSWORD2: password,
|
||||||
|
});
|
||||||
|
if (addr3) delete execute['MEMBER.FREE_ITEM19'];
|
||||||
|
else execute['MEMBER.FREE_ITEM19'] = '1';
|
||||||
|
|
||||||
|
const action = confirmParsed.action || '/member_regist_confirm.html';
|
||||||
|
reportLog('提交: POST execute → ' + action);
|
||||||
|
const r2 = await httpPost(action, execute, ORIGIN + '/member_regist.html');
|
||||||
|
if (r2.text.includes('sms_authentication') || r2.url.includes('sms_authentication')) {
|
||||||
|
reportLog('提交: execute 触发 SMS');
|
||||||
|
throw new Error('execute 触发 SMS');
|
||||||
|
}
|
||||||
|
if (!looksExecuteSuccess(r2)) {
|
||||||
|
const afterEdit = await httpGet('/member_regist.html?request=edit', ORIGIN + '/member_mypage.html');
|
||||||
|
const after = parseProfile(afterEdit.text);
|
||||||
|
if (after.last_name === ln && after.first_name === fn) {
|
||||||
|
reportLog('提交: 成功(重读验证一致)');
|
||||||
|
return { last_name: ln, first_name: fn, birthday: `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}` };
|
||||||
|
}
|
||||||
|
const err = extractParksError(r2.text) || 'execute 未返回成功页';
|
||||||
|
reportLog('提交: execute 失败 → ' + err + ' | 响应片段: ' + String(r2.text || '').slice(0, 200));
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
reportLog('提交: 成功(响应含更新确认)');
|
||||||
|
return { last_name: ln, first_name: fn, birthday: `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}` };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- UI ---------- */
|
||||||
|
|
||||||
|
const css = `
|
||||||
|
#${ICON_ID}{
|
||||||
|
position:fixed;top:max(14px, env(safe-area-inset-top));right:14px;z-index:2147483646;
|
||||||
|
width:46px;height:46px;border-radius:23px;border:none;cursor:pointer;
|
||||||
|
background:linear-gradient(135deg,#e60012,#b8000f);color:#fff;
|
||||||
|
font-size:16px;font-weight:700;box-shadow:0 4px 16px rgba(0,0,0,.35);
|
||||||
|
display:flex;align-items:center;justify-content:center;
|
||||||
|
}
|
||||||
|
#${PANEL_ID}{
|
||||||
|
position:fixed;left:0;right:0;bottom:0;z-index:2147483647;
|
||||||
|
background:#fff;border-radius:16px 16px 0 0;padding:16px 16px calc(20px + env(safe-area-inset-bottom));
|
||||||
|
box-sizing:border-box;max-height:85vh;overflow:auto;
|
||||||
|
transform:translateY(110%);transition:transform .25s ease;
|
||||||
|
font:14px/1.45 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB",sans-serif;
|
||||||
|
color:#222;
|
||||||
|
}
|
||||||
|
#${PANEL_ID}.open{transform:translateY(0);}
|
||||||
|
#${PANEL_ID} *{box-sizing:border-box;}
|
||||||
|
.cpx-title{font-size:17px;font-weight:700;margin:0 0 4px;}
|
||||||
|
.cpx-sub{font-size:12px;color:#666;margin:0 0 10px;line-height:1.5;}
|
||||||
|
.cpx-row{margin-bottom:10px;}
|
||||||
|
.cpx-row label{display:block;font-size:12px;color:#444;margin-bottom:4px;}
|
||||||
|
.cpx-row input{width:100%;height:42px;border:1px solid #ddd;border-radius:8px;padding:0 12px;font-size:16px;}
|
||||||
|
.cpx-row input:focus{outline:none;border-color:#e60012;}
|
||||||
|
.cpx-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px;}
|
||||||
|
.cpx-btn{height:44px;border:none;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;}
|
||||||
|
.cpx-btn-primary{background:#e60012;color:#fff;}
|
||||||
|
.cpx-btn-secondary{background:#f3f4f6;color:#111;}
|
||||||
|
.cpx-log{margin-top:12px;font-size:12px;line-height:1.55;color:#333;background:#f9fafb;border-radius:8px;padding:10px;white-space:pre-wrap;max-height:150px;overflow:auto;}
|
||||||
|
.cpx-close{position:absolute;right:12px;top:12px;border:none;background:#eee;width:32px;height:32px;border-radius:16px;font-size:18px;cursor:pointer;}
|
||||||
|
.cpx-warn{font-size:11px;color:#b45309;background:#fffbeb;border:1px solid #fcd34d;border-radius:8px;padding:8px 10px;margin-bottom:10px;line-height:1.45;}
|
||||||
|
`;
|
||||||
|
|
||||||
|
function ensureStyles() {
|
||||||
|
if (document.getElementById(STYLE_ID)) return;
|
||||||
|
const st = document.createElement('style');
|
||||||
|
st.id = STYLE_ID;
|
||||||
|
st.textContent = css;
|
||||||
|
document.head.appendChild(st);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUI() {
|
||||||
|
ensureStyles();
|
||||||
|
|
||||||
|
const icon = document.createElement('button');
|
||||||
|
icon.id = ICON_ID;
|
||||||
|
icon.type = 'button';
|
||||||
|
icon.textContent = '改';
|
||||||
|
icon.title = '改会员资料(v0.10.1)';
|
||||||
|
|
||||||
|
const panel = document.createElement('div');
|
||||||
|
panel.id = PANEL_ID;
|
||||||
|
panel.innerHTML = `
|
||||||
|
<button class="cpx-close" id="cpxClose" type="button">×</button>
|
||||||
|
<p class="cpx-title">Bandai Parks 会员资料(v0.10.1)</p>
|
||||||
|
<p class="cpx-sub">「读取姓名」直接解析当前页面 DOM(零请求);「提交」时才联网走登录态拿 token。</p>
|
||||||
|
<div class="cpx-warn">⚠ 读取不联网一定成功;提交会真实修改服务器资料(姓名+生日)。</div>
|
||||||
|
<div class="cpx-row"><label>姓(L_NAME)</label><input id="cpxL" autocomplete="off" placeholder="姓" /></div>
|
||||||
|
<div class="cpx-row"><label>名(F_NAME)</label><input id="cpxF" autocomplete="off" placeholder="名" /></div>
|
||||||
|
<div class="cpx-row"><label>生日(BIRTH,YYYY-MM-DD,官网可能锁定)</label><input id="cpxB" type="date" placeholder="1999-07-12" /></div>
|
||||||
|
<div class="cpx-row"><label>登录密码(只填密码,提交必填,不保存)</label><input id="cpxP" type="password" autocomplete="current-password" placeholder="只填登录密码" /></div>
|
||||||
|
<div class="cpx-btns">
|
||||||
|
<button class="cpx-btn cpx-btn-primary" id="cpxLoad" type="button">读取姓名(DOM)</button>
|
||||||
|
<button class="cpx-btn cpx-btn-secondary" id="cpxClear" type="button">清空</button>
|
||||||
|
<button class="cpx-btn cpx-btn-primary" id="cpxSubmit" type="button" style="grid-column:1/-1">提交到服务器(登录态拿 token)</button>
|
||||||
|
</div>
|
||||||
|
<div class="cpx-log" id="cpxLog">就绪:点「读取姓名」从当前页面 DOM 提取。</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.body.appendChild(icon);
|
||||||
|
document.body.appendChild(panel);
|
||||||
|
|
||||||
|
const logEl = panel.querySelector('#cpxLog');
|
||||||
|
const setLog = (msg) => { logEl.textContent = msg; };
|
||||||
|
const open = () => panel.classList.add('open');
|
||||||
|
const close = () => panel.classList.remove('open');
|
||||||
|
|
||||||
|
icon.addEventListener('click', () => {
|
||||||
|
if (panel.classList.contains('open')) close();
|
||||||
|
else open();
|
||||||
|
});
|
||||||
|
panel.querySelector('#cpxClose').addEventListener('click', close);
|
||||||
|
|
||||||
|
// 读取:直接读当前页面 DOM(零请求)
|
||||||
|
panel.querySelector('#cpxLoad').addEventListener('click', () => {
|
||||||
|
reportLog('用户点击「读取姓名」');
|
||||||
|
const n = readNameFromDom();
|
||||||
|
if (!n) {
|
||||||
|
setLog('❌ 当前页面没有姓名信息。\n请到以下页面再点:\n• 编辑页 member_regist.html?request=edit\n• 会员页 member_mypage.html');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
panel.querySelector('#cpxL').value = n.last_name;
|
||||||
|
panel.querySelector('#cpxF').value = n.first_name;
|
||||||
|
setLog('✅ 已从页面 DOM 读取(来源:' + n.source + ')\n姓:' + n.last_name + '\n名:' + n.first_name);
|
||||||
|
});
|
||||||
|
|
||||||
|
panel.querySelector('#cpxClear').addEventListener('click', () => {
|
||||||
|
panel.querySelector('#cpxL').value = '';
|
||||||
|
panel.querySelector('#cpxF').value = '';
|
||||||
|
panel.querySelector('#cpxB').value = '';
|
||||||
|
setLog('已清空。');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 提交:登录态 confirm → execute(拿 token)
|
||||||
|
panel.querySelector('#cpxSubmit').addEventListener('click', async () => {
|
||||||
|
const ln = panel.querySelector('#cpxL').value.trim();
|
||||||
|
const fn = panel.querySelector('#cpxF').value.trim();
|
||||||
|
const bRaw = panel.querySelector('#cpxB').value.trim();
|
||||||
|
const pwd = panel.querySelector('#cpxP').value;
|
||||||
|
if (!ln || !fn) { setLog('请先读取或填写姓和名'); return; }
|
||||||
|
if (!pwd) { setLog('请填写登录密码'); return; }
|
||||||
|
setLog('提交中…(confirm → execute,最多等 60 秒)');
|
||||||
|
reportLog('用户点击「提交」姓=' + ln + ' 名=' + fn);
|
||||||
|
try {
|
||||||
|
const profile = await loadProfileForSubmit();
|
||||||
|
const res = await submitNameBirthday(profile, ln, fn, bRaw, pwd);
|
||||||
|
setLog('✅ 已提交到服务器并永久生效\n新氏名:' + res.last_name + ' ' + res.first_name + '\n生日:' + res.birthday);
|
||||||
|
} catch (e) {
|
||||||
|
setLog('❌ ' + e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- 启动 ---------- */
|
||||||
|
|
||||||
|
function boot() {
|
||||||
|
reportLog('BOOT UI v0.10.1');
|
||||||
|
if (document.body) {
|
||||||
|
buildUI();
|
||||||
|
reportLog('UI 已注入');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const t = setInterval(() => {
|
||||||
|
if (document.body) {
|
||||||
|
clearInterval(t);
|
||||||
|
buildUI();
|
||||||
|
reportLog('UI 已注入');
|
||||||
|
}
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
boot();
|
||||||
|
})();
|
||||||
@@ -0,0 +1,656 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @name 20260831测试代码
|
||||||
|
// @namespace local.codex.fixed-site-replacer
|
||||||
|
// @version 0.10.1
|
||||||
|
// @description 读取姓名=直接读页面DOM(零请求);提交=登录态confirm→execute拿token
|
||||||
|
// @match *://*.bandainamco-am.co.jp/*
|
||||||
|
// @match *://bandainamco-am.co.jp/*
|
||||||
|
// @match *://baidu.com/*
|
||||||
|
// @match *://www.baidu.com/*
|
||||||
|
// @grant none
|
||||||
|
// @run-at document-end
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// v0.10.1:
|
||||||
|
// 1. 「读取姓名」= 直接解析当前页面 DOM(不发起任何网络请求):
|
||||||
|
// - 编辑页(member_regist):读 input[name=L_NAME/F_NAME] 的 value
|
||||||
|
// - 会员页/其他页:找「氏名」dt 的相邻 dd 文本
|
||||||
|
// 2. 「提交到服务器」= 才联网:GET 编辑页拿 token/字段 → POST confirm →
|
||||||
|
// POST execute(登录态会话,密码验证),永久生效。
|
||||||
|
// 3. 所有错误实时上报服务器。
|
||||||
|
// =====================================================================
|
||||||
|
|
||||||
|
(() => {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const LOG_URL = 'https://www.fugui188.site/userscript-log.php?token=***';
|
||||||
|
const ORIGIN = 'https://parks2.bandainamco-am.co.jp';
|
||||||
|
const ICON_ID = 'codex-parks-rename-icon';
|
||||||
|
const PANEL_ID = 'codex-parks-rename-panel';
|
||||||
|
const STYLE_ID = 'codex-parks-rename-style';
|
||||||
|
|
||||||
|
const PAGE = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window;
|
||||||
|
|
||||||
|
/* ---------- 日志上报 ---------- */
|
||||||
|
|
||||||
|
let _lastLog = 0;
|
||||||
|
function reportLog(msg) {
|
||||||
|
try {
|
||||||
|
const now = Date.now();
|
||||||
|
if (now - _lastLog < 800) return;
|
||||||
|
_lastLog = now;
|
||||||
|
const payload = JSON.stringify({ t: new Date().toISOString(), u: location.href, v: '0.10.1', m: String(msg).slice(0, 500) });
|
||||||
|
if (navigator.sendBeacon) {
|
||||||
|
navigator.sendBeacon(LOG_URL, payload);
|
||||||
|
} else if (window.fetch) {
|
||||||
|
fetch(LOG_URL, { method: 'POST', mode: 'no-cors', body: payload }).catch(() => {});
|
||||||
|
}
|
||||||
|
} catch (e) { /* ignore */ }
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('error', (e) => {
|
||||||
|
reportLog('ERR ' + (e && e.message ? e.message : 'unknown') + (e && e.lineno ? ' line ' + e.lineno : ''));
|
||||||
|
});
|
||||||
|
window.addEventListener('unhandledrejection', (e) => {
|
||||||
|
const r = e && e.reason;
|
||||||
|
reportLog('REJ ' + ((r && (r.message || r)) || 'unknown'));
|
||||||
|
});
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
* 读取姓名:直接读页面 DOM,零请求
|
||||||
|
* ================================================================= */
|
||||||
|
|
||||||
|
function readNameFromDom() {
|
||||||
|
const l = document.querySelector('input[name="L_NAME"]');
|
||||||
|
const f = document.querySelector('input[name="F_NAME"]');
|
||||||
|
if (l || f) {
|
||||||
|
const res = {
|
||||||
|
last_name: l ? l.value.trim() : '',
|
||||||
|
first_name: f ? f.value.trim() : '',
|
||||||
|
source: '编辑页input',
|
||||||
|
};
|
||||||
|
reportLog('DOM读取(编辑页): 姓="' + res.last_name + '" 名="' + res.first_name + '"');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 会员页 dl/dt+dd 结构:找包含「氏名」的 dt,取其相邻 dd
|
||||||
|
const dts = Array.from(document.querySelectorAll('dt'));
|
||||||
|
const dt = dts.find((d) => (d.textContent || '').indexOf('氏名') !== -1);
|
||||||
|
if (dt && dt.nextElementSibling) {
|
||||||
|
const txt = (dt.nextElementSibling.textContent || '').replace(/\s+/g, ' ').trim();
|
||||||
|
const parts = txt.split(' ');
|
||||||
|
let last_name = txt, first_name = '';
|
||||||
|
if (parts.length >= 2) {
|
||||||
|
last_name = parts[0];
|
||||||
|
first_name = parts.slice(1).join(' ');
|
||||||
|
} else if (txt.length >= 2) {
|
||||||
|
last_name = txt.charAt(0);
|
||||||
|
first_name = txt.slice(1);
|
||||||
|
}
|
||||||
|
reportLog('DOM读取(会员页): 姓="' + last_name + '" 名="' + first_name + '"');
|
||||||
|
return { last_name, first_name, source: '会员页' };
|
||||||
|
}
|
||||||
|
|
||||||
|
reportLog('DOM读取失败: 页面上没有 L_NAME/F_NAME input 也没有「氏名」区块');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
* 提交:登录态 confirm → execute(拿 token)
|
||||||
|
* ================================================================= */
|
||||||
|
|
||||||
|
function pageFetch(url, options) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const id = '__npF_' + Date.now() + '_' + Math.random().toString(36).slice(2);
|
||||||
|
const opt = {
|
||||||
|
method: (options && options.method) || 'GET',
|
||||||
|
credentials: 'same-origin',
|
||||||
|
redirect: 'follow',
|
||||||
|
headers: (options && options.headers) || {},
|
||||||
|
};
|
||||||
|
if (options && options.body) opt.body = options.body;
|
||||||
|
const script = document.createElement('script');
|
||||||
|
script.textContent =
|
||||||
|
'(function(){var id=' + JSON.stringify(id) +
|
||||||
|
';window[id]={p:1};fetch(' + JSON.stringify(url) + ',' + JSON.stringify(opt) +
|
||||||
|
').then(function(r){return r.text().then(function(t){window[id]={s:r.status,u:r.url,t:t};});}).catch(function(e){window[id]={e:String(e&&e.message||e)};});})();';
|
||||||
|
try {
|
||||||
|
document.documentElement.appendChild(script);
|
||||||
|
script.remove();
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const start = Date.now();
|
||||||
|
const timer = setInterval(() => {
|
||||||
|
const box = (PAGE && PAGE[id]) || window[id];
|
||||||
|
if (box && box.e) {
|
||||||
|
clearInterval(timer);
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
reject(new Error(box.e));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (box && typeof box.t === 'string') {
|
||||||
|
clearInterval(timer);
|
||||||
|
const out = { status: Number(box.s || 0), url: box.u || url, text: box.t };
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
resolve(out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Date.now() - start > 60000) {
|
||||||
|
clearInterval(timer);
|
||||||
|
try { delete window[id]; } catch (e) { /* ignore */ }
|
||||||
|
reject(new Error('请求超时'));
|
||||||
|
}
|
||||||
|
}, 60);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function httpGet(path, referer) {
|
||||||
|
const url = path.startsWith('http') ? path : ORIGIN + path;
|
||||||
|
const headers = { Referer: referer || ORIGIN + '/member_mypage.html' };
|
||||||
|
try {
|
||||||
|
const r = await PAGE.fetch(url, { method: 'GET', credentials: 'include', headers });
|
||||||
|
return { status: r.status, text: await r.text(), url: r.url };
|
||||||
|
} catch (e1) {
|
||||||
|
return await pageFetch(url, { method: 'GET', headers });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function httpPost(path, body, referer) {
|
||||||
|
const url = path.startsWith('http') ? path : ORIGIN + path;
|
||||||
|
const headers = {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||||
|
Origin: ORIGIN,
|
||||||
|
Referer: referer || ORIGIN + '/member_regist.html?request=edit',
|
||||||
|
};
|
||||||
|
const bodyStr = new URLSearchParams(body).toString();
|
||||||
|
try {
|
||||||
|
const r = await PAGE.fetch(url, { method: 'POST', credentials: 'include', headers, body: bodyStr });
|
||||||
|
return { status: r.status, text: await r.text(), url: r.url };
|
||||||
|
} catch (e1) {
|
||||||
|
return await pageFetch(url, { method: 'POST', headers, body: bodyStr });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeRe(name) {
|
||||||
|
return String(name).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseInput(html, name) {
|
||||||
|
const re = new RegExp('<input\\b[^>]*\\bname=["\']' + escapeRe(name) + '["\'][^>]*>', 'i');
|
||||||
|
const m = html.match(re);
|
||||||
|
if (!m) return '';
|
||||||
|
const v = m[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1].trim() : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseSelected(html, name) {
|
||||||
|
const sm = html.match(new RegExp('<select[^>]*name=["\']' + escapeRe(name) + '["\'][^>]*>([\\s\\S]*?)</select>', 'i'));
|
||||||
|
if (!sm) return '';
|
||||||
|
const opt = sm[1].match(/<option[^>]*\bselected\b[^>]*>/i) || sm[1].match(/<option[^>]*selected=["']selected["'][^>]*>/i);
|
||||||
|
if (!opt) return '';
|
||||||
|
const v = opt[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1].trim() : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseCheckedRadio(html, name) {
|
||||||
|
const re = new RegExp('<input\\b[^>]*\\bname=["\']' + escapeRe(name) + '["\'][^>]*>', 'gi');
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(html))) {
|
||||||
|
const tag = m[0];
|
||||||
|
if (!/\bchecked\b/i.test(tag)) continue;
|
||||||
|
const v = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
return v ? v[1] : '';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseFormChunk(html, formName) {
|
||||||
|
const head = html.match(new RegExp('<form[^>]*name=["\']' + escapeRe(formName) + '["\'][^>]*>', 'i'));
|
||||||
|
const body = html.match(new RegExp('<form[^>]*name=["\']' + escapeRe(formName) + '["\'][^>]*>([\\s\\S]*?)</form>', 'i'));
|
||||||
|
let action = '';
|
||||||
|
if (head) {
|
||||||
|
const am = head[0].match(/\baction=["']([^"']+)/i);
|
||||||
|
if (am) action = am[1];
|
||||||
|
}
|
||||||
|
return { action, chunk: body ? body[1] : '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHiddenFields(chunk) {
|
||||||
|
const fields = {};
|
||||||
|
const re = /<input\b[^>]*>/gi;
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(chunk))) {
|
||||||
|
const tag = m[0];
|
||||||
|
if (!/type=["']hidden["']/i.test(tag) && !/type=["']checkbox["']/i.test(tag) && !/type=["']radio["']/i.test(tag)) {
|
||||||
|
const nm = tag.match(/\bname=["']([^"']+)["']/i);
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
if (nm && !/^jp\.co\.interfactory\.framework\./i.test(nm[1])) {
|
||||||
|
fields[nm[1]] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const nm = tag.match(/\bname=["']([^"']+)["']/i);
|
||||||
|
if (!nm) continue;
|
||||||
|
const name = nm[1];
|
||||||
|
if (/^jp\.co\.interfactory\.framework\./i.test(name)) continue;
|
||||||
|
if (/type=["']checkbox["']/i.test(tag)) {
|
||||||
|
if (/\bchecked\b/i.test(tag)) {
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '1';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/type=["']radio["']/i.test(tag)) {
|
||||||
|
if (/\bchecked\b/i.test(tag)) {
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const vm = tag.match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = vm ? vm[1] : '';
|
||||||
|
}
|
||||||
|
const selRe = /<select\b[^>]*name=["']([^"']+)["'][^>]*>([\s\S]*?)<\/select>/gi;
|
||||||
|
let sm;
|
||||||
|
while ((sm = selRe.exec(chunk))) {
|
||||||
|
const name = sm[1];
|
||||||
|
const opt = sm[2].match(/<option[^>]*\bselected\b[^>]*>/i);
|
||||||
|
if (!opt) continue;
|
||||||
|
const v = opt[0].match(/\bvalue=["']([^"']*)["']/i);
|
||||||
|
fields[name] = v ? v[1] : '';
|
||||||
|
}
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractParksError(html) {
|
||||||
|
const text = html || '';
|
||||||
|
const pats = [
|
||||||
|
/form-error-message[\s\S]*?<li>([^<]+)/i,
|
||||||
|
/<li[^>]*>([^<]{4,200})<\/li>/i,
|
||||||
|
/class="error[^"]*"[^>]*>([^<]+)/i,
|
||||||
|
/errorMessage[^>]*>([^<]+)/i,
|
||||||
|
];
|
||||||
|
for (let i = 0; i < pats.length; i++) {
|
||||||
|
const m = text.match(pats[i]);
|
||||||
|
if (m && m[1] && m[1].trim()) return m[1].replace(/\s+/g, ' ').trim();
|
||||||
|
}
|
||||||
|
if (text.includes('セッションがタイムアウト') || text.includes('セキュリティのため')) {
|
||||||
|
return '会话超时,请刷新页面重新登录后再提交';
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function looksExecuteSuccess(resp) {
|
||||||
|
const t = (resp && resp.text) || '';
|
||||||
|
const u = (resp && resp.url) || '';
|
||||||
|
if (t.includes('会員情報を更新しました')) return true;
|
||||||
|
if (t.includes('form-message') && t.includes('更新しました')) return true;
|
||||||
|
if (u.includes('member_regist_confirm') && t.includes('更新')) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseToken(html) {
|
||||||
|
const m = (html || '').match(/name="token"\s+value="([0-9a-f]+)"/i);
|
||||||
|
return m ? m[1] : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMemberData(html) {
|
||||||
|
const m = (html || '').match(/var\s+member_data\s*=\s*(\{[\s\S]*?\})\s*;/);
|
||||||
|
if (!m) return {};
|
||||||
|
try {
|
||||||
|
return JSON.parse(m[1]);
|
||||||
|
} catch (e) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseProfile(html) {
|
||||||
|
const md = parseMemberData(html);
|
||||||
|
let tel = parseInput(html, 'TEL');
|
||||||
|
if (!tel) {
|
||||||
|
const tm = html.match(/(?<!\d)(070\d{8}|080\d{8}|090\d{8})(?!\d)/);
|
||||||
|
if (tm) tel = tm[1];
|
||||||
|
}
|
||||||
|
const y = parseInput(html, 'BIRTH_YEAR');
|
||||||
|
const mo = parseInput(html, 'BIRTH_MONTH');
|
||||||
|
const d = parseInput(html, 'BIRTH_DAY');
|
||||||
|
let birthday = (md.birth || '').replace(/\//g, '-');
|
||||||
|
if (y && mo && d) {
|
||||||
|
birthday = `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
|
||||||
|
}
|
||||||
|
const sex = parseCheckedRadio(html, 'SEX') || (md.sex || 'M').toString().charAt(0).toUpperCase();
|
||||||
|
return {
|
||||||
|
email: parseInput(html, 'PC_MAIL'),
|
||||||
|
last_name: parseInput(html, 'L_NAME'),
|
||||||
|
first_name: parseInput(html, 'F_NAME'),
|
||||||
|
last_name_kana: parseInput(html, 'L_KANA') || parseInput(html, 'L_NAME_KANA'),
|
||||||
|
first_name_kana: parseInput(html, 'F_KANA') || parseInput(html, 'F_NAME_KANA'),
|
||||||
|
nickname: parseInput(html, 'NICKNAME'),
|
||||||
|
addr1: parseSelected(html, 'ADDR1') || parseInput(html, 'ADDR1') || '東京都',
|
||||||
|
zip: (parseInput(html, 'ZIP') || '').replace(/-/g, ''),
|
||||||
|
addr2: parseInput(html, 'ADDR2'),
|
||||||
|
addr_street: parseInput(html, 'MEMBER.FREE_ITEM16'),
|
||||||
|
addr3: parseInput(html, 'ADDR3'),
|
||||||
|
tel,
|
||||||
|
gender: sex === 'F' || sex === '2' ? 'F' : (sex === 'M' || sex === '1' ? 'M' : 'M'),
|
||||||
|
birthday: birthday || '1990-01-01',
|
||||||
|
formFields: parseHiddenFields(parseFormChunk(html, 'memberFrm').chunk || html),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeBirthday(raw) {
|
||||||
|
const s = String(raw || '').trim();
|
||||||
|
if (!s) return '';
|
||||||
|
const m1 = s.match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);
|
||||||
|
if (m1) {
|
||||||
|
return `${m1[1]}-${String(parseInt(m1[2], 10)).padStart(2, '0')}-${String(parseInt(m1[3], 10)).padStart(2, '0')}`;
|
||||||
|
}
|
||||||
|
const digits = s.replace(/\D/g, '');
|
||||||
|
if (digits.length === 8) {
|
||||||
|
return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function bdayParts(bday) {
|
||||||
|
const norm = normalizeBirthday(bday) || '1990-01-01';
|
||||||
|
const m = norm.match(/^(\d{4})-(\d{1,2})-(\d{1,2})/);
|
||||||
|
if (!m) return { y: '1990', mo: '1', d: '1' };
|
||||||
|
return { y: m[1], mo: String(parseInt(m[2], 10)), d: String(parseInt(m[3], 10)) };
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 提交时(登录态)读取资料 + token */
|
||||||
|
async function loadProfileForSubmit() {
|
||||||
|
reportLog('提交: 开始读取编辑页');
|
||||||
|
const r = await httpGet('/member_regist.html?request=edit');
|
||||||
|
const loggedIn = r.text.includes('ログアウト') || !!parseMemberData(r.text).member_id || !!parseInput(r.text, 'PC_MAIL');
|
||||||
|
if (!loggedIn) {
|
||||||
|
reportLog('提交: 未登录');
|
||||||
|
throw new Error('未登录:请用 Safari 打开 parks2 完成登录(不要用无痕模式)');
|
||||||
|
}
|
||||||
|
const p = parseProfile(r.text);
|
||||||
|
if (!p.tel) {
|
||||||
|
reportLog('提交: 未解析到手机号');
|
||||||
|
throw new Error('未读取到手机号,无法安全提交');
|
||||||
|
}
|
||||||
|
reportLog('提交: 编辑页读取成功 ' + p.last_name + ' ' + p.first_name);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 提交到服务器:confirm(拿 token)→ execute */
|
||||||
|
async function submitNameBirthday(profile, ln, fn, birthday, password) {
|
||||||
|
const lk = profile.last_name_kana;
|
||||||
|
const fk = profile.first_name_kana;
|
||||||
|
const nick = profile.nickname || ln;
|
||||||
|
const bday = normalizeBirthday(birthday) || profile.birthday || '1990-01-01';
|
||||||
|
const { y, mo, d } = bdayParts(bday);
|
||||||
|
const editRef = ORIGIN + '/member_regist.html?request=edit';
|
||||||
|
const zip7 = String(profile.zip || '').replace(/-/g, '');
|
||||||
|
const addr1 = profile.addr1 || '東京都';
|
||||||
|
const addr2 = profile.addr2 || '';
|
||||||
|
const addrStreet = profile.addr_street || '';
|
||||||
|
const addr3 = profile.addr3 || '';
|
||||||
|
const sex = profile.gender || 'M';
|
||||||
|
if (!zip7 || !addr2 || !addrStreet) {
|
||||||
|
throw new Error('当前资料缺邮编/市区町村/番地(官网已改为必填)。请先在「会員情報変更」填完整地址,再回来改名字。');
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirm = Object.assign({}, profile.formFields || {}, {
|
||||||
|
request: 'confirm',
|
||||||
|
PC_MAIL_OLD: profile.email,
|
||||||
|
FOREIGN_LOGIN_PROVIDER_KIND: '',
|
||||||
|
MOBILE_MAIL_OLD: '',
|
||||||
|
mode: '1',
|
||||||
|
CART_MEMBER_REGIST: '',
|
||||||
|
MAIL_FLG_OLD: '1',
|
||||||
|
'SOCIAL_PLUS:SOCIAL_PLUS_ID': '',
|
||||||
|
'SOCIAL_PLUS:PROVIDER': '',
|
||||||
|
NICKNAME: nick,
|
||||||
|
'jp.co.interfactory.framework.trim.NICKNAME': '',
|
||||||
|
PC_MAIL: profile.email,
|
||||||
|
'jp.co.interfactory.framework.trim.PC_MAIL': '',
|
||||||
|
PASSWORD: password,
|
||||||
|
PASSWORD2: password,
|
||||||
|
SEX: sex,
|
||||||
|
BIRTH_YEAR: y,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_YEAR': '',
|
||||||
|
BIRTH_MONTH: mo,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_MONTH': '',
|
||||||
|
BIRTH_DAY: d,
|
||||||
|
'jp.co.interfactory.framework.trim.BIRTH_DAY': '',
|
||||||
|
ZIP: zip7,
|
||||||
|
'jp.co.interfactory.framework.trim.ZIP': '',
|
||||||
|
ADDR1: addr1,
|
||||||
|
ADDR2: addr2,
|
||||||
|
'jp.co.interfactory.framework.trim.ADDR2': '',
|
||||||
|
'MEMBER.FREE_ITEM16': addrStreet,
|
||||||
|
'jp.co.interfactory.framework.trim.MEMBER.FREE_ITEM16': '',
|
||||||
|
ADDR3: addr3,
|
||||||
|
'jp.co.interfactory.framework.trim.ADDR3': '',
|
||||||
|
TEL: profile.tel,
|
||||||
|
'jp.co.interfactory.framework.trim.TEL': '',
|
||||||
|
L_NAME: ln,
|
||||||
|
F_NAME: fn,
|
||||||
|
L_KANA: lk,
|
||||||
|
'jp.co.interfactory.framework.trim.L_KANA': '',
|
||||||
|
F_KANA: fk,
|
||||||
|
'jp.co.interfactory.framework.trim.F_KANA': '',
|
||||||
|
PC_MAIL_TYPE: '1',
|
||||||
|
MOBILE_MAIL_TYPE: '1',
|
||||||
|
});
|
||||||
|
if (!addr3) confirm['MEMBER.FREE_ITEM19'] = '1';
|
||||||
|
else delete confirm['MEMBER.FREE_ITEM19'];
|
||||||
|
|
||||||
|
reportLog('提交: POST confirm');
|
||||||
|
const r1 = await httpPost('/member_regist.html', confirm, editRef);
|
||||||
|
if (r1.text.includes('sms_authentication') || r1.url.includes('sms_authentication')) {
|
||||||
|
reportLog('提交: 触发 SMS 验证');
|
||||||
|
throw new Error('触发了 SMS 验证(请勿改手机号)');
|
||||||
|
}
|
||||||
|
const confirmParsed = parseFormChunk(r1.text, 'confirmForm');
|
||||||
|
const hidden = parseHiddenFields(confirmParsed.chunk);
|
||||||
|
const token = hidden.token || parseToken(r1.text);
|
||||||
|
if (!token) {
|
||||||
|
const err = extractParksError(r1.text) || 'confirm 失败,请检查密码是否正确';
|
||||||
|
reportLog('提交: confirm 未拿到 token → ' + err + ' | 响应片段: ' + String(r1.text || '').slice(0, 200));
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
reportLog('提交: token 已获取 (' + token.slice(0, 8) + '…)');
|
||||||
|
|
||||||
|
const execute = Object.assign({}, hidden, {
|
||||||
|
request: 'execute',
|
||||||
|
token,
|
||||||
|
MAIL_FLG: hidden.MAIL_FLG || '1',
|
||||||
|
SEX: sex,
|
||||||
|
BIRTH_YEAR: y,
|
||||||
|
BIRTH_MONTH: mo,
|
||||||
|
BIRTH_DAY: d,
|
||||||
|
BIRTH: y + '/' + mo + '/' + d,
|
||||||
|
ZIP: zip7 || hidden.ZIP || '',
|
||||||
|
ADDR1: addr1 || hidden.ADDR1 || '',
|
||||||
|
ADDR2: addr2 || hidden.ADDR2 || '',
|
||||||
|
'MEMBER.FREE_ITEM16': addrStreet || hidden['MEMBER.FREE_ITEM16'] || '',
|
||||||
|
ADDR3: addr3 || hidden.ADDR3 || '',
|
||||||
|
TEL: profile.tel,
|
||||||
|
L_NAME: ln,
|
||||||
|
F_NAME: fn,
|
||||||
|
L_KANA: lk,
|
||||||
|
F_KANA: fk,
|
||||||
|
NICKNAME: nick,
|
||||||
|
PC_MAIL: profile.email,
|
||||||
|
PASSWORD: password,
|
||||||
|
PASSWORD2: password,
|
||||||
|
});
|
||||||
|
if (addr3) delete execute['MEMBER.FREE_ITEM19'];
|
||||||
|
else execute['MEMBER.FREE_ITEM19'] = '1';
|
||||||
|
|
||||||
|
const action = confirmParsed.action || '/member_regist_confirm.html';
|
||||||
|
reportLog('提交: POST execute → ' + action);
|
||||||
|
const r2 = await httpPost(action, execute, ORIGIN + '/member_regist.html');
|
||||||
|
if (r2.text.includes('sms_authentication') || r2.url.includes('sms_authentication')) {
|
||||||
|
reportLog('提交: execute 触发 SMS');
|
||||||
|
throw new Error('execute 触发 SMS');
|
||||||
|
}
|
||||||
|
if (!looksExecuteSuccess(r2)) {
|
||||||
|
const afterEdit = await httpGet('/member_regist.html?request=edit', ORIGIN + '/member_mypage.html');
|
||||||
|
const after = parseProfile(afterEdit.text);
|
||||||
|
if (after.last_name === ln && after.first_name === fn) {
|
||||||
|
reportLog('提交: 成功(重读验证一致)');
|
||||||
|
return { last_name: ln, first_name: fn, birthday: `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}` };
|
||||||
|
}
|
||||||
|
const err = extractParksError(r2.text) || 'execute 未返回成功页';
|
||||||
|
reportLog('提交: execute 失败 → ' + err + ' | 响应片段: ' + String(r2.text || '').slice(0, 200));
|
||||||
|
throw new Error(err);
|
||||||
|
}
|
||||||
|
reportLog('提交: 成功(响应含更新确认)');
|
||||||
|
return { last_name: ln, first_name: fn, birthday: `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}` };
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- UI ---------- */
|
||||||
|
|
||||||
|
const css = `
|
||||||
|
#${ICON_ID}{
|
||||||
|
position:fixed;top:max(14px, env(safe-area-inset-top));right:14px;z-index:2147483646;
|
||||||
|
width:46px;height:46px;border-radius:23px;border:none;cursor:pointer;
|
||||||
|
background:linear-gradient(135deg,#e60012,#b8000f);color:#fff;
|
||||||
|
font-size:16px;font-weight:700;box-shadow:0 4px 16px rgba(0,0,0,.35);
|
||||||
|
display:flex;align-items:center;justify-content:center;
|
||||||
|
}
|
||||||
|
#${PANEL_ID}{
|
||||||
|
position:fixed;left:0;right:0;bottom:0;z-index:2147483647;
|
||||||
|
background:#fff;border-radius:16px 16px 0 0;padding:16px 16px calc(20px + env(safe-area-inset-bottom));
|
||||||
|
box-sizing:border-box;max-height:85vh;overflow:auto;
|
||||||
|
transform:translateY(110%);transition:transform .25s ease;
|
||||||
|
font:14px/1.45 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB",sans-serif;
|
||||||
|
color:#222;
|
||||||
|
}
|
||||||
|
#${PANEL_ID}.open{transform:translateY(0);}
|
||||||
|
#${PANEL_ID} *{box-sizing:border-box;}
|
||||||
|
.cpx-title{font-size:17px;font-weight:700;margin:0 0 4px;}
|
||||||
|
.cpx-sub{font-size:12px;color:#666;margin:0 0 10px;line-height:1.5;}
|
||||||
|
.cpx-row{margin-bottom:10px;}
|
||||||
|
.cpx-row label{display:block;font-size:12px;color:#444;margin-bottom:4px;}
|
||||||
|
.cpx-row input{width:100%;height:42px;border:1px solid #ddd;border-radius:8px;padding:0 12px;font-size:16px;}
|
||||||
|
.cpx-row input:focus{outline:none;border-color:#e60012;}
|
||||||
|
.cpx-btns{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px;}
|
||||||
|
.cpx-btn{height:44px;border:none;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;}
|
||||||
|
.cpx-btn-primary{background:#e60012;color:#fff;}
|
||||||
|
.cpx-btn-secondary{background:#f3f4f6;color:#111;}
|
||||||
|
.cpx-log{margin-top:12px;font-size:12px;line-height:1.55;color:#333;background:#f9fafb;border-radius:8px;padding:10px;white-space:pre-wrap;max-height:150px;overflow:auto;}
|
||||||
|
.cpx-close{position:absolute;right:12px;top:12px;border:none;background:#eee;width:32px;height:32px;border-radius:16px;font-size:18px;cursor:pointer;}
|
||||||
|
.cpx-warn{font-size:11px;color:#b45309;background:#fffbeb;border:1px solid #fcd34d;border-radius:8px;padding:8px 10px;margin-bottom:10px;line-height:1.45;}
|
||||||
|
`;
|
||||||
|
|
||||||
|
function ensureStyles() {
|
||||||
|
if (document.getElementById(STYLE_ID)) return;
|
||||||
|
const st = document.createElement('style');
|
||||||
|
st.id = STYLE_ID;
|
||||||
|
st.textContent = css;
|
||||||
|
document.head.appendChild(st);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildUI() {
|
||||||
|
ensureStyles();
|
||||||
|
|
||||||
|
const icon = document.createElement('button');
|
||||||
|
icon.id = ICON_ID;
|
||||||
|
icon.type = 'button';
|
||||||
|
icon.textContent = '改';
|
||||||
|
icon.title = '改会员资料(v0.10.1)';
|
||||||
|
|
||||||
|
const panel = document.createElement('div');
|
||||||
|
panel.id = PANEL_ID;
|
||||||
|
panel.innerHTML = `
|
||||||
|
<button class="cpx-close" id="cpxClose" type="button">×</button>
|
||||||
|
<p class="cpx-title">Bandai Parks 会员资料(v0.10.1)</p>
|
||||||
|
<p class="cpx-sub">「读取姓名」直接解析当前页面 DOM(零请求);「提交」时才联网走登录态拿 token。</p>
|
||||||
|
<div class="cpx-warn">⚠ 读取不联网一定成功;提交会真实修改服务器资料(姓名+生日)。</div>
|
||||||
|
<div class="cpx-row"><label>姓(L_NAME)</label><input id="cpxL" autocomplete="off" placeholder="姓" /></div>
|
||||||
|
<div class="cpx-row"><label>名(F_NAME)</label><input id="cpxF" autocomplete="off" placeholder="名" /></div>
|
||||||
|
<div class="cpx-row"><label>生日(BIRTH,YYYY-MM-DD,官网可能锁定)</label><input id="cpxB" type="date" placeholder="1999-07-12" /></div>
|
||||||
|
<div class="cpx-row"><label>登录密码(只填密码,提交必填,不保存)</label><input id="cpxP" type="password" autocomplete="current-password" placeholder="只填登录密码" /></div>
|
||||||
|
<div class="cpx-btns">
|
||||||
|
<button class="cpx-btn cpx-btn-primary" id="cpxLoad" type="button">读取姓名(DOM)</button>
|
||||||
|
<button class="cpx-btn cpx-btn-secondary" id="cpxClear" type="button">清空</button>
|
||||||
|
<button class="cpx-btn cpx-btn-primary" id="cpxSubmit" type="button" style="grid-column:1/-1">提交到服务器(登录态拿 token)</button>
|
||||||
|
</div>
|
||||||
|
<div class="cpx-log" id="cpxLog">就绪:点「读取姓名」从当前页面 DOM 提取。</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
document.body.appendChild(icon);
|
||||||
|
document.body.appendChild(panel);
|
||||||
|
|
||||||
|
const logEl = panel.querySelector('#cpxLog');
|
||||||
|
const setLog = (msg) => { logEl.textContent = msg; };
|
||||||
|
const open = () => panel.classList.add('open');
|
||||||
|
const close = () => panel.classList.remove('open');
|
||||||
|
|
||||||
|
icon.addEventListener('click', () => {
|
||||||
|
if (panel.classList.contains('open')) close();
|
||||||
|
else open();
|
||||||
|
});
|
||||||
|
panel.querySelector('#cpxClose').addEventListener('click', close);
|
||||||
|
|
||||||
|
// 读取:直接读当前页面 DOM(零请求)
|
||||||
|
panel.querySelector('#cpxLoad').addEventListener('click', () => {
|
||||||
|
reportLog('用户点击「读取姓名」');
|
||||||
|
const n = readNameFromDom();
|
||||||
|
if (!n) {
|
||||||
|
setLog('❌ 当前页面没有姓名信息。\n请到以下页面再点:\n• 编辑页 member_regist.html?request=edit\n• 会员页 member_mypage.html');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
panel.querySelector('#cpxL').value = n.last_name;
|
||||||
|
panel.querySelector('#cpxF').value = n.first_name;
|
||||||
|
setLog('✅ 已从页面 DOM 读取(来源:' + n.source + ')\n姓:' + n.last_name + '\n名:' + n.first_name);
|
||||||
|
});
|
||||||
|
|
||||||
|
panel.querySelector('#cpxClear').addEventListener('click', () => {
|
||||||
|
panel.querySelector('#cpxL').value = '';
|
||||||
|
panel.querySelector('#cpxF').value = '';
|
||||||
|
panel.querySelector('#cpxB').value = '';
|
||||||
|
setLog('已清空。');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 提交:登录态 confirm → execute(拿 token)
|
||||||
|
panel.querySelector('#cpxSubmit').addEventListener('click', async () => {
|
||||||
|
const ln = panel.querySelector('#cpxL').value.trim();
|
||||||
|
const fn = panel.querySelector('#cpxF').value.trim();
|
||||||
|
const bRaw = panel.querySelector('#cpxB').value.trim();
|
||||||
|
const pwd = panel.querySelector('#cpxP').value;
|
||||||
|
if (!ln || !fn) { setLog('请先读取或填写姓和名'); return; }
|
||||||
|
if (!pwd) { setLog('请填写登录密码'); return; }
|
||||||
|
setLog('提交中…(confirm → execute,最多等 60 秒)');
|
||||||
|
reportLog('用户点击「提交」姓=' + ln + ' 名=' + fn);
|
||||||
|
try {
|
||||||
|
const profile = await loadProfileForSubmit();
|
||||||
|
const res = await submitNameBirthday(profile, ln, fn, bRaw, pwd);
|
||||||
|
setLog('✅ 已提交到服务器并永久生效\n新氏名:' + res.last_name + ' ' + res.first_name + '\n生日:' + res.birthday);
|
||||||
|
} catch (e) {
|
||||||
|
setLog('❌ ' + e.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- 启动 ---------- */
|
||||||
|
|
||||||
|
function boot() {
|
||||||
|
reportLog('BOOT UI v0.10.1');
|
||||||
|
if (document.body) {
|
||||||
|
buildUI();
|
||||||
|
reportLog('UI 已注入');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const t = setInterval(() => {
|
||||||
|
if (document.body) {
|
||||||
|
clearInterval(t);
|
||||||
|
buildUI();
|
||||||
|
reportLog('UI 已注入');
|
||||||
|
}
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
boot();
|
||||||
|
})();
|
||||||
@@ -0,0 +1,349 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>固定网站显示替换 - 脚本下载</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: -apple-system, sans-serif; padding: 20px; max-width: 640px; margin: 0 auto; }
|
||||||
|
.acc-list { max-height: 70vh; overflow-y: auto; border: 1px solid #e0c9a6; border-radius: 10px; background: #fdf6ec; padding: 8px; display: flex; flex-wrap: wrap; gap: 6px; align-content: flex-start; }
|
||||||
|
.acc-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 8px; border: 1px solid #e0c9a6; border-radius: 16px; background: #fff; font-size: 12px; line-height: 1.4; max-width: 100%; }
|
||||||
|
.acc-chip.done { opacity: 0.45; background: #f0ead9; }
|
||||||
|
.acc-chip.done .acc-mail, .acc-chip.done .acc-pass { text-decoration: line-through; }
|
||||||
|
.acc-chip input[type="checkbox"] { width: 16px; height: 16px; margin: 0; flex: 0 0 auto; }
|
||||||
|
.acc-mail { font-weight: 600; word-break: break-all; }
|
||||||
|
.acc-pass { color: #6b4f2a; }
|
||||||
|
.time-tag { font-size: 11px; color: #8a5a00; background: #fdf0d8; border-radius: 10px; padding: 1px 6px; }
|
||||||
|
.progress-bar { padding: 10px 14px; border-radius: 10px; background: #eef4ff; color: #0a66c2; font-size: 15px; font-weight: 600; margin-bottom: 8px; border: 1px solid #c9ddf5; }
|
||||||
|
.acc-mail { cursor: pointer; }
|
||||||
|
.acc-mail:active, .acc-pass:active { opacity: 0.6; }
|
||||||
|
.acc-pass { cursor: pointer; }
|
||||||
|
.locked-box { padding: 14px; border: 1px solid #e0c9a6; border-radius: 10px; background: #fdf6ec; margin-bottom: 8px; }
|
||||||
|
.store-block { margin-bottom: 24px; }
|
||||||
|
|
||||||
|
/* ===== 火影忍者彩蛋按钮(官网风格:黑底+橙色火焰+倒计时块) ===== */
|
||||||
|
.naruto-zone { display: flex; gap: 12px; margin: 20px 0; }
|
||||||
|
.naruto-btn {
|
||||||
|
flex: 1; position: relative; padding: 14px 10px 12px; border: 1px solid rgba(255, 140, 0, 0.7); border-radius: 6px;
|
||||||
|
background: #0a0a0a; color: #ffb347; cursor: pointer;
|
||||||
|
font-size: 14px; font-weight: 700; font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
|
||||||
|
letter-spacing: 1px; text-align: center;
|
||||||
|
box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.15), 0 4px 20px rgba(255, 100, 0, 0.12);
|
||||||
|
transition: transform 0.12s, box-shadow 0.12s, border-color 0.12s;
|
||||||
|
}
|
||||||
|
.naruto-btn:hover { border-color: #ff8c00; box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.35), 0 4px 24px rgba(255, 100, 0, 0.28); }
|
||||||
|
.naruto-btn:active { transform: scale(0.96); }
|
||||||
|
/* 四角橙点装饰(官网风格的角标) */
|
||||||
|
.naruto-btn .corner { position: absolute; width: 7px; height: 7px; background: #ff8c00; box-shadow: 0 0 6px rgba(255, 140, 0, 0.9); }
|
||||||
|
.naruto-btn .corner.tl { top: 5px; left: 5px; }
|
||||||
|
.naruto-btn .corner.tr { top: 5px; right: 5px; }
|
||||||
|
.naruto-btn .corner.bl { bottom: 5px; left: 5px; }
|
||||||
|
.naruto-btn .corner.br { bottom: 5px; right: 5px; }
|
||||||
|
/* 顶部小标签(官网的 SECONDS/DAYS 小字样式) */
|
||||||
|
.naruto-btn .btn-eng { display: block; font-size: 9px; letter-spacing: 3px; color: rgba(255, 140, 0, 0.65); font-weight: 600; margin-bottom: 5px; }
|
||||||
|
.naruto-btn .btn-label { display: block; font-size: 15px; font-weight: 800; text-shadow: 0 0 10px rgba(255, 140, 0, 0.7); }
|
||||||
|
.naruto-btn .btn-sub { display: block; font-size: 10px; font-weight: 400; color: #8a6a3a; margin-top: 5px; letter-spacing: 2px; }
|
||||||
|
/* 底部橙色火焰细线(官网的强调线) */
|
||||||
|
.naruto-btn .btn-fire { position: absolute; left: 12%; right: 12%; bottom: 0; height: 2px; background: linear-gradient(90deg, transparent, #ff8c00 30%, #ffd700 50%, #ff8c00 70%, transparent); box-shadow: 0 0 8px rgba(255, 140, 0, 0.8); }
|
||||||
|
|
||||||
|
/* ===== 5秒穿越全屏loading(官网倒计时风格) ===== */
|
||||||
|
#time-jump-overlay {
|
||||||
|
position: fixed; inset: 0; z-index: 99999; display: none; flex-direction: column; align-items: center; justify-content: center;
|
||||||
|
background: radial-gradient(ellipse at center, #140a02 0%, #000 80%);
|
||||||
|
}
|
||||||
|
#time-jump-overlay.on { display: flex; }
|
||||||
|
/* 官网式倒计时大数字块 */
|
||||||
|
#tj-count-block {
|
||||||
|
position: relative; width: 180px; height: 120px; display: flex; align-items: center; justify-content: center;
|
||||||
|
border: 1px solid rgba(255, 140, 0, 0.5); background: rgba(0, 0, 0, 0.6); border-radius: 4px;
|
||||||
|
box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.12), 0 0 40px rgba(255, 100, 0, 0.15), inset 0 0 30px rgba(255, 100, 0, 0.08);
|
||||||
|
}
|
||||||
|
#tj-count-block .tj-corner { position: absolute; width: 10px; height: 10px; border: 1px solid #ff8c00; }
|
||||||
|
#tj-count-block .tj-corner.tl { top: 6px; left: 6px; border-right: none; border-bottom: none; }
|
||||||
|
#tj-count-block .tj-corner.tr { top: 6px; right: 6px; border-left: none; border-bottom: none; }
|
||||||
|
#tj-count-block .tj-corner.bl { bottom: 6px; left: 6px; border-right: none; border-top: none; }
|
||||||
|
#tj-count-block .tj-corner.br { bottom: 6px; right: 6px; border-left: none; border-top: none; }
|
||||||
|
#tj-count { font-size: 72px; font-weight: 900; color: #ff8c00; text-shadow: 0 0 24px rgba(255, 140, 0, 0.9), 0 0 60px rgba(255, 80, 0, 0.5); font-variant-numeric: tabular-nums; line-height: 1; }
|
||||||
|
#tj-unit { position: absolute; bottom: 8px; left: 0; right: 0; text-align: center; font-size: 10px; letter-spacing: 4px; color: rgba(255, 140, 0, 0.6); font-weight: 600; }
|
||||||
|
/* 官网 SECONDS 小标签 */
|
||||||
|
#tj-eng { font-size: 10px; letter-spacing: 6px; color: rgba(255, 140, 0, 0.55); font-weight: 700; margin-bottom: 10px; }
|
||||||
|
#tj-shuriken {
|
||||||
|
font-size: 30px; color: #ff8c00; margin-bottom: 14px; text-shadow: 0 0 20px rgba(255, 140, 0, 0.9);
|
||||||
|
animation: shuriken-spin 1.4s linear infinite; opacity: 0.9;
|
||||||
|
}
|
||||||
|
#tj-text { color: #8a6a3a; font-size: 12px; margin-top: 16px; letter-spacing: 4px; }
|
||||||
|
#tj-bar { width: 180px; height: 3px; background: rgba(255, 140, 0, 0.15); margin-top: 14px; overflow: hidden; }
|
||||||
|
#tj-bar-fill { height: 100%; width: 0%; background: linear-gradient(90deg, #ff8c00, #ffd700); box-shadow: 0 0 8px rgba(255, 200, 60, 0.9); transition: width 5s linear; }
|
||||||
|
@keyframes shuriken-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
/* 小屏(iPhone SE 等窄屏) */
|
||||||
|
@media (max-width: 380px) {
|
||||||
|
.acc-chip { max-width: 100%; }
|
||||||
|
.acc-chip .btn-acc { padding: 4px 8px; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>📦 下载脚本(最新版)</h2>
|
||||||
|
<ul style="font-size:18px;line-height:2">
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v1.6.1.user.js')" style="color:#0a66c2">code-v1.6.1.user.js</a> ⭐ 最新版 (v1.6.1)</li>
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v1.6.2jr.user.js')" style="color:#0a66c2">code-v1.6.2jr.user.js</a> 兼容版 (v1.6.2)</li>
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v0.6.1.user.js')" style="color:#0a66c2">code-v0.6.1.user.js</a> (v0.6.1)</li>
|
||||||
|
</ul>
|
||||||
|
<p style="color:#888">在 iPhone 上点 code-v0.7.0.user.js(最新版)即开始下载,然后用 Userscripts 应用导入。<br>需要旧版本时点对应版本文件。</p>
|
||||||
|
<h3>🧪 注入测试(排查用)</h3>
|
||||||
|
<ul style="font-size:18px;line-height:2">
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('test-inject.user.js')" style="color:#0a66c2">test-inject.user.js</a> (任意网站左上角显示蓝色标记,验证 Userscripts 是否正常注入)</li>
|
||||||
|
</ul>
|
||||||
|
<hr>
|
||||||
|
<h3>📌 bookmarklet 书签版(不依赖扩展)</h3>
|
||||||
|
<p style="font-size:15px;line-height:1.7">不想装扩展?点下方按钮把新脚本复制到剪贴板,然后粘贴到书签 URL 即可:<br>打开任意网页 → 分享 → <b>添加书签</b> → 书本按钮 → <b>编辑</b> → 把地址全部删掉 → <b>长按粘贴</b> → 完成。<br>之后在目标网站点这个书签,文字立即替换。</p>
|
||||||
|
<button onclick="copyBookmarklet()" style="width:100%;padding:14px;font-size:17px;border:none;border-radius:10px;background:#0a66c2;color:#fff;margin:4px 0 14px">📋 复制新脚本到剪贴板</button>
|
||||||
|
<p style="color:#888">💡 复制成功后,把内容粘贴到任意书签的「地址」栏(以 <code>javascript:</code> 开头)。<br>规则配置与油猴版共用,首次点击弹出设置面板时填写即可。</p>
|
||||||
|
<hr>
|
||||||
|
<h3>🔗 目标网站</h3>
|
||||||
|
<p style="font-size:18px;line-height:1.8">
|
||||||
|
<a href="https://parks2.bandainamco-am.co.jp/" target="_blank" rel="noopener" style="color:#0a66c2;word-break:break-all">https://parks2.bandainamco-am.co.jp/</a>
|
||||||
|
</p>
|
||||||
|
<p style="color:#888">👆 点击在新页签打开网站;长按链接可弹出菜单「拷贝」,复制网址。</p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<script src="shibuya-accounts.js"></script>
|
||||||
|
<script src="nagoya-accounts.js"></script>
|
||||||
|
<script src="koshigaya-accounts.js"></script>
|
||||||
|
<script>
|
||||||
|
var PASSCODE = {
|
||||||
|
shibuya: "8899",
|
||||||
|
nagoya: "1358",
|
||||||
|
koshigaya: "888888"
|
||||||
|
};
|
||||||
|
|
||||||
|
var STORES = {
|
||||||
|
shibuya: { key: "acc-key-shibuya", msg: "acc-msg-shibuya", locked: "acc-locked-shibuya", area: "acc-area-shibuya", list: "acc-list-shibuya", data: SHIBUYA_ACCOUNTS, doneKey: "done-shibuya" },
|
||||||
|
nagoya: { key: "acc-key-nagoya", msg: "acc-msg-nagoya", locked: "acc-locked-nagoya", area: "acc-area-nagoya", list: "acc-list-nagoya", data: NAGOYA_ACCOUNTS, doneKey: "done-nagoya" },
|
||||||
|
koshigaya: { key: "acc-key-koshigaya", msg: "acc-msg-koshigaya", locked: "acc-locked-koshigaya", area: "acc-area-koshigaya", list: "acc-list-koshigaya", data: KOSHIGAYA_ACCOUNTS, doneKey: "done-koshigaya" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// 每个店铺的完成状态(localStorage)
|
||||||
|
function loadDone(storeName) {
|
||||||
|
try { return JSON.parse(localStorage.getItem(STORES[storeName].doneKey)) || {}; }
|
||||||
|
catch (e) { return {}; }
|
||||||
|
}
|
||||||
|
function saveDone(storeName, done) {
|
||||||
|
try { localStorage.setItem(STORES[storeName].doneKey, JSON.stringify(done)); } catch (e) { }
|
||||||
|
}
|
||||||
|
function toggleDone(storeName, email, cb) {
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
if (cb.checked) done[email] = true;
|
||||||
|
else delete done[email];
|
||||||
|
saveDone(storeName, done);
|
||||||
|
var chip = cb.closest('.acc-chip');
|
||||||
|
if (chip) chip.classList.toggle('done', cb.checked);
|
||||||
|
updateProgress(storeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function forceDownload(filename) {
|
||||||
|
var btn = event && event.target ? event.target : null;
|
||||||
|
if (btn) {
|
||||||
|
var old = btn.textContent;
|
||||||
|
btn.textContent = '下载中…';
|
||||||
|
setTimeout(function () { btn.textContent = old; }, 3000);
|
||||||
|
}
|
||||||
|
fetch(filename)
|
||||||
|
.then(function (r) { return r.blob(); })
|
||||||
|
.then(function (blob) {
|
||||||
|
var a = document.createElement('a');
|
||||||
|
var url = URL.createObjectURL(blob);
|
||||||
|
a.href = url;
|
||||||
|
a.download = filename;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
setTimeout(function () { URL.revokeObjectURL(url); }, 10000);
|
||||||
|
})
|
||||||
|
.catch(function () {
|
||||||
|
window.location.href = filename;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function legacyCopy(text, done) {
|
||||||
|
var ta = document.createElement('textarea');
|
||||||
|
ta.value = text;
|
||||||
|
ta.style.position = 'fixed';
|
||||||
|
ta.style.opacity = '0';
|
||||||
|
document.body.appendChild(ta);
|
||||||
|
ta.focus();
|
||||||
|
ta.select();
|
||||||
|
ta.setSelectionRange(0, text.length);
|
||||||
|
try { document.execCommand('copy'); } catch (e) { /* ignore */ }
|
||||||
|
document.body.removeChild(ta);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyText(text, done) {
|
||||||
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||||
|
navigator.clipboard.writeText(text).then(done, function () { legacyCopy(text, done); });
|
||||||
|
} else {
|
||||||
|
legacyCopy(text, done);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 火影彩蛋:穿越到5秒后 =====
|
||||||
|
var tjTimer = null;
|
||||||
|
function timeJump5s() {
|
||||||
|
if (tjTimer) return;
|
||||||
|
var overlay = document.getElementById('time-jump-overlay');
|
||||||
|
var count = document.getElementById('tj-count');
|
||||||
|
var fill = document.getElementById('tj-bar-fill');
|
||||||
|
overlay.classList.add('on');
|
||||||
|
count.textContent = '5';
|
||||||
|
fill.style.transition = 'none';
|
||||||
|
fill.style.width = '0%';
|
||||||
|
void fill.offsetWidth;
|
||||||
|
fill.style.transition = 'width 5s linear';
|
||||||
|
fill.style.width = '100%';
|
||||||
|
tjTimer = setInterval(function () {
|
||||||
|
var left = Number(count.textContent) - 1;
|
||||||
|
if (left > 0) {
|
||||||
|
count.textContent = String(left);
|
||||||
|
} else {
|
||||||
|
clearInterval(tjTimer);
|
||||||
|
tjTimer = null;
|
||||||
|
overlay.classList.remove('on');
|
||||||
|
showToast('✅ 已穿越到5秒后!');
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 火影彩蛋:穿越到25号 =====
|
||||||
|
function jumpTo25() {
|
||||||
|
showToast('🕘 25号开启,敬请期待!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 轻量 toast 提示
|
||||||
|
function showToast(msg) {
|
||||||
|
var t = document.getElementById('toast-tip');
|
||||||
|
if (!t) {
|
||||||
|
t = document.createElement('div');
|
||||||
|
t.id = 'toast-tip';
|
||||||
|
t.style.cssText = 'position:fixed;left:50%;bottom:120px;transform:translateX(-50%);background:rgba(0,0,0,0.8);color:#fff;padding:10px 18px;border-radius:20px;font-size:14px;z-index:9999;opacity:0;transition:opacity .25s;pointer-events:none;max-width:80%;text-align:center;word-break:break-all';
|
||||||
|
document.body.appendChild(t);
|
||||||
|
}
|
||||||
|
t.textContent = msg;
|
||||||
|
t.style.opacity = '1';
|
||||||
|
clearTimeout(t._timer);
|
||||||
|
t._timer = setTimeout(function () { t.style.opacity = '0'; }, 1800);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 点击账号/密码复制并 toast 提示
|
||||||
|
function copyWithTip(text, label) {
|
||||||
|
copyText(text, function () {
|
||||||
|
showToast(label + ' 已复制:' + text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// bookmarklet 复制:拉取 bookmarklet.txt 并复制到剪贴板
|
||||||
|
function copyBookmarklet() {
|
||||||
|
var btn = event && event.target ? event.target : null;
|
||||||
|
if (btn) {
|
||||||
|
var old = btn.textContent;
|
||||||
|
btn.textContent = '⏳ 正在加载…';
|
||||||
|
setTimeout(function () { btn.textContent = old; }, 3000);
|
||||||
|
}
|
||||||
|
fetch('bookmarklet.txt')
|
||||||
|
.then(function (r) {
|
||||||
|
if (!r.ok) throw new Error('HTTP ' + r.status);
|
||||||
|
return r.text();
|
||||||
|
})
|
||||||
|
.then(function (text) {
|
||||||
|
copyText(text, function () {
|
||||||
|
showToast('✅ 新脚本已复制!去粘贴到书签地址栏吧');
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(function (e) {
|
||||||
|
showToast('❌ 加载失败:' + (e && e.message ? e.message : '未知错误'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新完成进度
|
||||||
|
function updateProgress(storeName) {
|
||||||
|
var cfg = STORES[storeName];
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
var total = cfg.data.length;
|
||||||
|
var count = 0;
|
||||||
|
cfg.data.forEach(function (item) {
|
||||||
|
if (done[String(item.email || "")]) count++;
|
||||||
|
});
|
||||||
|
var pct = total > 0 ? ((count / total) * 100).toFixed(2) : "0.00";
|
||||||
|
var el = document.getElementById("progress-" + storeName);
|
||||||
|
if (el) el.textContent = "完成 " + count + "/" + total + " (" + pct + "%)";
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlockStore(storeName) {
|
||||||
|
var cfg = STORES[storeName];
|
||||||
|
var key = document.getElementById(cfg.key).value.trim();
|
||||||
|
var msg = document.getElementById(cfg.msg);
|
||||||
|
if (key !== PASSCODE[storeName]) {
|
||||||
|
msg.textContent = '❌ 口令错误';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msg.textContent = '';
|
||||||
|
document.getElementById(cfg.locked).style.display = 'none';
|
||||||
|
var area = document.getElementById(cfg.area);
|
||||||
|
area.style.display = '';
|
||||||
|
var list = document.getElementById(cfg.list);
|
||||||
|
list.innerHTML = '';
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
cfg.data.forEach(function (item, i) {
|
||||||
|
var email = String(item.email || "");
|
||||||
|
var isDone = !!done[email];
|
||||||
|
var row = document.createElement('span');
|
||||||
|
row.className = 'acc-chip' + (isDone ? ' done' : '');
|
||||||
|
row.innerHTML =
|
||||||
|
'<input type="checkbox"' + (isDone ? ' checked' : '') + ' onchange="toggleDone(\'' + storeName + '\', \'' + email.replace(/'/g, "\\'") + '\', this)">' +
|
||||||
|
'<span class="acc-mail" id="acc-mail-' + storeName + '-' + i + '" onclick="copyWithTip(document.getElementById(\'acc-mail-' + storeName + '-' + i + '\').textContent, \'账号\')">' + email.replace(/</g, '<') + '</span>' +
|
||||||
|
'<span class="acc-pass" id="acc-pass-' + storeName + '-' + i + '" onclick="copyWithTip(document.getElementById(\'acc-pass-' + storeName + '-' + i + '\').textContent, \'密码\')">' + String(item.pass || "").replace(/</g, '<') + '</span>' +
|
||||||
|
(item.time ? '<span class="time-tag">' + item.time + '</span>' : '');
|
||||||
|
list.appendChild(row);
|
||||||
|
});
|
||||||
|
updateProgress(storeName);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- ===== 火影忍者彩蛋按钮(官网风格) ===== -->
|
||||||
|
<div class="naruto-zone">
|
||||||
|
<button class="naruto-btn" onclick="timeJump5s()">
|
||||||
|
<span class="corner tl"></span><span class="corner tr"></span>
|
||||||
|
<span class="corner bl"></span><span class="corner br"></span>
|
||||||
|
<span class="btn-eng">TIME JUMP</span>
|
||||||
|
<span class="btn-label">🌀 穿越到5秒后</span>
|
||||||
|
<span class="btn-sub">忍法·時空間忍術</span>
|
||||||
|
<span class="btn-fire"></span>
|
||||||
|
</button>
|
||||||
|
<button class="naruto-btn" onclick="jumpTo25()">
|
||||||
|
<span class="corner tl"></span><span class="corner tr"></span>
|
||||||
|
<span class="corner bl"></span><span class="corner br"></span>
|
||||||
|
<span class="btn-eng">NEXT DAY</span>
|
||||||
|
<span class="btn-label">🌀 穿越到25号</span>
|
||||||
|
<span class="btn-sub">忍法·未来予知</span>
|
||||||
|
<span class="btn-fire"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 5秒穿越全屏loading(官网倒计时风格) -->
|
||||||
|
<div id="time-jump-overlay">
|
||||||
|
<div id="tj-eng">SECONDS</div>
|
||||||
|
<div id="tj-shuriken">✴</div>
|
||||||
|
<div id="tj-count-block">
|
||||||
|
<span class="tj-corner tl"></span><span class="tj-corner tr"></span>
|
||||||
|
<span class="tj-corner bl"></span><span class="tj-corner br"></span>
|
||||||
|
<span id="tj-count">5</span>
|
||||||
|
<span id="tj-unit">秒</span>
|
||||||
|
</div>
|
||||||
|
<div id="tj-bar"><div id="tj-bar-fill"></div></div>
|
||||||
|
<div id="tj-text">時空忍術発動中…</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="height:300px"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,302 @@
|
|||||||
|
const NAGOYA_ACCOUNTS = [
|
||||||
|
{
|
||||||
|
"email": "BritneySmithamucst@hotmail.com",
|
||||||
|
"pass": "Pl012150",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SchlieperTombs663@outlook.com",
|
||||||
|
"pass": "Kx789719",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RondeNoblewoman7262@outlook.com",
|
||||||
|
"pass": "Kc839781",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LouveniaHegmannbcjn@hotmail.com",
|
||||||
|
"pass": "Ut525273",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NormentChimenti20@outlook.com",
|
||||||
|
"pass": "Ho621820",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ArauzKrysiak0022@outlook.com",
|
||||||
|
"pass": "Hl210773",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RoetzlerLenske9131@outlook.com",
|
||||||
|
"pass": "Xz915133",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CherubinoManusyants1823@outlook.com",
|
||||||
|
"pass": "Rr093458",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HabyCena5436@outlook.com",
|
||||||
|
"pass": "Nf474656",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MankoSaulnier74@outlook.com",
|
||||||
|
"pass": "Hh873737",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "TetersElmo602@outlook.com",
|
||||||
|
"pass": "Vj255440",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SchoemerPerrins2672@outlook.com",
|
||||||
|
"pass": "Sm610507",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LawriePloude805@outlook.com",
|
||||||
|
"pass": "Na391011",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GummoSeburg0078@outlook.com",
|
||||||
|
"pass": "Oh213935",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BezEyre3289@outlook.com",
|
||||||
|
"pass": "Ee102928",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ClementKassulkemiy@hotmail.com",
|
||||||
|
"pass": "Pl566991",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "VogelzangMaw95@outlook.com",
|
||||||
|
"pass": "Pq675273",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "OppermanSmida9752@outlook.com",
|
||||||
|
"pass": "Gf653737",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "StrongGaribai451@outlook.com",
|
||||||
|
"pass": "Wx622773",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CadaviecoFromberg4317@outlook.com",
|
||||||
|
"pass": "Ep499850",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FurnerKirchmeier975@outlook.com",
|
||||||
|
"pass": "Mg446603",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RhodaBueter50@outlook.com",
|
||||||
|
"pass": "Jt323937",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RasburyBriones3033@outlook.com",
|
||||||
|
"pass": "Dw218230",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MenckeKurelko68@outlook.com",
|
||||||
|
"pass": "Yc767491",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CassidyVolkmandk@hotmail.com",
|
||||||
|
"pass": "Us142866",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "PerreraHinzman56@outlook.com",
|
||||||
|
"pass": "Tb107484",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AitchisonColetti78@outlook.com",
|
||||||
|
"pass": "Tz696603",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CelisFurgeson5249@outlook.com",
|
||||||
|
"pass": "Hz924031",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CrabtreeCousain8672@outlook.com",
|
||||||
|
"pass": "Ba448380",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MauraisHinkston096@outlook.com",
|
||||||
|
"pass": "Bu738292",
|
||||||
|
"time": "13:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CabadaDelmundo579@outlook.com",
|
||||||
|
"pass": "Hd147321",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AlmenSimons7217@outlook.com",
|
||||||
|
"pass": "Yp542004",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "WesselFliger8960@outlook.com",
|
||||||
|
"pass": "Tf833595",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FeuchtBrining098@outlook.com",
|
||||||
|
"pass": "In878325",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LalLamay66@outlook.com",
|
||||||
|
"pass": "Le666572",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SonyaPacochaeyhou@hotmail.com",
|
||||||
|
"pass": "Te434832",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AubreyBrady069@outlook.com",
|
||||||
|
"pass": "Tv006007",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DarcieVigor243@outlook.com",
|
||||||
|
"pass": "Jd881147",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LuevanoYacavone002@outlook.com",
|
||||||
|
"pass": "We117645",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MalstromRellihan4771@outlook.com",
|
||||||
|
"pass": "Zo820195",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RobbBarges952@outlook.com",
|
||||||
|
"pass": "Ec392147",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LintsLohn687@outlook.com",
|
||||||
|
"pass": "Ri607475",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JuniperCribb2453@outlook.com",
|
||||||
|
"pass": "Am225783",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HarlandJuckett6737@outlook.com",
|
||||||
|
"pass": "Cc439113",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AnitaLeuschkecoi@hotmail.com",
|
||||||
|
"pass": "Ox982365",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NehaCaspereh@hotmail.com",
|
||||||
|
"pass": "Iv445364",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DrewTreutelbf@hotmail.com",
|
||||||
|
"pass": "Kz932859",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JanaHanemtr@hotmail.com",
|
||||||
|
"pass": "Ks396834",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "EllenDenesikshrw@hotmail.com",
|
||||||
|
"pass": "Ud476658",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BaloghChaudhry754@outlook.com",
|
||||||
|
"pass": "Eo610154",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DockenMagness698@outlook.com",
|
||||||
|
"pass": "Bi209550",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AceboBoughan770@outlook.com",
|
||||||
|
"pass": "Fd322015",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SchisslerDorame805@outlook.com",
|
||||||
|
"pass": "Ra102622",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "WantSpier882@outlook.com",
|
||||||
|
"pass": "Ko480705",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BatesonShow057@outlook.com",
|
||||||
|
"pass": "Pk255318",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ParisDenesikdaq@hotmail.com",
|
||||||
|
"pass": "Ut936530",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ClaudetteKorfhage4548@outlook.com",
|
||||||
|
"pass": "Ji731430",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MyricksLuttmer676@outlook.com",
|
||||||
|
"pass": "Rh350294",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "TianaFeilhq@hotmail.com",
|
||||||
|
"pass": "Fe823107",
|
||||||
|
"time": "18:30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RocchiPratcher97@outlook.com",
|
||||||
|
"pass": "Nu004568",
|
||||||
|
"time": "18:30"
|
||||||
|
}
|
||||||
|
];
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,772 @@
|
|||||||
|
const SHIBUYA_ACCOUNTS = [
|
||||||
|
{
|
||||||
|
"email": "StevanJr978922@outlook.com",
|
||||||
|
"pass": "pizdus432063",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RudyVellos367864@outlook.com",
|
||||||
|
"pass": "wsufjc44609",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ThedoreSerigne7392@outlook.com",
|
||||||
|
"pass": "bkylcq965403",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NapoleonRaycroft340315@outlook.com",
|
||||||
|
"pass": "djjfxd93947",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ChantelHughs3322@outlook.com",
|
||||||
|
"pass": "dgtnx935728",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CallumSupino1403@outlook.com",
|
||||||
|
"pass": "hkmcs79780",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DimitrovCaffentzis211@outlook.com",
|
||||||
|
"pass": "nU1HRa54G5",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HarukoRogner209161@outlook.com",
|
||||||
|
"pass": "orexo79555",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "PargaElfreda08@outlook.com",
|
||||||
|
"pass": "l7AYEFXL",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FlandersMagierski40@outlook.com",
|
||||||
|
"pass": "U2gwNLLsnI",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GoeckeSill626@outlook.com",
|
||||||
|
"pass": "jppTBc1QvUnM",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MaryjoLape1868@outlook.com",
|
||||||
|
"pass": "gbqqe25960",
|
||||||
|
"time": "11:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CobyMaynes4830@outlook.com",
|
||||||
|
"pass": "uiivb613524",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RobertMorago465229@outlook.com",
|
||||||
|
"pass": "qhojr443254",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KaiyaTerracina5179@outlook.com",
|
||||||
|
"pass": "ghqrcj61272",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AmberlyApostol080636@outlook.com",
|
||||||
|
"pass": "lwhlte42578",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GageLargay4628@outlook.com",
|
||||||
|
"pass": "xyzweo07494",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BunaMite089562@outlook.com",
|
||||||
|
"pass": "vsswr783373",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ChelsieArnal3807@outlook.com",
|
||||||
|
"pass": "mgddlc46586",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "OrinPenhall42916@outlook.com",
|
||||||
|
"pass": "hdzkr879741",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AidaDesatnik16108@outlook.com",
|
||||||
|
"pass": "lokwz298811",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "VetaCatha75617@outlook.com",
|
||||||
|
"pass": "qytef78040",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "PearlieHaydu1162@outlook.com",
|
||||||
|
"pass": "mkqou538907",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DixiePagnano96880@outlook.com",
|
||||||
|
"pass": "ketaa424800",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MirandoKari676@outlook.com",
|
||||||
|
"pass": "PF8qtY50qhD",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NerisDistefano9400@outlook.com",
|
||||||
|
"pass": "VvrZp9P32c8",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MatheyJayson561@outlook.com",
|
||||||
|
"pass": "T76KTbofMm",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RubyNicoletti014495@outlook.com",
|
||||||
|
"pass": "kfsyn677192",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ErnestClum61480@outlook.com",
|
||||||
|
"pass": "ihubim12522",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "TommyOhme209549@outlook.com",
|
||||||
|
"pass": "gwimje193362",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NoblePioske658841@outlook.com",
|
||||||
|
"pass": "ldgby13398",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DequanStingo157264@outlook.com",
|
||||||
|
"pass": "rnfuyt418163",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "PawlowiczIbraham5715@outlook.com",
|
||||||
|
"pass": "u7lGk69c",
|
||||||
|
"time": "12:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LudwigHalliwell00587@outlook.com",
|
||||||
|
"pass": "wuguwl046177",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MarenYung20785@outlook.com",
|
||||||
|
"pass": "wfsmj574209",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FitzgeraldRockholt98295@outlook.com",
|
||||||
|
"pass": "vfosa42619",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LavoniaOnori430491@outlook.com",
|
||||||
|
"pass": "tynja52093",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LaurynBenns55300@outlook.com",
|
||||||
|
"pass": "ycoor865974",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AdinMantica4225@outlook.com",
|
||||||
|
"pass": "ggikew34255",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SpencerMicca75194@outlook.com",
|
||||||
|
"pass": "ovpexo583348",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MarilynKoes4862@outlook.com",
|
||||||
|
"pass": "malvd97553",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MyrtisGoglia44012@outlook.com",
|
||||||
|
"pass": "qceaxo318981",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AmaGooch4221@outlook.com",
|
||||||
|
"pass": "cfbukf996534",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LacyBaracco4835@outlook.com",
|
||||||
|
"pass": "hkwbdw20237",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DemondThomer335742@outlook.com",
|
||||||
|
"pass": "wjunch91495",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AnitraSaracina6117@outlook.com",
|
||||||
|
"pass": "pcycmh53076",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MiahVanderbush085922@outlook.com",
|
||||||
|
"pass": "qxvhk68960",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ScudieriGlantz140@outlook.com",
|
||||||
|
"pass": "3sWtOwpD",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LominackGayle15@outlook.com",
|
||||||
|
"pass": "l4vSL9NI",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MonetMarbury2351@outlook.com",
|
||||||
|
"pass": "vH1M3i3s58E",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LuarcaIdelle11@outlook.com",
|
||||||
|
"pass": "BRzqEo8ng",
|
||||||
|
"time": "13:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "YolandaInsinga6164@outlook.com",
|
||||||
|
"pass": "kuwzrx28362",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RosamondIanniello8358@outlook.com",
|
||||||
|
"pass": "kgihj399612",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NormandEquihua1109@outlook.com",
|
||||||
|
"pass": "phige47306",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MalikKoukos129235@outlook.com",
|
||||||
|
"pass": "emiyp493973",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ShaquitaAboytes4351@outlook.com",
|
||||||
|
"pass": "lsxnv876948",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "OleneFreiley3534@outlook.com",
|
||||||
|
"pass": "jqzzdd964055",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NaomaCocroft838671@outlook.com",
|
||||||
|
"pass": "ztcczh085978",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "UrielPreas06225@outlook.com",
|
||||||
|
"pass": "zusftv68860",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NathanialLuchene26658@outlook.com",
|
||||||
|
"pass": "clifo168333",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LeomaShadeed8810@outlook.com",
|
||||||
|
"pass": "ebzjb622751",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "EugenioGoldblatt2459@outlook.com",
|
||||||
|
"pass": "ajglip701106",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RecknerFiner23@outlook.com",
|
||||||
|
"pass": "YWC4fXYbQ8",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LehmerDearmore8491@outlook.com",
|
||||||
|
"pass": "aPwHdrm6Z",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FriisWithey7965@outlook.com",
|
||||||
|
"pass": "NSJjsJa07u",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BielinskiBrenton014@outlook.com",
|
||||||
|
"pass": "pFK1HwRq7",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BruckSprvill3308@outlook.com",
|
||||||
|
"pass": "RXN7TmzVp2N",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SearchfieldBrumbelow4116@outlook.com",
|
||||||
|
"pass": "c8l7eG06FEU",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "EchoShakal891534@outlook.com",
|
||||||
|
"pass": "emzlx918955",
|
||||||
|
"time": "14:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AlvisPhalin192479@outlook.com",
|
||||||
|
"pass": "alzvt79672",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "OswaldGaletka9536@outlook.com",
|
||||||
|
"pass": "ukcbrg313096",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CarenMaki607247@outlook.com",
|
||||||
|
"pass": "zmuwgc703557",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CornieBlesse95411@outlook.com",
|
||||||
|
"pass": "zhnps44417",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SpurgeonNaeve8030@outlook.com",
|
||||||
|
"pass": "psvtt35984",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AntoniaDagdag2213@outlook.com",
|
||||||
|
"pass": "dwwvi704649",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AmaliaLeiterman563681@outlook.com",
|
||||||
|
"pass": "pvlyub84163",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LynwoodKuenne13902@outlook.com",
|
||||||
|
"pass": "wkpgul552549",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SelmaFramer61290@outlook.com",
|
||||||
|
"pass": "wisucq052328",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "EllynFoshay97036@outlook.com",
|
||||||
|
"pass": "qnkhhd77753",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "IldaVidic699203@outlook.com",
|
||||||
|
"pass": "srauap68390",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "OthelAdelsberg79522@outlook.com",
|
||||||
|
"pass": "hxtuk858284",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JameJuntunen55@outlook.com",
|
||||||
|
"pass": "qtaTeVc8",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GollihueFischer64@outlook.com",
|
||||||
|
"pass": "i9lh4JdM60",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SicklesFerne114@outlook.com",
|
||||||
|
"pass": "yQldUQ20V9X",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FayLafevers041933@outlook.com",
|
||||||
|
"pass": "ckegy68592",
|
||||||
|
"time": "15:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LoriGidcumb029418@outlook.com",
|
||||||
|
"pass": "lytoy55942",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AnnDelamarter806252@outlook.com",
|
||||||
|
"pass": "vicplt40738",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MarquezFeuchter1874@outlook.com",
|
||||||
|
"pass": "uixjk69638",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AileneKuwata277811@outlook.com",
|
||||||
|
"pass": "ejcfkm56148",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JobTrippett345830@outlook.com",
|
||||||
|
"pass": "cmqtj39103",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CelineDerr3525@outlook.com",
|
||||||
|
"pass": "ybgvij45965",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AnnabellaTreisch3070@outlook.com",
|
||||||
|
"pass": "egsbys378815",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ErikOkolie007503@outlook.com",
|
||||||
|
"pass": "jdobih10988",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "IsaiahViglione31408@outlook.com",
|
||||||
|
"pass": "ioxdra00857",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BraydenShoda17303@outlook.com",
|
||||||
|
"pass": "oetiq87395",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CarissaTrimmings8794@outlook.com",
|
||||||
|
"pass": "hmdun14740",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MalindaHolme5566@outlook.com",
|
||||||
|
"pass": "mweich585575",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JammieSidun92407@outlook.com",
|
||||||
|
"pass": "fadyat13010",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BuckwaldArmson0861@outlook.com",
|
||||||
|
"pass": "KmOpLt3xF0Yh",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MoronBaruffi3375@outlook.com",
|
||||||
|
"pass": "1rK2H8OZdEq",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JonathonUrben068336@outlook.com",
|
||||||
|
"pass": "hwooin19315",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GillyardYeamans0032@outlook.com",
|
||||||
|
"pass": "7mQmLDwdb4gU",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GinnyDerda7515@outlook.com",
|
||||||
|
"pass": "hjgiqs94172",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "LakeshiaLaurey2701@outlook.com",
|
||||||
|
"pass": "iqjxd77418",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DominiqueEsfahani8866@outlook.com",
|
||||||
|
"pass": "pchymr183635",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HideoDinitto58505@outlook.com",
|
||||||
|
"pass": "rlqju208364",
|
||||||
|
"time": "16:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KaedenGalos914292@outlook.com",
|
||||||
|
"pass": "jsoupe75853",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CindyEhrhardt3848@outlook.com",
|
||||||
|
"pass": "rrwmoq658617",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ChanelleWeisser93240@outlook.com",
|
||||||
|
"pass": "vlpjrv86293",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AudrianaSanfelice5396@outlook.com",
|
||||||
|
"pass": "hzumas555723",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CatalinaCorace91255@outlook.com",
|
||||||
|
"pass": "ljzttr16503",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JalenVanover1020@outlook.com",
|
||||||
|
"pass": "mqmye34935",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "SaigeHenrichsen8593@outlook.com",
|
||||||
|
"pass": "ttzhl12151",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "JanaeDifelice402549@outlook.com",
|
||||||
|
"pass": "chzseb51764",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "NewmanLomasney02574@outlook.com",
|
||||||
|
"pass": "vkayy81843",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MaebelleRasler49736@outlook.com",
|
||||||
|
"pass": "lgwil93083",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HamiltonScungio842335@outlook.com",
|
||||||
|
"pass": "bgeoxp845501",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CristopherCeparano1380@outlook.com",
|
||||||
|
"pass": "cgqmz71389",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CorwinMarkus231678@outlook.com",
|
||||||
|
"pass": "xqfhnt933191",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HalperinSoltes28@outlook.com",
|
||||||
|
"pass": "S5f0TPUce",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DanutaDelker1598@outlook.com",
|
||||||
|
"pass": "X2Rr29Zwe5",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KayleighBentson1115@outlook.com",
|
||||||
|
"pass": "IUqYnVDh0",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AshbyBurkus333287@outlook.com",
|
||||||
|
"pass": "cclxqw47477",
|
||||||
|
"time": "17:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ElmyraBurridge3817@outlook.com",
|
||||||
|
"pass": "impyaf20647",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CorlissCarelock32411@outlook.com",
|
||||||
|
"pass": "onkvg958499",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AlphonsineBelanger81517@outlook.com",
|
||||||
|
"pass": "xiitd338826",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "MargaretteMyricks28312@outlook.com",
|
||||||
|
"pass": "islok47384",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "IsamSalery8936@outlook.com",
|
||||||
|
"pass": "vktau572934",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "TimmyHurwitz75493@outlook.com",
|
||||||
|
"pass": "xroqkk49247",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KnoblockRabern0754@outlook.com",
|
||||||
|
"pass": "sb2DyFi5",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "FlorNicoletti9588@outlook.com",
|
||||||
|
"pass": "cfvdq798849",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "ArdeliaSeton46231@outlook.com",
|
||||||
|
"pass": "dfpsct53782",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "QianaOthon396644@outlook.com",
|
||||||
|
"pass": "gozbm742224",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "WoolstenhulmeSevaaetasi0425@outlook.com",
|
||||||
|
"pass": "pPhX22cZn",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CeceliaMeirick476878@outlook.com",
|
||||||
|
"pass": "nccdso98121",
|
||||||
|
"time": "18:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AbbeyAltieri95596@outlook.com",
|
||||||
|
"pass": "hfwwky61796",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KinsleyDen8853@outlook.com",
|
||||||
|
"pass": "rdlybu83882",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "BushJaros3246@outlook.com",
|
||||||
|
"pass": "tooyc34116",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "DixonSalminen0004@outlook.com",
|
||||||
|
"pass": "geizhx120028",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AugustinQuebodeaux687077@outlook.com",
|
||||||
|
"pass": "ijtto250620",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "CherrylMelaas2686@outlook.com",
|
||||||
|
"pass": "cbtjth394749",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GilmoreKatehis91590@outlook.com",
|
||||||
|
"pass": "jvyiva73808",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AbeFolkner13996@outlook.com",
|
||||||
|
"pass": "bumrpg243093",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KatinaHani49508@outlook.com",
|
||||||
|
"pass": "syyuvf231200",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "VanderLifland3731@outlook.com",
|
||||||
|
"pass": "jmbfe792159",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AlvanLesinski52544@outlook.com",
|
||||||
|
"pass": "xcsxz12876",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "KevenForgey006943@outlook.com",
|
||||||
|
"pass": "slmgk69100",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HodgdonLaman90@outlook.com",
|
||||||
|
"pass": "DVIu7zTh2t",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "HuggerBareilles439@outlook.com",
|
||||||
|
"pass": "26eK2vl7Z",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RupnickBluto777@outlook.com",
|
||||||
|
"pass": "XukB7ZKSAEUp",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "McarthurHertel041@outlook.com",
|
||||||
|
"pass": "IH83tjZZ",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "GerryNeuber5044@outlook.com",
|
||||||
|
"pass": "zddbt776626",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "AaravDimento5767@outlook.com",
|
||||||
|
"pass": "qxrubz628969",
|
||||||
|
"time": "19:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"email": "RitaCalalang43363@outlook.com",
|
||||||
|
"pass": "xlhsgp805784",
|
||||||
|
"time": "19:00"
|
||||||
|
}
|
||||||
|
];
|
||||||
+349
@@ -0,0 +1,349 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>固定网站显示替换 - 脚本下载</title>
|
||||||
|
<style>
|
||||||
|
body { font-family: -apple-system, sans-serif; padding: 20px; max-width: 640px; margin: 0 auto; }
|
||||||
|
.acc-list { max-height: 70vh; overflow-y: auto; border: 1px solid #e0c9a6; border-radius: 10px; background: #fdf6ec; padding: 8px; display: flex; flex-wrap: wrap; gap: 6px; align-content: flex-start; }
|
||||||
|
.acc-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 8px; border: 1px solid #e0c9a6; border-radius: 16px; background: #fff; font-size: 12px; line-height: 1.4; max-width: 100%; }
|
||||||
|
.acc-chip.done { opacity: 0.45; background: #f0ead9; }
|
||||||
|
.acc-chip.done .acc-mail, .acc-chip.done .acc-pass { text-decoration: line-through; }
|
||||||
|
.acc-chip input[type="checkbox"] { width: 16px; height: 16px; margin: 0; flex: 0 0 auto; }
|
||||||
|
.acc-mail { font-weight: 600; word-break: break-all; }
|
||||||
|
.acc-pass { color: #6b4f2a; }
|
||||||
|
.time-tag { font-size: 11px; color: #8a5a00; background: #fdf0d8; border-radius: 10px; padding: 1px 6px; }
|
||||||
|
.progress-bar { padding: 10px 14px; border-radius: 10px; background: #eef4ff; color: #0a66c2; font-size: 15px; font-weight: 600; margin-bottom: 8px; border: 1px solid #c9ddf5; }
|
||||||
|
.acc-mail { cursor: pointer; }
|
||||||
|
.acc-mail:active, .acc-pass:active { opacity: 0.6; }
|
||||||
|
.acc-pass { cursor: pointer; }
|
||||||
|
.locked-box { padding: 14px; border: 1px solid #e0c9a6; border-radius: 10px; background: #fdf6ec; margin-bottom: 8px; }
|
||||||
|
.store-block { margin-bottom: 24px; }
|
||||||
|
|
||||||
|
/* ===== 火影忍者彩蛋按钮(官网风格:黑底+橙色火焰+倒计时块) ===== */
|
||||||
|
.naruto-zone { display: flex; gap: 12px; margin: 20px 0; }
|
||||||
|
.naruto-btn {
|
||||||
|
flex: 1; position: relative; padding: 14px 10px 12px; border: 1px solid rgba(255, 140, 0, 0.7); border-radius: 6px;
|
||||||
|
background: #0a0a0a; color: #ffb347; cursor: pointer;
|
||||||
|
font-size: 14px; font-weight: 700; font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
|
||||||
|
letter-spacing: 1px; text-align: center;
|
||||||
|
box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.15), 0 4px 20px rgba(255, 100, 0, 0.12);
|
||||||
|
transition: transform 0.12s, box-shadow 0.12s, border-color 0.12s;
|
||||||
|
}
|
||||||
|
.naruto-btn:hover { border-color: #ff8c00; box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.35), 0 4px 24px rgba(255, 100, 0, 0.28); }
|
||||||
|
.naruto-btn:active { transform: scale(0.96); }
|
||||||
|
/* 四角橙点装饰(官网风格的角标) */
|
||||||
|
.naruto-btn .corner { position: absolute; width: 7px; height: 7px; background: #ff8c00; box-shadow: 0 0 6px rgba(255, 140, 0, 0.9); }
|
||||||
|
.naruto-btn .corner.tl { top: 5px; left: 5px; }
|
||||||
|
.naruto-btn .corner.tr { top: 5px; right: 5px; }
|
||||||
|
.naruto-btn .corner.bl { bottom: 5px; left: 5px; }
|
||||||
|
.naruto-btn .corner.br { bottom: 5px; right: 5px; }
|
||||||
|
/* 顶部小标签(官网的 SECONDS/DAYS 小字样式) */
|
||||||
|
.naruto-btn .btn-eng { display: block; font-size: 9px; letter-spacing: 3px; color: rgba(255, 140, 0, 0.65); font-weight: 600; margin-bottom: 5px; }
|
||||||
|
.naruto-btn .btn-label { display: block; font-size: 15px; font-weight: 800; text-shadow: 0 0 10px rgba(255, 140, 0, 0.7); }
|
||||||
|
.naruto-btn .btn-sub { display: block; font-size: 10px; font-weight: 400; color: #8a6a3a; margin-top: 5px; letter-spacing: 2px; }
|
||||||
|
/* 底部橙色火焰细线(官网的强调线) */
|
||||||
|
.naruto-btn .btn-fire { position: absolute; left: 12%; right: 12%; bottom: 0; height: 2px; background: linear-gradient(90deg, transparent, #ff8c00 30%, #ffd700 50%, #ff8c00 70%, transparent); box-shadow: 0 0 8px rgba(255, 140, 0, 0.8); }
|
||||||
|
|
||||||
|
/* ===== 5秒穿越全屏loading(官网倒计时风格) ===== */
|
||||||
|
#time-jump-overlay {
|
||||||
|
position: fixed; inset: 0; z-index: 99999; display: none; flex-direction: column; align-items: center; justify-content: center;
|
||||||
|
background: radial-gradient(ellipse at center, #140a02 0%, #000 80%);
|
||||||
|
}
|
||||||
|
#time-jump-overlay.on { display: flex; }
|
||||||
|
/* 官网式倒计时大数字块 */
|
||||||
|
#tj-count-block {
|
||||||
|
position: relative; width: 180px; height: 120px; display: flex; align-items: center; justify-content: center;
|
||||||
|
border: 1px solid rgba(255, 140, 0, 0.5); background: rgba(0, 0, 0, 0.6); border-radius: 4px;
|
||||||
|
box-shadow: 0 0 0 1px rgba(255, 140, 0, 0.12), 0 0 40px rgba(255, 100, 0, 0.15), inset 0 0 30px rgba(255, 100, 0, 0.08);
|
||||||
|
}
|
||||||
|
#tj-count-block .tj-corner { position: absolute; width: 10px; height: 10px; border: 1px solid #ff8c00; }
|
||||||
|
#tj-count-block .tj-corner.tl { top: 6px; left: 6px; border-right: none; border-bottom: none; }
|
||||||
|
#tj-count-block .tj-corner.tr { top: 6px; right: 6px; border-left: none; border-bottom: none; }
|
||||||
|
#tj-count-block .tj-corner.bl { bottom: 6px; left: 6px; border-right: none; border-top: none; }
|
||||||
|
#tj-count-block .tj-corner.br { bottom: 6px; right: 6px; border-left: none; border-top: none; }
|
||||||
|
#tj-count { font-size: 72px; font-weight: 900; color: #ff8c00; text-shadow: 0 0 24px rgba(255, 140, 0, 0.9), 0 0 60px rgba(255, 80, 0, 0.5); font-variant-numeric: tabular-nums; line-height: 1; }
|
||||||
|
#tj-unit { position: absolute; bottom: 8px; left: 0; right: 0; text-align: center; font-size: 10px; letter-spacing: 4px; color: rgba(255, 140, 0, 0.6); font-weight: 600; }
|
||||||
|
/* 官网 SECONDS 小标签 */
|
||||||
|
#tj-eng { font-size: 10px; letter-spacing: 6px; color: rgba(255, 140, 0, 0.55); font-weight: 700; margin-bottom: 10px; }
|
||||||
|
#tj-shuriken {
|
||||||
|
font-size: 30px; color: #ff8c00; margin-bottom: 14px; text-shadow: 0 0 20px rgba(255, 140, 0, 0.9);
|
||||||
|
animation: shuriken-spin 1.4s linear infinite; opacity: 0.9;
|
||||||
|
}
|
||||||
|
#tj-text { color: #8a6a3a; font-size: 12px; margin-top: 16px; letter-spacing: 4px; }
|
||||||
|
#tj-bar { width: 180px; height: 3px; background: rgba(255, 140, 0, 0.15); margin-top: 14px; overflow: hidden; }
|
||||||
|
#tj-bar-fill { height: 100%; width: 0%; background: linear-gradient(90deg, #ff8c00, #ffd700); box-shadow: 0 0 8px rgba(255, 200, 60, 0.9); transition: width 5s linear; }
|
||||||
|
@keyframes shuriken-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
/* 小屏(iPhone SE 等窄屏) */
|
||||||
|
@media (max-width: 380px) {
|
||||||
|
.acc-chip { max-width: 100%; }
|
||||||
|
.acc-chip .btn-acc { padding: 4px 8px; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>📦 下载脚本(最新版)</h2>
|
||||||
|
<ul style="font-size:18px;line-height:2">
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v1.6.1.user.js')" style="color:#0a66c2">code-v1.6.1.user.js</a> ⭐ 最新版 (v1.6.1)</li>
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v1.6.2jr.user.js')" style="color:#0a66c2">code-v1.6.2jr.user.js</a> 兼容版 (v1.6.2)</li>
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('code-v0.6.1.user.js')" style="color:#0a66c2">code-v0.6.1.user.js</a> (v0.6.1)</li>
|
||||||
|
</ul>
|
||||||
|
<p style="color:#888">在 iPhone 上点 code-v0.7.0.user.js(最新版)即开始下载,然后用 Userscripts 应用导入。<br>需要旧版本时点对应版本文件。</p>
|
||||||
|
<h3>🧪 注入测试(排查用)</h3>
|
||||||
|
<ul style="font-size:18px;line-height:2">
|
||||||
|
<li><a href="javascript:void(0)" onclick="forceDownload('test-inject.user.js')" style="color:#0a66c2">test-inject.user.js</a> (任意网站左上角显示蓝色标记,验证 Userscripts 是否正常注入)</li>
|
||||||
|
</ul>
|
||||||
|
<hr>
|
||||||
|
<h3>📌 bookmarklet 书签版(不依赖扩展)</h3>
|
||||||
|
<p style="font-size:15px;line-height:1.7">不想装扩展?点下方按钮把新脚本复制到剪贴板,然后粘贴到书签 URL 即可:<br>打开任意网页 → 分享 → <b>添加书签</b> → 书本按钮 → <b>编辑</b> → 把地址全部删掉 → <b>长按粘贴</b> → 完成。<br>之后在目标网站点这个书签,文字立即替换。</p>
|
||||||
|
<button onclick="copyBookmarklet()" style="width:100%;padding:14px;font-size:17px;border:none;border-radius:10px;background:#0a66c2;color:#fff;margin:4px 0 14px">📋 复制新脚本到剪贴板</button>
|
||||||
|
<p style="color:#888">💡 复制成功后,把内容粘贴到任意书签的「地址」栏(以 <code>javascript:</code> 开头)。<br>规则配置与油猴版共用,首次点击弹出设置面板时填写即可。</p>
|
||||||
|
<hr>
|
||||||
|
<h3>🔗 目标网站</h3>
|
||||||
|
<p style="font-size:18px;line-height:1.8">
|
||||||
|
<a href="https://parks2.bandainamco-am.co.jp/" target="_blank" rel="noopener" style="color:#0a66c2;word-break:break-all">https://parks2.bandainamco-am.co.jp/</a>
|
||||||
|
</p>
|
||||||
|
<p style="color:#888">👆 点击在新页签打开网站;长按链接可弹出菜单「拷贝」,复制网址。</p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<script src="shibuya-accounts.js"></script>
|
||||||
|
<script src="nagoya-accounts.js"></script>
|
||||||
|
<script src="koshigaya-accounts.js"></script>
|
||||||
|
<script>
|
||||||
|
var PASSCODE = {
|
||||||
|
shibuya: "8899",
|
||||||
|
nagoya: "1358",
|
||||||
|
koshigaya: "888888"
|
||||||
|
};
|
||||||
|
|
||||||
|
var STORES = {
|
||||||
|
shibuya: { key: "acc-key-shibuya", msg: "acc-msg-shibuya", locked: "acc-locked-shibuya", area: "acc-area-shibuya", list: "acc-list-shibuya", data: SHIBUYA_ACCOUNTS, doneKey: "done-shibuya" },
|
||||||
|
nagoya: { key: "acc-key-nagoya", msg: "acc-msg-nagoya", locked: "acc-locked-nagoya", area: "acc-area-nagoya", list: "acc-list-nagoya", data: NAGOYA_ACCOUNTS, doneKey: "done-nagoya" },
|
||||||
|
koshigaya: { key: "acc-key-koshigaya", msg: "acc-msg-koshigaya", locked: "acc-locked-koshigaya", area: "acc-area-koshigaya", list: "acc-list-koshigaya", data: KOSHIGAYA_ACCOUNTS, doneKey: "done-koshigaya" }
|
||||||
|
};
|
||||||
|
|
||||||
|
// 每个店铺的完成状态(localStorage)
|
||||||
|
function loadDone(storeName) {
|
||||||
|
try { return JSON.parse(localStorage.getItem(STORES[storeName].doneKey)) || {}; }
|
||||||
|
catch (e) { return {}; }
|
||||||
|
}
|
||||||
|
function saveDone(storeName, done) {
|
||||||
|
try { localStorage.setItem(STORES[storeName].doneKey, JSON.stringify(done)); } catch (e) { }
|
||||||
|
}
|
||||||
|
function toggleDone(storeName, email, cb) {
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
if (cb.checked) done[email] = true;
|
||||||
|
else delete done[email];
|
||||||
|
saveDone(storeName, done);
|
||||||
|
var chip = cb.closest('.acc-chip');
|
||||||
|
if (chip) chip.classList.toggle('done', cb.checked);
|
||||||
|
updateProgress(storeName);
|
||||||
|
}
|
||||||
|
|
||||||
|
function forceDownload(filename) {
|
||||||
|
var btn = event && event.target ? event.target : null;
|
||||||
|
if (btn) {
|
||||||
|
var old = btn.textContent;
|
||||||
|
btn.textContent = '下载中…';
|
||||||
|
setTimeout(function () { btn.textContent = old; }, 3000);
|
||||||
|
}
|
||||||
|
fetch(filename)
|
||||||
|
.then(function (r) { return r.blob(); })
|
||||||
|
.then(function (blob) {
|
||||||
|
var a = document.createElement('a');
|
||||||
|
var url = URL.createObjectURL(blob);
|
||||||
|
a.href = url;
|
||||||
|
a.download = filename;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
setTimeout(function () { URL.revokeObjectURL(url); }, 10000);
|
||||||
|
})
|
||||||
|
.catch(function () {
|
||||||
|
window.location.href = filename;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function legacyCopy(text, done) {
|
||||||
|
var ta = document.createElement('textarea');
|
||||||
|
ta.value = text;
|
||||||
|
ta.style.position = 'fixed';
|
||||||
|
ta.style.opacity = '0';
|
||||||
|
document.body.appendChild(ta);
|
||||||
|
ta.focus();
|
||||||
|
ta.select();
|
||||||
|
ta.setSelectionRange(0, text.length);
|
||||||
|
try { document.execCommand('copy'); } catch (e) { /* ignore */ }
|
||||||
|
document.body.removeChild(ta);
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyText(text, done) {
|
||||||
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||||
|
navigator.clipboard.writeText(text).then(done, function () { legacyCopy(text, done); });
|
||||||
|
} else {
|
||||||
|
legacyCopy(text, done);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 火影彩蛋:穿越到5秒后 =====
|
||||||
|
var tjTimer = null;
|
||||||
|
function timeJump5s() {
|
||||||
|
if (tjTimer) return;
|
||||||
|
var overlay = document.getElementById('time-jump-overlay');
|
||||||
|
var count = document.getElementById('tj-count');
|
||||||
|
var fill = document.getElementById('tj-bar-fill');
|
||||||
|
overlay.classList.add('on');
|
||||||
|
count.textContent = '5';
|
||||||
|
fill.style.transition = 'none';
|
||||||
|
fill.style.width = '0%';
|
||||||
|
void fill.offsetWidth;
|
||||||
|
fill.style.transition = 'width 5s linear';
|
||||||
|
fill.style.width = '100%';
|
||||||
|
tjTimer = setInterval(function () {
|
||||||
|
var left = Number(count.textContent) - 1;
|
||||||
|
if (left > 0) {
|
||||||
|
count.textContent = String(left);
|
||||||
|
} else {
|
||||||
|
clearInterval(tjTimer);
|
||||||
|
tjTimer = null;
|
||||||
|
overlay.classList.remove('on');
|
||||||
|
showToast('✅ 已穿越到5秒后!');
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ===== 火影彩蛋:穿越到25号 =====
|
||||||
|
function jumpTo25() {
|
||||||
|
showToast('🕘 25号开启,敬请期待!');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 轻量 toast 提示
|
||||||
|
function showToast(msg) {
|
||||||
|
var t = document.getElementById('toast-tip');
|
||||||
|
if (!t) {
|
||||||
|
t = document.createElement('div');
|
||||||
|
t.id = 'toast-tip';
|
||||||
|
t.style.cssText = 'position:fixed;left:50%;bottom:120px;transform:translateX(-50%);background:rgba(0,0,0,0.8);color:#fff;padding:10px 18px;border-radius:20px;font-size:14px;z-index:9999;opacity:0;transition:opacity .25s;pointer-events:none;max-width:80%;text-align:center;word-break:break-all';
|
||||||
|
document.body.appendChild(t);
|
||||||
|
}
|
||||||
|
t.textContent = msg;
|
||||||
|
t.style.opacity = '1';
|
||||||
|
clearTimeout(t._timer);
|
||||||
|
t._timer = setTimeout(function () { t.style.opacity = '0'; }, 1800);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 点击账号/密码复制并 toast 提示
|
||||||
|
function copyWithTip(text, label) {
|
||||||
|
copyText(text, function () {
|
||||||
|
showToast(label + ' 已复制:' + text);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// bookmarklet 复制:拉取 bookmarklet.txt 并复制到剪贴板
|
||||||
|
function copyBookmarklet() {
|
||||||
|
var btn = event && event.target ? event.target : null;
|
||||||
|
if (btn) {
|
||||||
|
var old = btn.textContent;
|
||||||
|
btn.textContent = '⏳ 正在加载…';
|
||||||
|
setTimeout(function () { btn.textContent = old; }, 3000);
|
||||||
|
}
|
||||||
|
fetch('bookmarklet.txt')
|
||||||
|
.then(function (r) {
|
||||||
|
if (!r.ok) throw new Error('HTTP ' + r.status);
|
||||||
|
return r.text();
|
||||||
|
})
|
||||||
|
.then(function (text) {
|
||||||
|
copyText(text, function () {
|
||||||
|
showToast('✅ 新脚本已复制!去粘贴到书签地址栏吧');
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(function (e) {
|
||||||
|
showToast('❌ 加载失败:' + (e && e.message ? e.message : '未知错误'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新完成进度
|
||||||
|
function updateProgress(storeName) {
|
||||||
|
var cfg = STORES[storeName];
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
var total = cfg.data.length;
|
||||||
|
var count = 0;
|
||||||
|
cfg.data.forEach(function (item) {
|
||||||
|
if (done[String(item.email || "")]) count++;
|
||||||
|
});
|
||||||
|
var pct = total > 0 ? ((count / total) * 100).toFixed(2) : "0.00";
|
||||||
|
var el = document.getElementById("progress-" + storeName);
|
||||||
|
if (el) el.textContent = "完成 " + count + "/" + total + " (" + pct + "%)";
|
||||||
|
}
|
||||||
|
|
||||||
|
function unlockStore(storeName) {
|
||||||
|
var cfg = STORES[storeName];
|
||||||
|
var key = document.getElementById(cfg.key).value.trim();
|
||||||
|
var msg = document.getElementById(cfg.msg);
|
||||||
|
if (key !== PASSCODE[storeName]) {
|
||||||
|
msg.textContent = '❌ 口令错误';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msg.textContent = '';
|
||||||
|
document.getElementById(cfg.locked).style.display = 'none';
|
||||||
|
var area = document.getElementById(cfg.area);
|
||||||
|
area.style.display = '';
|
||||||
|
var list = document.getElementById(cfg.list);
|
||||||
|
list.innerHTML = '';
|
||||||
|
var done = loadDone(storeName);
|
||||||
|
cfg.data.forEach(function (item, i) {
|
||||||
|
var email = String(item.email || "");
|
||||||
|
var isDone = !!done[email];
|
||||||
|
var row = document.createElement('span');
|
||||||
|
row.className = 'acc-chip' + (isDone ? ' done' : '');
|
||||||
|
row.innerHTML =
|
||||||
|
'<input type="checkbox"' + (isDone ? ' checked' : '') + ' onchange="toggleDone(\'' + storeName + '\', \'' + email.replace(/'/g, "\\'") + '\', this)">' +
|
||||||
|
'<span class="acc-mail" id="acc-mail-' + storeName + '-' + i + '" onclick="copyWithTip(document.getElementById(\'acc-mail-' + storeName + '-' + i + '\').textContent, \'账号\')">' + email.replace(/</g, '<') + '</span>' +
|
||||||
|
'<span class="acc-pass" id="acc-pass-' + storeName + '-' + i + '" onclick="copyWithTip(document.getElementById(\'acc-pass-' + storeName + '-' + i + '\').textContent, \'密码\')">' + String(item.pass || "").replace(/</g, '<') + '</span>' +
|
||||||
|
(item.time ? '<span class="time-tag">' + item.time + '</span>' : '');
|
||||||
|
list.appendChild(row);
|
||||||
|
});
|
||||||
|
updateProgress(storeName);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- ===== 火影忍者彩蛋按钮(官网风格) ===== -->
|
||||||
|
<div class="naruto-zone">
|
||||||
|
<button class="naruto-btn" onclick="timeJump5s()">
|
||||||
|
<span class="corner tl"></span><span class="corner tr"></span>
|
||||||
|
<span class="corner bl"></span><span class="corner br"></span>
|
||||||
|
<span class="btn-eng">TIME JUMP</span>
|
||||||
|
<span class="btn-label">🌀 穿越到5秒后</span>
|
||||||
|
<span class="btn-sub">忍法·時空間忍術</span>
|
||||||
|
<span class="btn-fire"></span>
|
||||||
|
</button>
|
||||||
|
<button class="naruto-btn" onclick="jumpTo25()">
|
||||||
|
<span class="corner tl"></span><span class="corner tr"></span>
|
||||||
|
<span class="corner bl"></span><span class="corner br"></span>
|
||||||
|
<span class="btn-eng">NEXT DAY</span>
|
||||||
|
<span class="btn-label">🌀 穿越到25号</span>
|
||||||
|
<span class="btn-sub">忍法·未来予知</span>
|
||||||
|
<span class="btn-fire"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 5秒穿越全屏loading(官网倒计时风格) -->
|
||||||
|
<div id="time-jump-overlay">
|
||||||
|
<div id="tj-eng">SECONDS</div>
|
||||||
|
<div id="tj-shuriken">✴</div>
|
||||||
|
<div id="tj-count-block">
|
||||||
|
<span class="tj-corner tl"></span><span class="tj-corner tr"></span>
|
||||||
|
<span class="tj-corner bl"></span><span class="tj-corner br"></span>
|
||||||
|
<span id="tj-count">5</span>
|
||||||
|
<span id="tj-unit">秒</span>
|
||||||
|
</div>
|
||||||
|
<div id="tj-bar"><div id="tj-bar-fill"></div></div>
|
||||||
|
<div id="tj-text">時空忍術発動中…</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="height:300px"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user