From 560b33ddbdf2b4c917f5208fb2a8b8d11e54a0aa Mon Sep 17 00:00:00 2001 From: Neo Date: Sun, 15 Feb 2026 01:22:28 +0800 Subject: [PATCH] fix: cnblogs detection logic (#190) --- packages/detection/src/configs.js | 2 +- packages/detection/src/detect.js | 2 + packages/detection/src/platforms/cnblogs.js | 55 +++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 packages/detection/src/platforms/cnblogs.js diff --git a/packages/detection/src/configs.js b/packages/detection/src/configs.js index 98cb627..3b049e6 100644 --- a/packages/detection/src/configs.js +++ b/packages/detection/src/configs.js @@ -91,7 +91,7 @@ export const LOGIN_CHECK_CONFIG = { juejin: JuejinLoginConfig, zhihu: ZhihuLoginConfig, toutiao: ToutiaoLoginConfig, - cnblogs: CnblogsLoginConfig, + baijiahao: BaijiahaoLoginConfig, wangyihao: WangyihaoLoginConfig, douyin: DouyinLoginConfig, diff --git a/packages/detection/src/detect.js b/packages/detection/src/detect.js index fd793b0..4da338c 100644 --- a/packages/detection/src/detect.js +++ b/packages/detection/src/detect.js @@ -23,6 +23,7 @@ import { detectSegmentFaultUser } from './platforms/segmentfault.js' import { detectInfoQUser } from './platforms/infoq.js' import { detectModelScopeUser } from './platforms/modelscope.js' import { detectVolcengineUser } from './platforms/volcengine.js' +import { detectCnblogsUser } from './platforms/cnblogs.js' // Platform-specific detectors map const PLATFORM_DETECTORS = { @@ -49,6 +50,7 @@ const PLATFORM_DETECTORS = { 'infoq': detectInfoQUser, 'modelscope': detectModelScopeUser, 'volcengine': detectVolcengineUser, + 'cnblogs': detectCnblogsUser, } export async function detectUser(platformId) { diff --git a/packages/detection/src/platforms/cnblogs.js b/packages/detection/src/platforms/cnblogs.js new file mode 100644 index 0000000..05bd537 --- /dev/null +++ b/packages/detection/src/platforms/cnblogs.js @@ -0,0 +1,55 @@ +import { convertAvatarToBase64 } from '../utils.js' + +/** + * Cnblogs (博客园) detection logic + * Strategy: + * 1. Collect cookies via chrome.cookies.getAll (MV3 service worker compatible) + * 2. Fetch user info via account.cnblogs.com/user/userinfo with cookies attached manually + * 3. Extract username and avatar from API response + */ +export async function detectCnblogsUser() { + try { + const cookies = await chrome.cookies.getAll({ domain: '.cnblogs.com' }) + const wwwCookies = await chrome.cookies.getAll({ url: 'https://www.cnblogs.com' }) + const accountCookies = await chrome.cookies.getAll({ url: 'https://account.cnblogs.com' }) + const allCookies = [...cookies, ...wwwCookies, ...accountCookies] + const seen = new Set() + const uniqueCookies = allCookies.filter(c => { + const key = `${c.name}=${c.value}` + if (seen.has(key)) return false + seen.add(key) + return true + }) + const cookieStr = uniqueCookies.map(c => `${c.name}=${c.value}`).join('; ') + + if (!cookieStr) return { loggedIn: false } + + const response = await fetch('https://account.cnblogs.com/user/userinfo', { + method: 'GET', + headers: { + 'Accept': 'application/json', + 'Cookie': cookieStr, + }, + }) + + if (!response.ok) return { loggedIn: false } + + const data = await response.json() + if (!data?.spaceUserId) return { loggedIn: false } + + const username = data.displayName || '' + let avatar = data.iconName || '' + + if (avatar && !avatar.startsWith('http')) { + avatar = 'https:' + avatar + } + if (avatar && avatar.includes('cnblogs.com')) { + avatar = await convertAvatarToBase64(avatar, 'https://www.cnblogs.com/') + } + + return { loggedIn: true, username, avatar } + } catch (e) { + console.error('[COSE] Cnblogs Detection Error:', e) + return { loggedIn: false, error: e.message } + } +}