Files
web-fusion/src/utils/pythonBridge.js

162 lines
4.7 KiB
JavaScript
Raw Normal View History

2026-02-04 19:56:19 +08:00
// pythonBridge.js (Refactored to Electron IPC)
import { ref, onMounted } from 'vue';
import { isElectron, safeElectronCall } from '@/utils/electronBridge';
// Check if we are in Electron environment
const inElectron = isElectron();
export function usePythonBridge() {
// ========== tk爬虫的接口 ==========
// fetchDataConfig (maps to updateStartConfig)
const fetchDataConfig = async (data) => {
if (!inElectron) return null;
try {
return await window.electronAPI.tk.updateStartConfig(data);
} catch (e) {
console.error('fetchDataConfig error:', e);
return null;
}
};
// fetchDataCount
const fetchDataCount = async () => {
if (!inElectron) return JSON.stringify({ totalCount: 0 });
try {
return await window.electronAPI.tk.getDataCount();
} catch (e) {
console.error('fetchDataCount error:', e);
return JSON.stringify({ totalCount: 0 });
}
};
// loginTikTok
const loginTikTok = async () => {
if (!inElectron) return;
await window.electronAPI.tk.loginTikTok();
};
// loginBackStage
const loginBackStage = async (data) => {
if (!inElectron) return;
if (data.index == 0) {
await window.electronAPI.tk.loginBackStage(JSON.stringify(data));
} else if (data.index == 1) {
await window.electronAPI.tk.loginBackStageCopy(JSON.stringify(data));
}
};
// givePyAnchorId -> visitAnchor
const givePyAnchorId = async (id) => {
if (!inElectron) return;
await window.electronAPI.tk.visitAnchor(id);
};
// backStageloginStatus
const backStageloginStatus = async () => {
if (!inElectron) return null;
return await window.electronAPI.tk.checkBackStageLoginStatus();
};
// backStageloginStatusCopy
const backStageloginStatusCopy = async () => {
if (!inElectron) return null;
return await window.electronAPI.tk.checkBackStageLoginStatusCopy();
};
// exportToExcel
const exportToExcel = async (data) => {
if (!inElectron) return;
await window.electronAPI.tk.exportData(JSON.stringify(data));
};
const stopScript = async () => {
if (!inElectron) return;
await window.electronAPI.tk.stopCrawl();
};
// getVersion
const getVersion = async () => {
if (!inElectron) return 'Web Mode';
return await window.electronAPI.tk.getVersion();
};
// getTkLoginStatus
const getTkLoginStatus = async () => {
if (!inElectron) return "false";
return await window.electronAPI.tk.checkTkLoginStatus();
};
// ========== 粉丝助手的接口 ==========
const controlTask = async (data) => {
if (!inElectron) return;
// data is JSON string in original, ensure consistent
await window.electronAPI.tk.controlTask(data);
};
const getBrotherInfo = async () => {
if (!inElectron) return { total: 0, valid: 0 };
const res = await window.electronAPI.tk.getBrotherInfo();
return JSON.parse(res);
};
const Specifystreaming = async (data) => {
if (!inElectron) return;
await window.electronAPI.tk.findBigBrother(data);
};
const storageSetInfos = async (data) => {
// data is { key, data } object
if (!inElectron) return;
await window.electronAPI.tk.storageSet(JSON.stringify(data));
};
const readSetInfos = async (key) => {
if (!inElectron) return "";
const res = await window.electronAPI.tk.storageRead(JSON.stringify(key));
return JSON.parse(res || '""'); // Handle potential empty string response
};
// Maps to visitAnchor
const openAnchorIdRooms = async (id) => {
if (!inElectron) return;
await window.electronAPI.tk.openRoom(id);
};
// Clipboard helper - maybe use navigator.clipboard directly in Vue component?
// Original used python bridge for clipboard.
const setClipboards = async (text) => {
try {
await navigator.clipboard.writeText(text);
return true;
} catch (e) {
console.error('Clipboard failed', e);
return false;
}
}
return {
fetchDataConfig,
fetchDataCount,
loginBackStage,
loginTikTok,
givePyAnchorId,
backStageloginStatus,
backStageloginStatusCopy,
exportToExcel,
stopScript,
getVersion,
getTkLoginStatus,
// New Fan Workbench exports
controlTask,
getBrotherInfo,
Specifystreaming,
storageSetInfos,
readSetInfos,
openAnchorIdRooms,
setClipboards
};
}