feat: CDP 接管开关 + 扫码登录面板 + Docker 部署
- runner: enable_cdp_mode 从硬编码 False 改为系统设置 cdp_enabled。服务器部署下爬虫接管已开启远程调试的 Chrome(默认 9222),复用其 profile 登录态;本机桌面默认仍为关,行为不变 - qrlogin: 新增 CDP 扫码登录。Chrome 在服务器上跑于 Xvfb,show_qrcode 依赖的 PIL 桌面看图程序不存在,二维码无处可显示;改为经 CDP 从页面取出二维码交给 WebUI 渲染。刻意复用 browser.contexts[0](新建 context 是无痕 profile,扫了也白扫),且绝不调用 browser.close()(会连带关掉操作者自己的 Chrome) - webui: 设置页新增扫码面板,替换原本跳到采集页看终端二维码的入口 - Dockerfile / .dockerignore / docker-compose.yml: 服务器部署。host 网络是必需而非图省事——容器里 127.0.0.1:9222 必须落到宿主机回环 - UPSTREAM.md: 补充 gitcode 镜像,用于 GitHub 大包传输必断时补历史
This commit is contained in:
@@ -204,6 +204,46 @@ export function useClearCookie() {
|
||||
})
|
||||
}
|
||||
|
||||
// --- QR login (over CDP) ---------------------------------------------------
|
||||
|
||||
/** Polls only while a code is on screen; an idle session has nothing to watch. */
|
||||
export function useQrLoginStatus(polling: boolean) {
|
||||
return useQuery({
|
||||
queryKey: ['monitorQrLogin'],
|
||||
queryFn: async () => (await monitorApi.getQrLogin()).data,
|
||||
refetchInterval: polling ? 2000 : false,
|
||||
})
|
||||
}
|
||||
|
||||
export function useStartQrLogin() {
|
||||
const queryClient = useQueryClient()
|
||||
const platform = usePlatformParam()
|
||||
return useMutation({
|
||||
mutationFn: () => monitorApi.startQrLogin(platform),
|
||||
onSuccess: (response) => {
|
||||
queryClient.setQueryData(['monitorQrLogin'], response.data)
|
||||
},
|
||||
onError: (error: Error) => {
|
||||
// The backend's reason -- "Chrome is not reachable on ...", "no QR on the
|
||||
// page" -- is the entire value here, and axios would flatten it to
|
||||
// "Request failed with status code 502".
|
||||
const detail = (error as { response?: { data?: { detail?: string } } })?.response
|
||||
?.data?.detail
|
||||
toast.error(`获取二维码失败:${detail ?? error.message}`)
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export function useCancelQrLogin() {
|
||||
const queryClient = useQueryClient()
|
||||
return useMutation({
|
||||
mutationFn: () => monitorApi.cancelQrLogin(),
|
||||
onSuccess: (response) => {
|
||||
queryClient.setQueryData(['monitorQrLogin'], response.data)
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// --- Settings -------------------------------------------------------------
|
||||
|
||||
export function useSettings() {
|
||||
|
||||
Reference in New Issue
Block a user