commit 5bbfe35c9c4a65128e321c71f7211e8f766d8f84 Author: cheney Date: Fri Jul 17 18:46:36 2026 +0800 获取 cookies 成功 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ddddf4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +node_modules/.package-lock.json +node_modules/.bin/playwright +node_modules/.bin/playwright-core +node_modules/.bin/playwright-core.cmd +node_modules/.bin/playwright-core.ps1 +node_modules/.bin/playwright.cmd +node_modules/.bin/playwright.ps1 +node_modules/playwright/cli.js +node_modules/playwright/index.d.ts +node_modules/playwright/index.js +node_modules/playwright/index.mjs +node_modules/playwright/jsx-runtime.js +node_modules/playwright/jsx-runtime.mjs +node_modules/playwright/LICENSE +node_modules/playwright/NOTICE +node_modules/playwright/package.json +node_modules/playwright/README.md +node_modules/playwright/test.d.ts +node_modules/playwright/test.js +node_modules/playwright/test.mjs +node_modules/playwright/ThirdPartyNotices.txt +node_modules/playwright/lib/errorContext.js +node_modules/playwright/lib/globals.js +node_modules/playwright/lib/index.js +node_modules/playwright/lib/isomorphic.js +node_modules/playwright/lib/isomorphic.js.txt +node_modules/playwright/lib/package.js +node_modules/playwright/lib/program.js +node_modules/playwright/lib/util.js +node_modules/playwright/lib/agents/agentParser.js +node_modules/playwright/lib/agents/copilot-setup-steps.yml +node_modules/playwright/lib/agents/generateAgents.js +node_modules/playwright/lib/agents/playwright-test-coverage.prompt.md +node_modules/playwright/lib/agents/playwright-test-generate.prompt.md +node_modules/playwright/lib/agents/playwright-test-generator.agent.md +node_modules/playwright/lib/agents/playwright-test-heal.prompt.md +node_modules/playwright/lib/agents/playwright-test-healer.agent.md +node_modules/playwright/lib/agents/playwright-test-plan.prompt.md +node_modules/playwright/lib/agents/playwright-test-planner.agent.md +node_modules/playwright/lib/cli/reportActions.js +node_modules/playwright/lib/cli/testActions.js +node_modules/playwright/lib/common/index.js +node_modules/playwright/lib/common/index.js.txt +node_modules/playwright/lib/loader/loaderProcessEntry.js +node_modules/playwright/lib/loader/loaderProcessEntry.js.txt +node_modules/playwright/lib/matchers/expect.js +node_modules/playwright/lib/matchers/expect.js.LICENSE +node_modules/playwright/lib/matchers/expect.js.txt +node_modules/playwright/lib/mcp/test/browserBackend.js +node_modules/playwright/lib/mcp/test/generatorTools.js +node_modules/playwright/lib/mcp/test/plannerTools.js +node_modules/playwright/lib/mcp/test/seed.js +node_modules/playwright/lib/mcp/test/streams.js +node_modules/playwright/lib/mcp/test/testBackend.js +node_modules/playwright/lib/mcp/test/testContext.js +node_modules/playwright/lib/mcp/test/testTool.js +node_modules/playwright/lib/mcp/test/testTools.js +node_modules/playwright/lib/runner/index.js +node_modules/playwright/lib/runner/index.js.txt +node_modules/playwright/lib/transform/babelBundle.js +node_modules/playwright/lib/transform/babelBundle.js.LICENSE +node_modules/playwright/lib/transform/babelBundle.js.txt +node_modules/playwright/lib/transform/esmLoader.js +node_modules/playwright/lib/transform/esmLoader.js.LICENSE +node_modules/playwright/lib/transform/esmLoader.js.txt +node_modules/playwright/lib/worker/workerProcessEntry.js +node_modules/playwright/lib/worker/workerProcessEntry.js.txt +node_modules/playwright/types/test.d.ts +node_modules/playwright/types/testReporter.d.ts +node_modules/playwright-core/browsers.json +node_modules/playwright-core/cli.js +node_modules/playwright-core/index.d.ts +node_modules/playwright-core/index.js +node_modules/playwright-core/index.mjs +node_modules/playwright-core/LICENSE +node_modules/playwright-core/NOTICE +node_modules/playwright-core/package.json +node_modules/playwright-core/README.md +node_modules/playwright-core/ThirdPartyNotices.txt +node_modules/playwright-core/bin/install_media_pack.ps1 +node_modules/playwright-core/bin/install_webkit_wsl.ps1 +node_modules/playwright-core/bin/reinstall_chrome_beta_linux.sh +node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh +node_modules/playwright-core/bin/reinstall_chrome_beta_win.ps1 +node_modules/playwright-core/bin/reinstall_chrome_stable_linux.sh +node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh +node_modules/playwright-core/bin/reinstall_chrome_stable_win.ps1 +node_modules/playwright-core/bin/reinstall_msedge_beta_linux.sh +node_modules/playwright-core/bin/reinstall_msedge_beta_mac.sh +node_modules/playwright-core/bin/reinstall_msedge_beta_win.ps1 +node_modules/playwright-core/bin/reinstall_msedge_dev_linux.sh +node_modules/playwright-core/bin/reinstall_msedge_dev_mac.sh +node_modules/playwright-core/bin/reinstall_msedge_dev_win.ps1 +node_modules/playwright-core/bin/reinstall_msedge_stable_linux.sh +node_modules/playwright-core/bin/reinstall_msedge_stable_mac.sh +node_modules/playwright-core/bin/reinstall_msedge_stable_win.ps1 +node_modules/playwright-core/lib/bootstrap.js +node_modules/playwright-core/lib/coreBundle.js +node_modules/playwright-core/lib/package.js +node_modules/playwright-core/lib/serverRegistry.js +node_modules/playwright-core/lib/serverRegistry.js.LICENSE +node_modules/playwright-core/lib/utilsBundle.js +node_modules/playwright-core/lib/utilsBundle.js.LICENSE +node_modules/playwright-core/lib/xdg-open +node_modules/playwright-core/lib/entry/cliDaemon.js +node_modules/playwright-core/lib/entry/dashboardApp.js +node_modules/playwright-core/lib/entry/mcp.js +node_modules/playwright-core/lib/entry/oopBrowserDownload.js +node_modules/playwright-core/lib/server/deviceDescriptorsSource.json +node_modules/playwright-core/lib/server/chromium/appIcon.png +node_modules/playwright-core/lib/server/electron/loader.js +node_modules/playwright-core/lib/tools/cli-client/channelSessions.js +node_modules/playwright-core/lib/tools/cli-client/cli.js +node_modules/playwright-core/lib/tools/cli-client/help.json +node_modules/playwright-core/lib/tools/cli-client/minimist.js +node_modules/playwright-core/lib/tools/cli-client/output.js +node_modules/playwright-core/lib/tools/cli-client/program.js +node_modules/playwright-core/lib/tools/cli-client/registry.js +node_modules/playwright-core/lib/tools/cli-client/session.js +node_modules/playwright-core/lib/tools/cli-client/skill/SKILL.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/element-attributes.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/playwright-tests.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/request-mocking.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/running-code.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/session-management.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/spec-driven-testing.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/storage-state.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/test-generation.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/tracing.md +node_modules/playwright-core/lib/tools/cli-client/skill/references/video-recording.md +node_modules/playwright-core/lib/tools/dashboard/appIcon.png +node_modules/playwright-core/lib/tools/trace/SKILL.md +node_modules/playwright-core/lib/tools/utils/extension.js +node_modules/playwright-core/lib/tools/utils/socketConnection.js +node_modules/playwright-core/lib/vite/dashboard/index.html +node_modules/playwright-core/lib/vite/dashboard/playwright-logo.svg +node_modules/playwright-core/lib/vite/dashboard/assets/codicon-DCmgc-ay.ttf +node_modules/playwright-core/lib/vite/dashboard/assets/firefox-1bWoP6pv.svg +node_modules/playwright-core/lib/vite/dashboard/assets/firefox-beta-k3eOH_eK.svg +node_modules/playwright-core/lib/vite/dashboard/assets/firefox-nightly-Cp5nfeDT.svg +node_modules/playwright-core/lib/vite/dashboard/assets/index-BY2S1tHT.css +node_modules/playwright-core/lib/vite/dashboard/assets/index-C_5TMfeg.js +node_modules/playwright-core/lib/vite/dashboard/assets/safari-na3_-uQk.svg +node_modules/playwright-core/lib/vite/htmlReport/index.html +node_modules/playwright-core/lib/vite/htmlReport/report.css +node_modules/playwright-core/lib/vite/htmlReport/report.js +node_modules/playwright-core/lib/vite/recorder/index.html +node_modules/playwright-core/lib/vite/recorder/playwright-logo.svg +node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DeBYQozu.js +node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DYBRYzYX.css +node_modules/playwright-core/lib/vite/recorder/assets/codicon-DCmgc-ay.ttf +node_modules/playwright-core/lib/vite/recorder/assets/index-4ZiSSCmn.css +node_modules/playwright-core/lib/vite/recorder/assets/index-Bq-mQf8S.js +node_modules/playwright-core/lib/vite/traceViewer/codeMirrorModule.DYBRYzYX.css +node_modules/playwright-core/lib/vite/traceViewer/codicon.DCmgc-ay.ttf +node_modules/playwright-core/lib/vite/traceViewer/defaultSettingsView.CjdS-WJx.css +node_modules/playwright-core/lib/vite/traceViewer/index.CzXZzn5A.css +node_modules/playwright-core/lib/vite/traceViewer/index.DMMX1gXU.js +node_modules/playwright-core/lib/vite/traceViewer/index.html +node_modules/playwright-core/lib/vite/traceViewer/manifest.webmanifest +node_modules/playwright-core/lib/vite/traceViewer/playwright-logo.svg +node_modules/playwright-core/lib/vite/traceViewer/snapshot.html +node_modules/playwright-core/lib/vite/traceViewer/snapshot.v8KI4P3m.js +node_modules/playwright-core/lib/vite/traceViewer/sw.bundle.js +node_modules/playwright-core/lib/vite/traceViewer/uiMode.BZQ54Kgt.css +node_modules/playwright-core/lib/vite/traceViewer/uiMode.html +node_modules/playwright-core/lib/vite/traceViewer/uiMode.Ut8wwJNp.js +node_modules/playwright-core/lib/vite/traceViewer/xtermModule.DYP7pi_n.css +node_modules/playwright-core/lib/vite/traceViewer/assets/codeMirrorModule-LEHpjmcn.js +node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-BNmKHKpQ.js +node_modules/playwright-core/lib/vite/traceViewer/assets/urlMatch-BYQrIQwR.js +node_modules/playwright-core/lib/vite/traceViewer/assets/xtermModule-CsJ4vdCR.js +node_modules/playwright-core/types/protocol.d.ts +node_modules/playwright-core/types/structs.d.ts +node_modules/playwright-core/types/types.d.ts +config.json diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..5b0bac1 --- /dev/null +++ b/Readme.md @@ -0,0 +1,20 @@ +# 抖小云插件 +1. 基于 playwright 获取 cookie +Cookie 及 sec_user_id 是同步功能的核心,需严格按步骤获取,避免遗漏或错误。 +1.1 提取Cookie以及 sec_uer_id +打开 抖音网页版 (https://www.douyin.com/) 并登录目标账号; +进入个人主页,按下F12进入开发者模式、并切换到 网络(也可能叫network). +在筛选框中输入/follow. +点击自己头像边上的 关注 按钮、会弹出你的关注列表,然后在右侧网络请求里面会出现多个请求,随便选一个. +在请求的标签里面切换到负载(也可能叫payload) +找到sec_user_id,复制值即可 +在请求的标签里面切换到标头(也可能叫Headers) +往下拉,直到出现Cookie ,复制完整的值,注意前后不要带换行符,很多人会多复制个换行符出来. + + +2. 已知 Cookie 及 sec_user_id, 实现清空收藏和点赞功能 + + + + + diff --git a/get-cookie.js b/get-cookie.js new file mode 100644 index 0000000..5f750cc --- /dev/null +++ b/get-cookie.js @@ -0,0 +1,210 @@ +// 获取抖音 Cookie 和 sec_user_id 的 Playwright 脚本 +// 用法: node get-cookie.js +// 会自动打开 Chrome 浏览器,请扫码登录抖音 + +import { chromium } from "playwright"; +import { writeFileSync, readFileSync } from "fs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const CONFIG_PATH = resolve(__dirname, "config.json"); + +async function main() { + console.log("🚀 启动浏览器..."); + + const browser = await chromium.launch({ + channel: "chrome", + headless: false, + args: ["--disable-blink-features=AutomationControlled"], + }); + + const context = await browser.newContext({ + viewport: { width: 1366, height: 768 }, + userAgent: + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", + }); + + const page = await context.newPage(); + + // 监听网络请求,捕获 sec_user_id + let capturedSecUserId = null; + + page.on("request", (request) => { + const url = request.url(); + if (url.includes("follow") || url.includes("aweme")) { + try { + const postData = request.postData(); + if (postData && postData.includes("sec_user_id")) { + const parsed = JSON.parse(postData); + if (parsed.sec_user_id) { + capturedSecUserId = parsed.sec_user_id; + console.log("✅ 从请求中捕获到 sec_user_id:", capturedSecUserId); + } + } + } catch (e) { + // 忽略解析错误 + } + } + }); + + // 也监听响应,从 body 中提取 sec_user_id + page.on("response", async (response) => { + const url = response.url(); + if (url.includes("user/self") || url.includes("aweme")) { + try { + const body = await response.text(); + const match = body.match(/"sec_uid":"([^"]+)"/); + if (match && !capturedSecUserId) { + capturedSecUserId = match[1]; + console.log("✅ 从响应中捕获到 sec_user_id:", capturedSecUserId); + } + } catch (e) { + // 忽略 + } + } + }); + + console.log("📱 正在打开抖音登录页..."); + await page.goto("https://www.douyin.com/", { + waitUntil: "domcontentloaded", + timeout: 30000, + }); + + console.log("🔑 请在浏览器中扫码登录抖音..."); + console.log(" (等待登录完成,检测到登录后会自动继续)"); + + // 等待登录成功:检测 cookie 中是否有 sessionid + await waitForLogin(context); + + console.log("✅ 登录成功!"); + + // 导航到个人主页以触发 sec_user_id 相关请求 + console.log("📋 正在访问个人主页获取 sec_user_id..."); + await page.goto("https://www.douyin.com/user/self?from_tab_name=main", { + waitUntil: "networkidle", + timeout: 30000, + }); + + // 等待页面加载 + await page.waitForTimeout(3000); + + // 尝试从页面数据中提取 sec_user_id + if (!capturedSecUserId) { + capturedSecUserId = await extractSecUserIdFromPage(page); + } + + // 如果还没获取到,尝试点击关注按钮触发请求 + if (!capturedSecUserId) { + console.log("🖱️ 尝试触发关注列表请求以获取 sec_user_id..."); + try { + // 点击关注按钮 + const followBtn = page.locator('[data-e2e="follow-count"]').first(); + if (await followBtn.isVisible({ timeout: 5000 })) { + await followBtn.click(); + await page.waitForTimeout(3000); + } + } catch (e) { + console.log(" 未能找到关注按钮,尝试其他方式..."); + } + + // 再次尝试从请求中获取 + if (!capturedSecUserId) { + capturedSecUserId = await extractSecUserIdFromPage(page); + } + } + + // 获取所有 cookies + const cookies = await context.cookies(); + const cookieString = cookies + .map((c) => `${c.name}=${c.value}`) + .join("; "); + + console.log("\n========================================"); + console.log("📋 获取结果:"); + console.log("========================================"); + console.log("Cookie:", cookieString.substring(0, 200) + "..."); + console.log("sec_user_id:", capturedSecUserId || "❌ 未获取到"); + console.log("========================================\n"); + + // 读取现有配置 + let config = {}; + try { + config = JSON.parse(readFileSync(CONFIG_PATH, "utf8")); + } catch (e) { + console.log(" 未找到现有配置,将创建新配置"); + } + + // 更新配置 + config.cookie = cookieString; + if (capturedSecUserId) { + config.sec_user_id = capturedSecUserId; + } + + writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 4), "utf8"); + console.log(`💾 配置已保存到: ${CONFIG_PATH}`); + + if (!capturedSecUserId) { + console.log("\n⚠️ 未能自动获取 sec_user_id"); + console.log(" 请参考 README 手动获取:"); + console.log(" 1. 按 F12 打开开发者工具 -> Network"); + console.log(" 2. 筛选 'follow'"); + console.log(" 3. 点击关注按钮,在请求 Payload 中找到 sec_user_id"); + console.log(" 4. 手动填入 config.json"); + } + + await browser.close(); + console.log("👋 浏览器已关闭,脚本执行完毕"); +} + +// 等待用户登录成功 +async function waitForLogin(context) { + return new Promise((resolve) => { + const checkInterval = setInterval(async () => { + const cookies = await context.cookies(); + const hasSession = cookies.some((c) => c.name === "sessionid"); + if (hasSession) { + clearInterval(checkInterval); + resolve(); + } + }, 2000); + }); +} + +// 从页面中提取 sec_user_id +async function extractSecUserIdFromPage(page) { + // 方法1: 从页面 URL 提取 + const url = page.url(); + const urlMatch = url.match(/user\/([^?]+)/); + if (urlMatch && urlMatch[1] !== "self") { + return urlMatch[1]; + } + + // 方法2: 从页面 HTML 中的 __INITIAL_STATE__ 提取 + try { + const html = await page.content(); + const match = html.match(/"sec_uid":"([^"]+)"/); + if (match) return match[1]; + } catch (e) { + // 忽略 + } + + // 方法3: 从 window.__INITIAL_STATE__ 提取 + try { + const secUid = await page.evaluate(() => { + const state = window.__INITIAL_STATE__; + if (state?.user?.sec_uid) return state.user.sec_uid; + return null; + }); + if (secUid) return secUid; + } catch (e) { + // 忽略 + } + + return null; +} + +main().catch((err) => { + console.error("❌ 脚本执行出错:", err.message); + process.exit(1); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2430be3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,60 @@ +{ + "name": "p20260129-douxiaoyun", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "p20260129-douxiaoyun", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "playwright": "^1.61.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmmirror.com/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..28ea50e --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "p20260129-douxiaoyun", + "version": "1.0.0", + "description": "宸茬煡 Cookie 鍙?sec_user_id, 瀹炵幇娓呯┖鏀惰棌鍜岀偣璧炲姛鑳?", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" \u0026\u0026 exit 1", + "get-cookie": "node get-cookie.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "playwright": "^1.61.1" + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..8beaa9f --- /dev/null +++ b/src/index.js @@ -0,0 +1,250 @@ +// 读取配置文件 +import { readFileSync } from 'fs'; +const config = JSON.parse(readFileSync('./src/config.json', 'utf8')); +const { cookie, sec_user_id } = config; + +async function getCollection() { + try { + const response = await fetch("https://www.douyin.com/aweme/v1/web/aweme/listcollection/?device_platform=webapp&aid=6383&channel=channel_pc_web&publish_video_strategy_type=2&pc_client_type=1&pc_libra_divert=Windows&update_version_code=170400&support_h265=1&support_dash=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=122.0.6261.95&browser_online=true&engine_name=Blink&engine_version=122.0.6261.95&os_name=Windows&os_version=10&cpu_core_num=8&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=100&webid=7588123201441105427&uifid=e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98&msToken=iSlpjUc-ZZQXUB5K8kTx-rVX40ddZzt9DXqE_3u-wLxKxhafhk8Td9D-ONMw4qNA687n_VJ_i3emaOwGNEqbXabtUXEVISxidkZvl7ey4nZcD3e0p4923IlP9vmLynlQujZVPuhpuRa9tWSOJ0fGEnP8q7gZeiBG7hJBp2lRdAU%3D&a_bogus=DJsVDH6JYZ5jKd%2Ft8KmTtvOU56Elrs8y4eiQSPnPCxPgPhFGPuPBObV-cPP35MMZSYphw9MHcD5VTfdTYUWS0enkqmZkuzU6cz%2FAI08LgqwVbFU8gq8mCghFuwBT8Rwi-QQ1ieXRIssr2jxR9r5EAB2aH5FH5bEgSHBIpMbyjDS8psyTno%2FnCcYWH7L%3D&verifyFp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj&fp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj×tamp=1769677150&x-secsdk-web-signature=6931c547636fc1cfd1186d6bee47414a", { + "headers": { + "accept": "application/json, text/plain, */*", + "accept-language": "zh-CN,zh;q=0.9", + "cache-control": "no-cache", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "pragma": "no-cache", + "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "uifid": "e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98", + "x-secsdk-csrf-token": "DOWNGRADE", + "cookie": cookie, + "Referer": "https://www.douyin.com/user/self?from_tab_name=main&showTab=favorite_collection", + "Referrer-Policy": "no-referrer-when-downgrade" + }, + "body": "count=10&cursor=0", + "method": "POST" + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error('Error fetching collection list:', error); + return null; + } +} + +async function getAndUnCollection() { + try { + let ret = await getCollection(); + if (!ret || !ret.aweme_list) { + console.error('No collection list found'); + return; + } + + let aweme_list = ret.aweme_list; + let aweme_ids = []; + + for (let index = 0; index < aweme_list.length; index++) { + const element = aweme_list[index]; + if (element && element.aweme_id) { + aweme_ids.push(element.aweme_id); + } + } + + if (aweme_ids.length > 0) { + console.log(`Found ${aweme_ids.length} collection items`); + await unCollection(aweme_ids); + } else { + console.log('No collection items to uncollect'); + } + } catch (error) { + console.error('Error in getAndUnCollection:', error); + } +} + +async function unCollection(ids) { + try { + // 构建 aweme_type_map + const aweme_type_map = {}; + ids.forEach(id => { + aweme_type_map[id] = 0; + }); + + // 构建请求体 + const body = `aweme_ids=${ids.join('%2C')}&aweme_type_map=${encodeURIComponent(JSON.stringify(aweme_type_map))}`; + + const response = await fetch("https://www.douyin.com/aweme/v1/web/aweme/cancel/collect/multi/?device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&pc_libra_divert=Windows&update_version_code=170400&support_h265=1&support_dash=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=122.0.6261.95&browser_online=true&engine_name=Blink&engine_version=122.0.6261.95&os_name=Windows&os_version=10&cpu_core_num=8&device_memory=8&platform=PC&downlink=2.25&effective_type=4g&round_trip_time=200&webid=7588123201441105427&uifid=e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98&verifyFp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj&fp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj&msToken=gm3y5Z8Zs-ESl5ZxONjXIQQqhHn6XZvoBLS-ciy0w_wtvszmbAWR_jjXM5F2wLyFkgdBC6MQ2INL4FOCi85sI53qpaOs_yY3A7Fh7WevXbpsIzkD7sQKIjrgVEgbIOAlc4O1zGiU_tLoi2X9ZsIP5TlVg6p9ecYALNzAjwkdLvg%3D&a_bogus=OfsjDwtLEq5jadFbmODstl2UvSoANTWyk-TKRHaPtPYoPhlTXmNPQq4NJoiV5VZzWYphwKZHGD5UGdxb8U1r8CnkwmhkuF7fAT%2FnI60o%2FqwgGts%2FDqmDC0YzzwBFUOJNl%2FCfiAm5Ws0x2VnRVH5gAp2ae5zqQbfgWNpIp%2FG9jDS8psyTno%2FnCcYWH7L%3D", { + "headers": { + "accept": "application/json, text/plain, */*", + "accept-language": "zh-CN,zh;q=0.9", + "cache-control": "no-cache", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "pragma": "no-cache", + "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "uifid": "e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98", + "x-secsdk-csrf-token": "DOWNGRADE", + "cookie": cookie, + "Referer": "https://www.douyin.com/user/self?from_tab_name=main&showTab=favorite_collection", + "Referrer-Policy": "no-referrer-when-downgrade" + }, + "body": body, + "method": "POST" + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + console.log('Uncollection result:', data); + return data; + } catch (error) { + console.error('Error uncollecting items:', error); + return null; + } +} + +async function getFavorite() { + try { + const response = await fetch("https://www.douyin.com/aweme/v1/web/aweme/favorite/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id=MS4wLjABAAAAeCSMEnt7Z_MPClAjdbmjofNkc5QXE1kgLEeEztHMllXHD-6jm_yVA0-yhPbfmoTs&max_cursor=1765691979000&min_cursor=0&whale_cut_token=&cut_version=1&count=18&publish_video_strategy_type=2&update_version_code=170400&pc_client_type=1&pc_libra_divert=Windows&support_h265=0&support_dash=0&cpu_core_num=8&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=132.0.0.0&browser_online=true&engine_name=Blink&engine_version=132.0.0.0&os_name=Windows&os_version=10&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=50&webid=7600719568957376051&uifid=5a0fbbb49c6c57acd77ca86d66dd2e8e2f1fcf7b3fa6b8a56e480f684bd08589553786161c459bb4fde00266efba4bd4c7d71cbbbad2aa259a57d98088e17aa732fcd7470f39fc1ad8e6c4dabca3df6cd6bb2981b17d2ca74fda32cce67b70cd3e751397bddfe28b867839d4bdadac332514874de9aa707e360bddc17cff6bc614830247bd64b3e8636de32f8ad3980392acb5339b9ebd0a1769462c4804352394b3d1bae7b1145706962cd2283c7dd332300ece35b337ec699cd4539ff4b521&msToken=vGl5fdx6IS2me-NiDMAT5PzpgXrkv6pW_-nR7BuX8etF_FNvFYCyIoocOkB5hoy_nXnHtg9TXsImr1vB_OPa0CcQ8590y6y8jE4M6PYyn6y_BzmF5wr8uToew-m0so_1zSBIYUQg1gtxNAphc3iVZMG_OKdXmgH82ihVWVKEKyWzjtmcZvlkzw%3D%3D&a_bogus=xj4VgHt7EZRVPV%2FS8cBt9l3lH9DlNPuy13T2SYoTyNKvPwzGjmPPOcG6GoLcvkk-bSBhwq57efTAbnxb8UUzZC9pomhfSoXb5t%2F5I6fL0qNgGUG%2FENRpe0gFuwsC0QJNlACnilkRWs0x2VxRnH52AB%2FGt5z95cEgbrp5p2SyjDC8pByTV9%2F7e-hD&verifyFp=verify_mkza1y3w_BssDMxBB_ts4H_4IAZ_8E6V_jkFSXMpq4wYX&fp=verify_mkza1y3w_BssDMxBB_ts4H_4IAZ_8E6V_jkFSXMpq4wYX×tamp=1769681008&x-secsdk-web-signature=35459cca9b59c6163483716753a9dc66", { + "headers": { + "accept": "application/json, text/plain, */*", + "accept-language": "zh-CN,zh;q=0.9", + "bd-ticket-guard-client-data": "eyJ0c19zaWduIjoidHMuMi4wOWM4MGUxZTI0ZWU0OTRlZDhkMDUwY2FiNDRiNjdhNjFmMTAwMzIxNWY1M2Y1NTdjMGQ2YjdhNDAyZDU0YTI1YzRmYmU4N2QyMzE5Y2YwNTMxODYyNGNlZGExNDkxMWNhNDA2ZGVkYmViZWRkYjJlMzBmY2U4ZDRmYTAyNTc1ZCIsInJlcV9jb250ZW50IjoidGlja2V0LHBhdGgsdGltZXN0YW1wIiwicmVxX3NpZ24iOiJlb04waWxTN3dkMk1YV3NJclFJMkQ1WFpuVDJkcXdpRDRjdjRpeG5xZDhvPSIsInRpbWVzdGFtcCI6MTc2OTY4MDk4OH0=", + "bd-ticket-guard-ree-public-key": "BDFSjf1IHDC+RwmekDG7hX6Ii7yyo1VVMi6vlrxYsIYCBLgh2qXrzcLu+jE4olVa8zH2lGD1cB/616irMfSGu1g=", + "bd-ticket-guard-version": "2", + "bd-ticket-guard-web-sign-type": "1", + "bd-ticket-guard-web-version": "2", + "priority": "u=1, i", + "sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "uifid": "5a0fbbb49c6c57acd77ca86d66dd2e8e2f1fcf7b3fa6b8a56e480f684bd08589553786161c459bb4fde00266efba4bd4c7d71cbbbad2aa259a57d98088e17aa732fcd7470f39fc1ad8e6c4dabca3df6cd6bb2981b17d2ca74fda32cce67b70cd3e751397bddfe28b867839d4bdadac332514874de9aa707e360bddc17cff6bc614830247bd64b3e8636de32f8ad3980392acb5339b9ebd0a1769462c4804352394b3d1bae7b1145706962cd2283c7dd332300ece35b337ec699cd4539ff4b521", + "cookie": "__ac_nonce=0697b2e3600104b1bd7f; __ac_signature=_02B4Z6wo00f01yUC1zQAAIDC-lkke770FA8lItOAAKBF8b; enter_pc_once=1; UIFID_TEMP=5a0fbbb49c6c57acd77ca86d66dd2e8e2f1fcf7b3fa6b8a56e480f684bd08589553786161c459bb4fde00266efba4bd4c7d71cbbbad2aa259a57d98088e17aa7a4fb5f307eb559957b59bc456d25171caa34ffb196da703781bff979c74a99b9644f7279a9765a1bdbc942ce138d28af; x-web-secsdk-uid=a13f9c68-00b8-4c59-9dde-415f7195cabe; douyin.com; s_v_web_id=verify_mkza1y3w_BssDMxBB_ts4H_4IAZ_8E6V_jkFSXMpq4wYX; device_web_cpu_core=8; device_web_memory_size=8; architecture=amd64; dy_swidth=1536; dy_sheight=864; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1536%2C%5C%22screen_height%5C%22%3A864%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A8%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A50%7D%22; strategyABtestKey=%221769680465.383%22; volume_info=%7B%22isUserMute%22%3Afalse%2C%22isMute%22%3Afalse%2C%22volume%22%3A0.5%7D; passport_csrf_token=7909c48cfe09c5641464f32f4ad1db63; passport_csrf_token_default=7909c48cfe09c5641464f32f4ad1db63; record_force_login=%7B%22timestamp%22%3A1769680481014%2C%22force_login_video%22%3A1%2C%22force_login_live%22%3A0%2C%22force_login_direct_video%22%3A0%7D; ttwid=1%7C_avd_ZbQ2atFZh5vU2oo6KN3lAXD6TPZx5Nh-uDA2VA%7C1769680480%7C4d6ec4cb4c148f9b6f552d9e469bce7e77d9671f5c900165cc39aefb815afc6e; bd_ticket_guard_client_web_domain=2; fpk1=U2FsdGVkX18t6chzVlpgMpv8/TJ3FL3QKYGqd4DUz1XS5XIdEBWPtrKEsSU0hOTYjm37QWhYl+a+CsS4G9J9kg==; fpk2=41770e408d453f0e18b6cf535e220c84; download_guide=%221%2F20260129%2F0%22; passport_mfa_token=CjfNowCrjYLiaToF2RyBl4dqr661QMRPuOabkGnRUOllvS2kFCiuXQTp1AxsRs4gNisQKm4lae%2BxGkoKPAAAAAAAAAAAAABQAnxrshca46OV0tjbdAwLtdbfKtTUWa%2ByJkuKObq55oVimWfmJmvY%2BCvJDb0zOUObcBDgmogOGPax0WwgAiIBA8sD3dc%3D; d_ticket=7225a12d2871fbb23768eb2a1d242df1a62b5; passport_assist_user=CkFCM1T6Xx1bta82xsIAEvvO21irEfgKyUQbFsnCQsaH_rsR_Hopws0JvcGqQ79wLqbqJayTTwtmTQtLSdwofOFVDhpKCjwAAAAAAAAAAAAAUAJAtdXErkSDF5475Fihw1AH3Z3KTWZ9Tk8Op5mhTioxyEHTnJIjbTlbvgnhWqkooA0Q95qIDhiJr9ZUIAEiAQMKHjOe; n_mh=ymir6J68APSe1AA9Cf4Vf_pxmRkozlGIIo7-BV1-SHY; sid_guard=a9194ad0336f922c7faffbd3c5545aa2%7C1769680539%7C5183999%7CMon%2C+30-Mar-2026+09%3A55%3A38+GMT; uid_tt=20804682d9fb2c07d27f9dc6f419dfbb; uid_tt_ss=20804682d9fb2c07d27f9dc6f419dfbb; sid_tt=a9194ad0336f922c7faffbd3c5545aa2; sessionid=a9194ad0336f922c7faffbd3c5545aa2; sessionid_ss=a9194ad0336f922c7faffbd3c5545aa2; session_tlb_tag=sttt%7C4%7CqRlK0DNvkix_r_vTxVRaov_________ANYVDx3-cuYVwhe4zbhqT88SXuDh669amwKZ-t_gUeX4%3D; is_staff_user=false; sid_ucp_v1=1.0.0-KDJlZDFkN2E5NTlmMmY5MTllY2ZkNjFiODIwNWFmYmU4YmNiZDE4ZDYKIQjdpcCdo431AxCb3ezLBhjvMSAMMNL3jJUGOAdA9AdIBBoCbGYiIGE5MTk0YWQwMzM2ZjkyMmM3ZmFmZmJkM2M1NTQ1YWEy; ssid_ucp_v1=1.0.0-KDJlZDFkN2E5NTlmMmY5MTllY2ZkNjFiODIwNWFmYmU4YmNiZDE4ZDYKIQjdpcCdo431AxCb3ezLBhjvMSAMMNL3jJUGOAdA9AdIBBoCbGYiIGE5MTk0YWQwMzM2ZjkyMmM3ZmFmZmJkM2M1NTQ1YWEy; _bd_ticket_crypt_cookie=8052f80bff578e796e6fb453dd34ee44; __security_mc_1_s_sdk_sign_data_key_web_protect=d6696f11-4504-9c78; __security_mc_1_s_sdk_cert_key=4501ea5d-4027-9da3; __security_mc_1_s_sdk_crypt_sdk=d1905fd9-4998-ad6c; __security_server_data_status=1; login_time=1769680539868; publish_badge_show_info=%220%2C0%2C0%2C1769680541011%22; UIFID=5a0fbbb49c6c57acd77ca86d66dd2e8e2f1fcf7b3fa6b8a56e480f684bd08589553786161c459bb4fde00266efba4bd4c7d71cbbbad2aa259a57d98088e17aa732fcd7470f39fc1ad8e6c4dabca3df6cd6bb2981b17d2ca74fda32cce67b70cd3e751397bddfe28b867839d4bdadac332514874de9aa707e360bddc17cff6bc614830247bd64b3e8636de32f8ad3980392acb5339b9ebd0a1769462c4804352394b3d1bae7b1145706962cd2283c7dd332300ece35b337ec699cd4539ff4b521; IsDouyinActive=true; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCREZTamYxSUhEQytSd21la0RHN2hYNklpN3l5bzFWVk1pNnZscnhZc0lZQ0JMZ2gycVhyemNMdStqRTRvbFZhOHpIMmxHRDFjQi82MTZpck1mU0d1MWc9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; home_can_add_dy_2_desktop=%221%22; odin_tt=b2eddb1200090cc10b834cf1ef139760b2cba46639f08d06ad3376dab0ae14d90cbe2aebb0207fccdb6ae40d9190c58f05117bb6b259f7e5323ebf308dc17591; biz_trace_id=e395aa6c; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A1%7D%22; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e5927666d776a686028607d71606b766c6a6b3f2a2a646063606d616d61666c6c606a66646e636a677564646a696d6c756e667562662a666a6b71606b715a7666776c7571762a666a757c2b6f76592758272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f2730323d313c3c353d333c333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=WHB4DmWK7cEw4NeVjD_uA0u4KFaiuj8Ms1c7O-6RRfsXTxvPLdhVV4VLxg6peKbOAZPCWgLckVULO7IXJS8ax_J7esd3FHGuNkaqgpO6AcsnwJ_2d5t4syLDaPU0lHbAz5LD6lYWut1v211JJlXY1vnCOSkNUY2Jxl5najSEjVgRq_GCX8yGZoHsDuKrkeqQj_pPT9gNR1zLRGzVIxPvV-YalBRIKPr9kOFrKm58m4pyjHXfT_Z-CiJfqddBemPZOSPzvtkbNAMzUuse-HrzJI3YDv_Tn4_LEWVYw8H9Nc1MKV830M9PGWy1JuEiV35o6KXCUiUG5LE5KVi5bunBI4ecdFYOuj453x4ajZM-TxLYkOIcp0kslX9B7HIoHWTC2VmeDuDU5KTcuINlbZVDFheBzKH-EEOJcgqB49IF45_0SqzvmO1gzd_AftIBI11R6KyY87DaDzdSz2Dmrav5BjLHjk1hdi6W96706jAHP_hPyRUVXNrffPt12VAhRDAV; gulu_source_res=eyJwX2luIjoiMGFlMWE3M2ZhMmUzMjFiMWEzNDkxZGU4MDQ1ZTY3ZTk1N2ExNDAzNmVkYjc3ZmY5YTk5ZTQ2Yjg0NDdjYWM5ZCJ9; passport_auth_mix_state=jhu02zd2aztdpyyvmb17i7sj6ibmwjef; SelfTabRedDotControl=%5B%7B%22id%22%3A%227574683742594140160%22%2C%22u%22%3A38%2C%22c%22%3A38%7D%2C%7B%22id%22%3A%227056013361556752397%22%2C%22u%22%3A196%2C%22c%22%3A196%7D%2C%7B%22id%22%3A%227555445702927927346%22%2C%22u%22%3A19%2C%22c%22%3A19%7D%2C%7B%22id%22%3A%227579535671182755880%22%2C%22u%22%3A74%2C%22c%22%3A74%7D%2C%7B%22id%22%3A%227484548117287667748%22%2C%22u%22%3A36%2C%22c%22%3A36%7D%2C%7B%22id%22%3A%227572829434814679082%22%2C%22u%22%3A23%2C%22c%22%3A23%7D%2C%7B%22id%22%3A%227519198993897752626%22%2C%22u%22%3A48%2C%22c%22%3A48%7D%2C%7B%22id%22%3A%227522860615451297831%22%2C%22u%22%3A24%2C%22c%22%3A24%7D%2C%7B%22id%22%3A%227579541484920113203%22%2C%22u%22%3A14%2C%22c%22%3A14%7D%2C%7B%22id%22%3A%227346029101657884726%22%2C%22u%22%3A28%2C%22c%22%3A28%7D%2C%7B%22id%22%3A%227586546512528672768%22%2C%22u%22%3A15%2C%22c%22%3A15%7D%2C%7B%22id%22%3A%227569955270361614388%22%2C%22u%22%3A6%2C%22c%22%3A6%7D%2C%7B%22id%22%3A%227201745525119387685%22%2C%22u%22%3A189%2C%22c%22%3A189%7D%2C%7B%22id%22%3A%227420037769667282985%22%2C%22u%22%3A8%2C%22c%22%3A8%7D%5D; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJERlNqZjFJSERDK1J3bWVrREc3aFg2SWk3eXlvMVZWTWk2dmxyeFlzSVlDQkxnaDJxWHJ6Y0x1K2pFNG9sVmE4ekgybEdEMWNCLzYxNmlyTWZTR3UxZz0iLCJ0c19zaWduIjoidHMuMi4wOWM4MGUxZTI0ZWU0OTRlZDhkMDUwY2FiNDRiNjdhNjFmMTAwMzIxNWY1M2Y1NTdjMGQ2YjdhNDAyZDU0YTI1YzRmYmU4N2QyMzE5Y2YwNTMxODYyNGNlZGExNDkxMWNhNDA2ZGVkYmViZWRkYjJlMzBmY2U4ZDRmYTAyNTc1ZCIsInJlcV9jb250ZW50Ijoic2VjX3RzIiwicmVxX3NpZ24iOiJ2N2hMRkRzKzg0aGZORmJLTnZQbU9UdzN5d2FVUWtnK2lHalF6aDh3b1I4PSIsInNlY190cyI6IiNIT3M3ZUNYTnFma0tzOGJPN1o2ZE1wNEdoNTZsZDloWjU1NjlPcDE1MXVENHVkbkZUdE1MVnlNeDNZSngifQ%3D%3D; my_rd=2", + "Referer": "https://www.douyin.com/user/self?from_tab_name=main&showTab=like", + "Referrer-Policy": "no-referrer-when-downgrade" + }, + "body": null, + "method": "GET" +}); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error('Error fetching favorite list:', error); + return null; + } +} + +async function getAndUnFavorite() { + try { + let ret = await getFavorite(); + if (!ret || !ret.aweme_list) { + console.error('No favorite list found'); + return; + } + + let aweme_list = ret.aweme_list; + let aweme_ids = []; + + for (let index = 0; index < aweme_list.length; index++) { + const element = aweme_list[index]; + if (element && element.aweme_id) { + aweme_ids.push(element.aweme_id); + } + } + + if (aweme_ids.length > 0) { + console.log(`Found ${aweme_ids.length} favorite items`); + await unFavorites(aweme_ids); + } else { + console.log('No favorite items to unfavorite'); + } + } catch (error) { + console.error('Error in getAndUnFavorite:', error); + } +} + +async function unFavorites(ids) { + try { + // 构建 item_type_map + const item_type_map = {}; + ids.forEach(id => { + item_type_map[id] = 0; + }); + + // 构建请求体 + const body = `aweme_ids=${ids.join('%2C')}&item_type_map=${encodeURIComponent(JSON.stringify(item_type_map))}`; + + const response = await fetch("https://www.douyin.com/aweme/v1/web/cancel/item/digg/multi/?device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&pc_libra_divert=Windows&update_version_code=170400&support_h265=1&support_dash=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1536&screen_height=864&browser_language=zh-CN&browser_platform=Win32&browser_name=Chrome&browser_version=122.0.6261.95&browser_online=true&engine_name=Blink&engine_version=122.0.6261.95&os_name=Windows&os_version=10&cpu_core_num=8&device_memory=8&platform=PC&downlink=10&effective_type=4g&round_trip_time=100&webid=7588123201441105427&uifid=e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98&msToken=F0kPDGU38Gd8N6XXWgz-L8OtZkRJ7A_CXcll-C3uMUXHrW3Yz1BM2227vKwOEKgiCeyc4qASII7SoiNRVDUGx5oUd_lhMCnFlQlnzoO4D8Rm4p5VsSn4pZgkl0Wmhz27vn8FHeONpv9g0VFvM_XFIAJzDh9thrKpo0FiNzv0KT4%3D&a_bogus=OjsRhH77YNWnOVMG8cDitWclrH6ANBuyVaT2bjIT9NYYahFb5uPpKz-Ocqwdm5NwRSBzwHQHJDAuGddG8UXt2C9kLmZDShXyCG29I8vL0qNpbMU8gN8YC8kFKwsTWbhi-%2FQriC6R1ssr2VVRnr5DAQdGH5zHQcDgWqB5p2tyrDC83TyTIo%2FveahQ&verifyFp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj&fp=verify_mjmrx3qn_TELLC7l8_syRO_4t1Z_9xE4_wiK4naxXhlHj", { + "headers": { + "accept": "application/json, text/plain, */*", + "accept-language": "zh-CN,zh;q=0.9", + "cache-control": "no-cache", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "pragma": "no-cache", + "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"", + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": "\"Windows\"", + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "uifid": "e438e504399eecf9c2f65594851517a53fcd0a47c3feace6f386418d12bbc04d0e409b50ec8a21ef6eff4b825cd64059646e0a366a371675723852d9a6540fb6f5091520701820efa27f3a3704dddb313966d30cb1eb174337518d6be3053846f8e3a789519374cdfccbab779ff03ecc6f7e7de633af65c7c8023a60b56e88d25276be703f2bf75e67ae6889151319ddab78703305a3c9034797e4620f16cafc7027bf0cb4e50041e1bf97725dd3c1906f45d3565d6b31aadf8fcfd836827d98", + "x-secsdk-csrf-token": "DOWNGRADE", + "cookie": cookie, + "Referer": "https://www.douyin.com/user/self?from_tab_name=main&showTab=like", + "Referrer-Policy": "no-referrer-when-downgrade" + }, + "body": body, + "method": "POST" + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + console.log('Unfavorite result:', data); + return data; + } catch (error) { + console.error('Error unfavoriting items:', error); + return null; + } +} + +// 测试函数 +async function test() { + // 测试获取喜欢列表并取消喜欢 + await getAndUnFavorite(); + + // 测试获取收藏列表并取消收藏 + // await getAndUnCollection(); +} + +test(); +setInterval(() => { + test(); +}, 10 * 1000); + + + +