diff --git a/webui/src/components/creator/OperationView.tsx b/webui/src/components/creator/OperationView.tsx index d64b3d6..015718c 100644 --- a/webui/src/components/creator/OperationView.tsx +++ b/webui/src/components/creator/OperationView.tsx @@ -2,6 +2,7 @@ import { useState } from 'react' import { AlertTriangle, ArrowLeft, + Briefcase, Clock, Plus, RefreshCw, @@ -19,6 +20,7 @@ import { useSyncCreatorAccount, } from '@/hooks/useCreator' import { formatCount, formatDateTime, formatRelative } from '@/lib/monitorFormat' +import { useCurrentPlatform } from '@/hooks/usePlatform' import type { CreatorNote, CreatorPermissionStatus } from '@/types/creator' import { AddAccountDialog } from './AddAccountDialog' @@ -303,9 +305,39 @@ function AccountDetail({ accountId, onBack }: { accountId: number; onBack: () => * 采集方式也不同(那边要浏览器登录态,这边是纯请求)。 */ export function OperationView() { + const { platform, capability } = useCurrentPlatform() const [selectedId, setSelectedId] = useState(null) const [addOpen, setAddOpen] = useState(false) + // 运营只对小红书成立:它读的是小红书创作者后台。不挡住的话,切到抖音时这里照样 + // 列出小红书的账号 —— 看起来像是"抖音账号",其实平台维度根本没参与。 + if (platform !== 'xhs') { + const label = capability?.label ?? platform + return ( +
+
+
+
+ +
+
+

+ {label} 没有运营模块 +

+

+ 运营读的是创作者后台的数据,目前只接入了小红书 +

+
+
+

+ 小红书之外,这里没有可用的后台接口 —— 能采的是公开数据,那属于「监控」。 + 切回小红书即可看到运营账号。 +

+
+
+ ) + } + return (
diff --git a/webui/src/components/monitor/CookiePanel.tsx b/webui/src/components/monitor/CookiePanel.tsx index 7562b20..3206e24 100644 --- a/webui/src/components/monitor/CookiePanel.tsx +++ b/webui/src/components/monitor/CookiePanel.tsx @@ -31,8 +31,11 @@ export function CookiePanel() {
+ {/* 标题要和扫码面板区分开:这个是"存进库里、每轮注入子进程"的 cookie, + 那个是"写进浏览器 profile、CDP 模式复用"的登录态。两者是不同机制、 + 也都能同时算"登录着",都叫「登录态」就分不清在说哪一个。 */} - {label}登录态 + {label} Cookie(定时任务用) {status?.present ? ( diff --git a/webui/src/components/monitor/QrLoginPanel.tsx b/webui/src/components/monitor/QrLoginPanel.tsx index 92f465a..fda0e81 100644 --- a/webui/src/components/monitor/QrLoginPanel.tsx +++ b/webui/src/components/monitor/QrLoginPanel.tsx @@ -39,8 +39,15 @@ export function QrLoginPanel() { const queryClient = useQueryClient() const [polling, setPolling] = useState(false) - const { data: state } = useQrLoginStatus(polling) - const { data: login } = useLoginState(polling) + // 登录态检测目前只实现了小红书:它读的是小红书页面的 __INITIAL_STATE__。 + // 后端 qrlogin.LOGIN_URL 里也只有 xhs 一项。 + // + // 不挡住的话会撒一个具体的谎 —— 切到抖音时,面板照样报"已登录",因为小红书的 + // 会话还在,而标题写的是「抖音登录态」。 + const wired = platform === 'xhs' + + const { data: state } = useQrLoginStatus(polling && wired) + const { data: login } = useLoginState(polling && wired) const start = useStartQrLogin() const cancel = useCancelQrLogin() const recheck = useRecheckLogin() @@ -64,6 +71,29 @@ export function QrLoginPanel() { } }, [status, queryClient]) + // 未接入的平台直接换掉整个面板。只改标题是不够的 —— 下面那些块读的是小红书的 + // 状态,照渲染出来还是会显示"已登录"。 + if (!wired) { + return ( +
+
+ + + 浏览器登录态(扫码) + + + {label}未接入 + +
+

+ 扫码登录目前只实现了小红书 —— + 登录态检测读的是小红书页面的登录状态,其它平台还没有对应的实现。 + 切回小红书即可使用。 +

+
+ ) + } + const begin = () => { setPolling(true) start.mutate() @@ -76,10 +106,17 @@ export function QrLoginPanel() {
+ {/* 标题必须和 Cookie 面板区分开:那个是"存进库、每轮注入"的 cookie, + 这个是"写进浏览器 profile、CDP 模式复用"的浏览器登录态。两者是 + 不同的机制,都能算"登录着",只写「登录态」会看不出指的是哪一个。 */} - {label}登录态 + 浏览器登录态(扫码) - {loggedIn ? ( + {!wired ? ( + + {label}未接入 + + ) : loggedIn ? ( 已登录