add: 首次提交油猴脚本

This commit is contained in:
2026-09-08 00:45:03 +08:00
parent 88372cfc55
commit 06f54f8e1c
17 changed files with 14736 additions and 0 deletions
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
+656
View File
@@ -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>生日(BIRTHYYYY-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();
})();
+656
View File
@@ -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>生日(BIRTHYYYY-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();
})();
+349
View File
@@ -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, '&lt;') + '</span>' +
'<span class="acc-pass" id="acc-pass-' + storeName + '-' + i + '" onclick="copyWithTip(document.getElementById(\'acc-pass-' + storeName + '-' + i + '\').textContent, \'密码\')">' + String(item.pass || "").replace(/</g, '&lt;') + '</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
+302
View File
@@ -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"
}
];