110 lines
3.0 KiB
JavaScript
110 lines
3.0 KiB
JavaScript
(() => {
|
||
const ROOT = document.documentElement;
|
||
// 每次注入都寫標記(方便偵測);監聽器只掛一次
|
||
ROOT.dataset.haixunExtension = "1";
|
||
ROOT.dataset.haixunExtensionVersion = "4";
|
||
|
||
function readPageAccessToken() {
|
||
try {
|
||
const legacy = localStorage.getItem("haixun.access_token");
|
||
if (legacy) return legacy;
|
||
const raw = localStorage.getItem("hb_live_tokens");
|
||
if (!raw) return "";
|
||
const parsed = JSON.parse(raw);
|
||
return String(parsed?.access_token ?? "");
|
||
} catch {
|
||
return "";
|
||
}
|
||
}
|
||
|
||
function announceReady() {
|
||
window.postMessage(
|
||
{ type: "HAIXUN_EXTENSION_READY", version: 4, origin: location.origin },
|
||
"*",
|
||
);
|
||
}
|
||
|
||
if (!globalThis.__HAIXUN_THREADS_BRIDGE__) {
|
||
globalThis.__HAIXUN_THREADS_BRIDGE__ = true;
|
||
|
||
window.addEventListener("message", (event) => {
|
||
if (event.source !== window) return;
|
||
|
||
if (event.data?.type === "HAIXUN_PING_EXTENSION") {
|
||
announceReady();
|
||
return;
|
||
}
|
||
|
||
// 只收集 cookies,回傳 storageState 給網頁(網頁用自己的 JWT 上傳)
|
||
if (event.data?.type === "HAIXUN_REQUEST_THREADS_COLLECT") {
|
||
chrome.runtime
|
||
.sendMessage({ action: "collect" })
|
||
.then((result) => {
|
||
window.postMessage(
|
||
{
|
||
type: "HAIXUN_THREADS_COLLECT_RESULT",
|
||
...(result ?? {}),
|
||
},
|
||
"*",
|
||
);
|
||
})
|
||
.catch((error) => {
|
||
const message =
|
||
chrome.runtime.lastError?.message ??
|
||
(error instanceof Error ? error.message : "收集失敗");
|
||
window.postMessage(
|
||
{
|
||
type: "HAIXUN_THREADS_COLLECT_RESULT",
|
||
success: false,
|
||
message,
|
||
},
|
||
"*",
|
||
);
|
||
});
|
||
return;
|
||
}
|
||
|
||
if (event.data?.type !== "HAIXUN_REQUEST_THREADS_SYNC") return;
|
||
|
||
const accessToken =
|
||
String(event.data.accessToken ?? "").trim() || readPageAccessToken();
|
||
|
||
chrome.runtime
|
||
.sendMessage({
|
||
action: "sync",
|
||
serverUrl: event.data.serverUrl ?? window.location.origin,
|
||
accountId: String(event.data.accountId ?? "").trim(),
|
||
accessToken,
|
||
apiVersion: event.data.apiVersion ?? "go-v1",
|
||
})
|
||
.then((result) => {
|
||
window.postMessage(
|
||
{
|
||
type: "HAIXUN_THREADS_SYNC_RESULT",
|
||
...(result ?? {}),
|
||
},
|
||
"*",
|
||
);
|
||
})
|
||
.catch((error) => {
|
||
const message =
|
||
chrome.runtime.lastError?.message ??
|
||
(error instanceof Error ? error.message : "同步失敗");
|
||
window.postMessage(
|
||
{
|
||
type: "HAIXUN_THREADS_SYNC_RESULT",
|
||
success: false,
|
||
valid: false,
|
||
message,
|
||
},
|
||
"*",
|
||
);
|
||
});
|
||
});
|
||
}
|
||
|
||
announceReady();
|
||
setTimeout(announceReady, 500);
|
||
setTimeout(announceReady, 2000);
|
||
})();
|