From 2fedbafca840cd4e3c83a6c1c6be89c5d91636f1 Mon Sep 17 00:00:00 2001 From: jianzhichu Date: Mon, 1 Dec 2025 21:38:13 +0800 Subject: [PATCH] =?UTF-8?q?cookie=E7=8A=B6=E6=80=81=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PublishProfiles/FolderProfile.pubxml.user | 2 +- README.md | 2 +- app/src/pages/cok/CookieTable.vue | 4 +- app/src/pages/workplace/RecordTable.vue | 58 ++++++++-- ....timestamp-1764595090003-7061d2017a1a3.mjs | 104 ++++++++++++++++++ appsettings.json | 2 +- dto/FollowErrorDto.cs | 24 ++++ job/DouyinFollowedUsersSyncJob.cs | 16 ++- model/DouyinCookie.cs | 63 ++--------- service/DouyinHttpClientService.cs | 19 +++- service/DouyinQuartzJobService.cs | 2 +- 11 files changed, 223 insertions(+), 73 deletions(-) create mode 100644 app/vite.config.ts.timestamp-1764595090003-7061d2017a1a3.mjs create mode 100644 dto/FollowErrorDto.cs diff --git a/Properties/PublishProfiles/FolderProfile.pubxml.user b/Properties/PublishProfiles/FolderProfile.pubxml.user index a2680cb..08b28f7 100644 --- a/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_PublishTargetUrl>E:\code\dysync\bin\Release\net6.0\publish\ - True|2025-12-01T11:27:58.0479456Z||;True|2025-12-01T19:16:02.2288214+08:00||;False|2025-12-01T19:15:56.0372115+08:00||;True|2025-12-01T19:15:16.4854821+08:00||;False|2025-12-01T19:15:06.7001019+08:00||;True|2025-12-01T17:10:38.9739466+08:00||;False|2025-12-01T17:10:18.8928139+08:00||;True|2025-12-01T17:03:59.3171589+08:00||;True|2025-12-01T17:03:12.5681656+08:00||;True|2025-12-01T16:42:51.4415025+08:00||;True|2025-12-01T01:29:59.6975567+08:00||;True|2025-12-01T01:29:45.1898652+08:00||;False|2025-12-01T01:29:33.1787721+08:00||;True|2025-12-01T01:27:33.1297605+08:00||;True|2025-12-01T01:27:27.3976862+08:00||;False|2025-12-01T01:27:20.5193052+08:00||;True|2025-12-01T01:11:11.0210582+08:00||;True|2025-12-01T01:04:04.3307782+08:00||;True|2025-12-01T00:55:49.8018864+08:00||;True|2025-12-01T00:27:25.1323561+08:00||;True|2025-11-30T23:58:20.7284116+08:00||;True|2025-11-30T23:57:58.3027622+08:00||;True|2025-11-30T23:57:43.0829614+08:00||;False|2025-11-30T23:57:33.5606716+08:00||;True|2025-11-30T23:54:29.6203368+08:00||;True|2025-11-30T23:54:27.5383120+08:00||;False|2025-11-30T23:54:17.0823982+08:00||;True|2025-11-30T22:41:11.4538820+08:00||;True|2025-11-30T22:38:19.7064566+08:00||;True|2025-11-30T22:37:35.2889186+08:00||;True|2025-11-30T21:42:31.1408314+08:00||;True|2025-11-30T21:42:19.5385333+08:00||;False|2025-11-30T21:42:13.3290237+08:00||;True|2025-11-30T21:33:28.0806806+08:00||;True|2025-11-30T21:16:56.7088027+08:00||;False|2025-11-30T21:16:46.1444944+08:00||;True|2025-11-30T20:21:24.4059664+08:00||;False|2025-11-30T20:21:17.6006098+08:00||;True|2025-11-30T20:20:08.2030141+08:00||;False|2025-11-30T20:16:12.3608968+08:00||;True|2025-11-30T20:15:35.6048313+08:00||;True|2025-11-30T19:45:18.7229552+08:00||;True|2025-11-30T19:45:08.6083368+08:00||;False|2025-11-30T19:44:54.7824905+08:00||;True|2025-11-30T19:44:17.0179491+08:00||;True|2025-11-30T19:44:06.7073484+08:00||;False|2025-11-30T19:43:58.2896556+08:00||;True|2025-11-30T19:42:08.2261927+08:00||;True|2025-11-30T19:28:15.7115077+08:00||;False|2025-11-30T19:28:10.2280725+08:00||;True|2025-11-30T19:23:31.7859158+08:00||;True|2025-11-30T19:23:20.7788277+08:00||;True|2025-11-30T19:17:11.8583296+08:00||;False|2025-11-30T19:10:41.8369574+08:00||;True|2025-11-30T19:02:08.8184758+08:00||;False|2025-11-30T19:01:59.4711045+08:00||;True|2025-11-30T18:16:01.8372242+08:00||;True|2025-11-30T14:50:31.9356543+08:00||;True|2025-11-30T14:48:27.1833064+08:00||;True|2025-11-30T02:06:06.6099669+08:00||;True|2025-11-30T01:49:46.4358206+08:00||;False|2025-11-30T01:49:34.4884036+08:00||;True|2025-11-30T01:43:41.1028753+08:00||;True|2025-11-30T01:38:18.2856609+08:00||;True|2025-11-30T01:23:02.4378259+08:00||;True|2025-11-30T01:08:29.4041159+08:00||;True|2025-11-30T00:56:33.4172007+08:00||;False|2025-11-30T00:56:21.2777389+08:00||;True|2025-11-27T13:37:08.6884390+08:00||;False|2025-11-27T13:36:54.2595622+08:00||;True|2025-11-27T11:03:33.8401644+08:00||;False|2025-11-27T11:02:48.8942827+08:00||;True|2025-11-26T23:48:02.3957186+08:00||;True|2025-11-26T23:43:06.8154188+08:00||;False|2025-11-26T23:42:05.9191485+08:00||;True|2025-11-26T23:30:11.1295861+08:00||;True|2025-11-26T00:00:42.1507258+08:00||;True|2025-11-26T00:00:17.0107229+08:00||;True|2025-11-25T23:42:07.4349629+08:00||;False|2025-11-25T23:41:56.9328658+08:00||;True|2025-11-25T23:19:32.5262917+08:00||;True|2025-11-25T14:08:53.3850967+08:00||;True|2025-11-24T23:53:54.4283003+08:00||;True|2025-11-24T23:41:15.8248332+08:00||;True|2025-11-24T23:33:57.1844427+08:00||;True|2025-11-24T23:31:54.9228836+08:00||;True|2025-11-24T23:24:15.8681502+08:00||;True|2025-11-24T23:22:57.9046229+08:00||;True|2025-11-24T23:18:04.1131647+08:00||;True|2025-11-24T22:47:54.1336448+08:00||;True|2025-11-24T22:47:18.3613833+08:00||;True|2025-11-24T08:17:50.3994607+08:00||;True|2025-11-24T08:07:00.9951205+08:00||;True|2025-11-23T23:34:50.0030826+08:00||;True|2025-11-23T23:32:36.7452616+08:00||;True|2025-11-22T23:18:56.3202345+08:00||;True|2025-11-22T22:52:51.7203302+08:00||;True|2025-11-22T22:52:42.9620946+08:00||;True|2025-11-22T22:52:09.8257640+08:00||;True|2025-11-22T22:39:31.5894141+08:00||; + True|2025-12-01T13:18:47.2119609Z||;True|2025-12-01T20:51:19.9948301+08:00||;True|2025-12-01T20:50:36.9904697+08:00||;True|2025-12-01T20:44:10.1695142+08:00||;True|2025-12-01T19:27:58.0479456+08:00||;True|2025-12-01T19:16:02.2288214+08:00||;False|2025-12-01T19:15:56.0372115+08:00||;True|2025-12-01T19:15:16.4854821+08:00||;False|2025-12-01T19:15:06.7001019+08:00||;True|2025-12-01T17:10:38.9739466+08:00||;False|2025-12-01T17:10:18.8928139+08:00||;True|2025-12-01T17:03:59.3171589+08:00||;True|2025-12-01T17:03:12.5681656+08:00||;True|2025-12-01T16:42:51.4415025+08:00||;True|2025-12-01T01:29:59.6975567+08:00||;True|2025-12-01T01:29:45.1898652+08:00||;False|2025-12-01T01:29:33.1787721+08:00||;True|2025-12-01T01:27:33.1297605+08:00||;True|2025-12-01T01:27:27.3976862+08:00||;False|2025-12-01T01:27:20.5193052+08:00||;True|2025-12-01T01:11:11.0210582+08:00||;True|2025-12-01T01:04:04.3307782+08:00||;True|2025-12-01T00:55:49.8018864+08:00||;True|2025-12-01T00:27:25.1323561+08:00||;True|2025-11-30T23:58:20.7284116+08:00||;True|2025-11-30T23:57:58.3027622+08:00||;True|2025-11-30T23:57:43.0829614+08:00||;False|2025-11-30T23:57:33.5606716+08:00||;True|2025-11-30T23:54:29.6203368+08:00||;True|2025-11-30T23:54:27.5383120+08:00||;False|2025-11-30T23:54:17.0823982+08:00||;True|2025-11-30T22:41:11.4538820+08:00||;True|2025-11-30T22:38:19.7064566+08:00||;True|2025-11-30T22:37:35.2889186+08:00||;True|2025-11-30T21:42:31.1408314+08:00||;True|2025-11-30T21:42:19.5385333+08:00||;False|2025-11-30T21:42:13.3290237+08:00||;True|2025-11-30T21:33:28.0806806+08:00||;True|2025-11-30T21:16:56.7088027+08:00||;False|2025-11-30T21:16:46.1444944+08:00||;True|2025-11-30T20:21:24.4059664+08:00||;False|2025-11-30T20:21:17.6006098+08:00||;True|2025-11-30T20:20:08.2030141+08:00||;False|2025-11-30T20:16:12.3608968+08:00||;True|2025-11-30T20:15:35.6048313+08:00||;True|2025-11-30T19:45:18.7229552+08:00||;True|2025-11-30T19:45:08.6083368+08:00||;False|2025-11-30T19:44:54.7824905+08:00||;True|2025-11-30T19:44:17.0179491+08:00||;True|2025-11-30T19:44:06.7073484+08:00||;False|2025-11-30T19:43:58.2896556+08:00||;True|2025-11-30T19:42:08.2261927+08:00||;True|2025-11-30T19:28:15.7115077+08:00||;False|2025-11-30T19:28:10.2280725+08:00||;True|2025-11-30T19:23:31.7859158+08:00||;True|2025-11-30T19:23:20.7788277+08:00||;True|2025-11-30T19:17:11.8583296+08:00||;False|2025-11-30T19:10:41.8369574+08:00||;True|2025-11-30T19:02:08.8184758+08:00||;False|2025-11-30T19:01:59.4711045+08:00||;True|2025-11-30T18:16:01.8372242+08:00||;True|2025-11-30T14:50:31.9356543+08:00||;True|2025-11-30T14:48:27.1833064+08:00||;True|2025-11-30T02:06:06.6099669+08:00||;True|2025-11-30T01:49:46.4358206+08:00||;False|2025-11-30T01:49:34.4884036+08:00||;True|2025-11-30T01:43:41.1028753+08:00||;True|2025-11-30T01:38:18.2856609+08:00||;True|2025-11-30T01:23:02.4378259+08:00||;True|2025-11-30T01:08:29.4041159+08:00||;True|2025-11-30T00:56:33.4172007+08:00||;False|2025-11-30T00:56:21.2777389+08:00||;True|2025-11-27T13:37:08.6884390+08:00||;False|2025-11-27T13:36:54.2595622+08:00||;True|2025-11-27T11:03:33.8401644+08:00||;False|2025-11-27T11:02:48.8942827+08:00||;True|2025-11-26T23:48:02.3957186+08:00||;True|2025-11-26T23:43:06.8154188+08:00||;False|2025-11-26T23:42:05.9191485+08:00||;True|2025-11-26T23:30:11.1295861+08:00||;True|2025-11-26T00:00:42.1507258+08:00||;True|2025-11-26T00:00:17.0107229+08:00||;True|2025-11-25T23:42:07.4349629+08:00||;False|2025-11-25T23:41:56.9328658+08:00||;True|2025-11-25T23:19:32.5262917+08:00||;True|2025-11-25T14:08:53.3850967+08:00||;True|2025-11-24T23:53:54.4283003+08:00||;True|2025-11-24T23:41:15.8248332+08:00||;True|2025-11-24T23:33:57.1844427+08:00||;True|2025-11-24T23:31:54.9228836+08:00||;True|2025-11-24T23:24:15.8681502+08:00||;True|2025-11-24T23:22:57.9046229+08:00||;True|2025-11-24T23:18:04.1131647+08:00||;True|2025-11-24T22:47:54.1336448+08:00||;True|2025-11-24T22:47:18.3613833+08:00||;True|2025-11-24T08:17:50.3994607+08:00||;True|2025-11-24T08:07:00.9951205+08:00||;True|2025-11-23T23:34:50.0030826+08:00||;True|2025-11-23T23:32:36.7452616+08:00||;True|2025-11-22T23:18:56.3202345+08:00||; diff --git a/README.md b/README.md index 9a20285..9df66c4 100644 --- a/README.md +++ b/README.md @@ -187,7 +187,7 @@ services: 7. ✅ 将网站名称改成 "抖小云" 灵感来源于哪吒电影 驮门的那个小云云 -8. ⭕️ Cookie 过期提醒 +8. ✅ Cookie 过期提醒,在D音授权页可查看 9. ✅ 重复视频去重(一个视频同时属于收藏视频、喜欢的视频或指定的博主作品) diff --git a/app/src/pages/cok/CookieTable.vue b/app/src/pages/cok/CookieTable.vue index 792e5ad..b5e3c6f 100644 --- a/app/src/pages/cok/CookieTable.vue +++ b/app/src/pages/cok/CookieTable.vue @@ -251,11 +251,12 @@ const getConfig = () => { dataIndex: 'userName', width: 180, }, - { title: '状态', dataIndex: 'status', width: 180 }, + { title: '同步状态', dataIndex: 'status', width: 180 }, { title: '收藏路径', dataIndex: 'savePath' }, { title: '喜欢路径', dataIndex: 'favSavePath' }, { title: '博主路径', dataIndex: 'upSavePath' }, { title: 'Cookie', dataIndex: 'cookies' }, + { title: '有效状态', dataIndex: 'statusMsg' }, // { title: '博主信息', dataIndex: 'upSecUserIds' }, // { title: '自己', dataIndex: 'secUserId' }, { title: '操作', dataIndex: 'edit', width: 200 }, @@ -274,6 +275,7 @@ const getConfig = () => { { title: '博主路径', dataIndex: 'upSavePath' }, { title: '图文视频', dataIndex: 'imgSavePath' }, { title: 'Cookie', dataIndex: 'cookies' }, + { title: '有效状态', dataIndex: 'statusMsg' }, // { title: '博主信息', dataIndex: 'upSecUserIds' }, // { title: '自己', dataIndex: 'secUserId' }, { title: '操作', dataIndex: 'edit', width: 200 }, diff --git a/app/src/pages/workplace/RecordTable.vue b/app/src/pages/workplace/RecordTable.vue index 79304e1..9e7995d 100644 --- a/app/src/pages/workplace/RecordTable.vue +++ b/app/src/pages/workplace/RecordTable.vue @@ -53,13 +53,6 @@ 重新同步 - @@ -79,6 +72,7 @@ {{ playingTitle }} +
@@ -95,6 +89,7 @@
+
同步时间: {{ currentVideoInfo.syncTimeStr || '未知' }} @@ -103,6 +98,17 @@ 视频类型: {{ currentVideoInfo.viedoCate || '未知' }}
+
+ + + + 复制路径 + + +
+
@@ -335,6 +341,12 @@ const formatFilePath = (filePath?: string) => { }; // -------------------------- 核心工具方法 -------------------------- + +const formatPathSeparator = (path) => { + if (!path) return path; // 处理空路径情况 + // 正则表达式 /\\/g 表示全局匹配所有反斜杠 + return path.replace(/\\/g, '/'); +}; /** 格式化表格视频标题:超过20字符显示省略号 */ const formatVideoTitle = (title?: string) => { if (!title) return '无标题'; @@ -674,7 +686,7 @@ const handleBatchShare = () => { shareUrl += `${currentDomain}/share/${record.id}/${k} `; }); - copyToClipboard(shareUrl); + copyToClipboard(shareUrl, '分享链接已复制到剪贴板!'); } catch (error) { console.error('分享失败:', error); message.error('分享功能异常,请稍后重试'); @@ -682,12 +694,12 @@ const handleBatchShare = () => { }; // 复制链接到剪贴板(兼容生产环境) -const copyToClipboard = async (shareUrl) => { +const copyToClipboard = async (shareUrl, msg) => { try { // 方案1:优先使用 navigator.clipboard(现代浏览器+HTTPS环境) if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') { await navigator.clipboard.writeText(shareUrl); - message.success('分享链接已复制到剪贴板!'); + message.success(msg); } else { // 方案2:降级使用 document.execCommand(兼容HTTP/旧浏览器) const textarea = document.createElement('textarea'); @@ -704,7 +716,7 @@ const copyToClipboard = async (shareUrl) => { document.body.removeChild(textarea); // 清理DOM if (success) { - message.success('分享链接已复制到剪贴板!'); + message.success(msg); } else { // 方案3:最终降级 - 显示链接让用户手动复制 throw new Error('自动复制失败'); @@ -737,13 +749,22 @@ const handleShare = (record: DataItem) => { // 生成分享链接 let k = CryptoJS.MD5(record.fileHash + record.authorId).toString(); const shareUrl = `${currentDomain}/share/${record.id}/${k}`; - copyToClipboard(shareUrl); + copyToClipboard(shareUrl, '分享链接已复制到剪贴板!'); } catch (error) { console.error('分享失败:', error); message.error('分享功能异常,请稍后重试'); } }; +// 新增:复制视频路径方法 +const copyVideoPath = (path?: string) => { + if (!path) { + message.warning('暂无视频存储路径'); + return; + } + copyToClipboard(path, '视频保存路径已复制到剪贴板!'); +}; + // -------------------------- 页面初始化 -------------------------- onMounted(() => { getConfig(); @@ -986,9 +1007,11 @@ onMounted(() => { .info-item { display: flex; + flex: 1; align-items: center; font-size: 14px; line-height: 1.6; + flex-wrap: nowrap; } .info-label { @@ -1001,6 +1024,17 @@ onMounted(() => { .info-value { color: #333333; white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-right: 8px; +} + +/* 新增:复制路径按钮样式 */ +.copy-path-btn { + padding: 0 6px !important; + height: 24px !important; + font-size: 12px !important; + white-space: nowrap; } .video-title-link { diff --git a/app/vite.config.ts.timestamp-1764595090003-7061d2017a1a3.mjs b/app/vite.config.ts.timestamp-1764595090003-7061d2017a1a3.mjs new file mode 100644 index 0000000..73c900a --- /dev/null +++ b/app/vite.config.ts.timestamp-1764595090003-7061d2017a1a3.mjs @@ -0,0 +1,104 @@ +// vite.config.ts +import { defineConfig, loadEnv } from "file:///E:/code/dysync/app/node_modules/vite/dist/node/index.js"; +import vue from "file:///E:/code/dysync/app/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import path from "path"; +import Components from "file:///E:/code/dysync/app/node_modules/unplugin-vue-components/dist/vite.mjs"; +import { AntDesignVueResolver } from "file:///E:/code/dysync/app/node_modules/unplugin-vue-components/dist/resolvers.mjs"; +import { AntdvLessPlugin, AntdvModifyVars } from "file:///E:/code/dysync/app/node_modules/stepin/lib/style/plugins/index.js"; +var __vite_injected_original_dirname = "E:\\code\\dysync\\app"; +var timestamp = (/* @__PURE__ */ new Date()).getTime(); +var prodRollupOptions = { + output: { + chunkFileNames: (chunk) => { + return "assets/" + chunk.name + ".[hash]." + timestamp + ".js"; + }, + assetFileNames: (asset) => { + const name = asset.name; + if (name && (name.endsWith(".css") || name.endsWith(".js"))) { + const names = name.split("."); + const extname = names.splice(names.length - 1, 1)[0]; + return `assets/${names.join(".")}.[hash].${timestamp}.${extname}`; + } + return "assets/" + asset.name; + } + } +}; +var vite_config_default = ({ command, mode }) => { + const env = loadEnv(mode, process.cwd()); + return defineConfig({ + server: { + host: "0.0.0.0", + cors: true, + port: 8001, + open: false, + //自动打开 + proxy: { + "/api": { + target: env.VITE_API_URL, + ws: true, + changeOrigin: true, + rewrite: (path2) => path2.replace(/^\//, "") + } + }, + hmr: true + }, + resolve: { + alias: { + "@": path.resolve(__vite_injected_original_dirname, "src") + } + }, + esbuild: { + jsxFactory: "h", + jsxFragment: "Fragment" + }, + build: { + sourcemap: false, + chunkSizeWarningLimit: 2048, + rollupOptions: mode === "production" ? prodRollupOptions : {} + }, + plugins: [ + vue({ + template: { + transformAssetUrls: { + img: ["src"], + "a-avatar": ["src"], + "stepin-view": ["logo-src", "presetThemeList"], + "a-card": ["cover"] + } + } + }), + Components({ + resolvers: [AntDesignVueResolver({ importStyle: mode === "development" ? false : "less" })] + }) + // viteCompression({ + // verbose: true, // 是否在控制台中输出压缩结果 + // disable: false, + // threshold: 10240, // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反 + // algorithm: 'gzip', // 压缩算法,可选['gzip',' brotliccompress ','deflate ','deflateRaw'] + // ext: '.gz', + // deleteOriginFile: true // 源文件压缩后是否删除(我为了看压缩后的效果,先选择了true) + // }), + ], + css: { + preprocessorOptions: { + less: { + plugins: [AntdvLessPlugin], + modifyVars: { + ...AntdvModifyVars, + // 保留默认变量(可选,按需添加) + "@primary-color": "#722ed1" + // 你的自定义主色调(核心:覆盖默认值) + // 其他需要修改的变量 + // '@link-color': '#722ed1', + }, + javascriptEnabled: true + } + } + } + // base: env.VITE_BASE_URL, + }); +}; +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxjb2RlXFxcXGR5c3luY1xcXFxhcHBcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXGNvZGVcXFxcZHlzeW5jXFxcXGFwcFxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovY29kZS9keXN5bmMvYXBwL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnLCBsb2FkRW52IH0gZnJvbSAndml0ZSc7XHJcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBDb21wb25lbnRzIGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGUnO1xyXG5pbXBvcnQgeyBBbnREZXNpZ25WdWVSZXNvbHZlciB9IGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVycyc7XHJcbmltcG9ydCB7IEFudGR2TGVzc1BsdWdpbiwgQW50ZHZNb2RpZnlWYXJzIH0gZnJvbSAnc3RlcGluL2xpYi9zdHlsZS9wbHVnaW5zJztcclxuaW1wb3J0IHZpdGVDb21wcmVzc2lvbiBmcm9tICd2aXRlLXBsdWdpbi1jb21wcmVzc2lvbic7XHJcbmNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG5jb25zdCBwcm9kUm9sbHVwT3B0aW9ucyA9IHtcclxuICBvdXRwdXQ6IHtcclxuICAgIGNodW5rRmlsZU5hbWVzOiAoY2h1bmspID0+IHtcclxuICAgICAgcmV0dXJuICdhc3NldHMvJyArIGNodW5rLm5hbWUgKyAnLltoYXNoXScgKyAnLicgKyB0aW1lc3RhbXAgKyAnLmpzJztcclxuICAgIH0sXHJcbiAgICBhc3NldEZpbGVOYW1lczogKGFzc2V0KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSBhc3NldC5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAmJiAobmFtZS5lbmRzV2l0aCgnLmNzcycpIHx8IG5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzID0gbmFtZS5zcGxpdCgnLicpO1xyXG4gICAgICAgIGNvbnN0IGV4dG5hbWUgPSBuYW1lcy5zcGxpY2UobmFtZXMubGVuZ3RoIC0gMSwgMSlbMF07XHJcbiAgICAgICAgcmV0dXJuIGBhc3NldHMvJHtuYW1lcy5qb2luKCcuJyl9LltoYXNoXS4ke3RpbWVzdGFtcH0uJHtleHRuYW1lfWA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuICdhc3NldHMvJyArIGFzc2V0Lm5hbWU7XHJcbiAgICB9LFxyXG4gIH0sXHJcbn07XHJcbi8vIHZpdGUgXHU5MTREXHU3RjZFXHJcbmV4cG9ydCBkZWZhdWx0ICh7IGNvbW1hbmQsIG1vZGUgfSkgPT4ge1xyXG4gIC8vIFx1ODNCN1x1NTNENlx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlxyXG4gIGNvbnN0IGVudiA9IGxvYWRFbnYobW9kZSwgcHJvY2Vzcy5jd2QoKSk7XHJcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XHJcbiAgICBzZXJ2ZXI6IHtcclxuICAgICAgaG9zdDogXCIwLjAuMC4wXCIsXHJcbiAgICAgIGNvcnM6IHRydWUsXHJcbiAgICAgIHBvcnQ6IDgwMDEsXHJcbiAgICAgIG9wZW46IGZhbHNlLCAvL1x1ODFFQVx1NTJBOFx1NjI1M1x1NUYwMFxyXG4gICAgICBwcm94eToge1xyXG4gICAgICAgICcvYXBpJzoge1xyXG4gICAgICAgICAgdGFyZ2V0OiBlbnYuVklURV9BUElfVVJMLFxyXG4gICAgICAgICAgd3M6IHRydWUsXHJcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKC9eXFwvLywgJycpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIGhtcjogdHJ1ZSxcclxuICAgIH0sXHJcblxyXG4gICAgcmVzb2x2ZToge1xyXG4gICAgICBhbGlhczoge1xyXG4gICAgICAgICdAJzogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NyYycpLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIGVzYnVpbGQ6IHtcclxuICAgICAganN4RmFjdG9yeTogJ2gnLFxyXG4gICAgICBqc3hGcmFnbWVudDogJ0ZyYWdtZW50JyxcclxuICAgIH0sXHJcbiAgICBidWlsZDoge1xyXG4gICAgICBzb3VyY2VtYXA6IGZhbHNlLFxyXG4gICAgICBjaHVua1NpemVXYXJuaW5nTGltaXQ6IDIwNDgsXHJcbiAgICAgIHJvbGx1cE9wdGlvbnM6IG1vZGUgPT09ICdwcm9kdWN0aW9uJyA/IHByb2RSb2xsdXBPcHRpb25zIDoge30sXHJcbiAgICB9LFxyXG4gICAgcGx1Z2luczogW1xyXG4gICAgICB2dWUoe1xyXG4gICAgICAgIHRlbXBsYXRlOiB7XHJcbiAgICAgICAgICB0cmFuc2Zvcm1Bc3NldFVybHM6IHtcclxuICAgICAgICAgICAgaW1nOiBbJ3NyYyddLFxyXG4gICAgICAgICAgICAnYS1hdmF0YXInOiBbJ3NyYyddLFxyXG4gICAgICAgICAgICAnc3RlcGluLXZpZXcnOiBbJ2xvZ28tc3JjJywgJ3ByZXNldFRoZW1lTGlzdCddLFxyXG4gICAgICAgICAgICAnYS1jYXJkJzogWydjb3ZlciddLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KSxcclxuICAgICAgQ29tcG9uZW50cyh7XHJcbiAgICAgICAgcmVzb2x2ZXJzOiBbQW50RGVzaWduVnVlUmVzb2x2ZXIoeyBpbXBvcnRTdHlsZTogbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IGZhbHNlIDogJ2xlc3MnIH0pXSxcclxuICAgICAgfSksXHJcbiAgICAgIC8vIHZpdGVDb21wcmVzc2lvbih7XHJcbiAgICAgIC8vICAgdmVyYm9zZTogdHJ1ZSwgLy8gXHU2NjJGXHU1NDI2XHU1NzI4XHU2M0E3XHU1MjM2XHU1M0YwXHU0RTJEXHU4RjkzXHU1MUZBXHU1MzhCXHU3RjI5XHU3RUQzXHU2NzlDXHJcbiAgICAgIC8vICAgZGlzYWJsZTogZmFsc2UsXHJcbiAgICAgIC8vICAgdGhyZXNob2xkOiAxMDI0MCwgLy8gXHU1OTgyXHU2NzlDXHU0RjUzXHU3OUVGXHU1OTI3XHU0RThFXHU5NjA4XHU1MDNDXHVGRjBDXHU1QzA2XHU4OEFCXHU1MzhCXHU3RjI5XHVGRjBDXHU1MzU1XHU0RjREXHU0RTNBYlx1RkYwQ1x1NEY1M1x1NzlFRlx1OEZDN1x1NUMwRlx1NjVGNlx1OEJGN1x1NEUwRFx1ODk4MVx1NTM4Qlx1N0YyOVx1RkYwQ1x1NEVFNVx1NTE0RFx1OTAwMlx1NUY5N1x1NTE3Nlx1NTNDRFxyXG4gICAgICAvLyAgIGFsZ29yaXRobTogJ2d6aXAnLCAvLyBcdTUzOEJcdTdGMjlcdTdCOTdcdTZDRDVcdUZGMENcdTUzRUZcdTkwMDlbJ2d6aXAnXHVGRjBDJyBicm90bGljY29tcHJlc3MgJ1x1RkYwQydkZWZsYXRlICdcdUZGMEMnZGVmbGF0ZVJhdyddXHJcbiAgICAgIC8vICAgZXh0OiAnLmd6JyxcclxuICAgICAgLy8gICBkZWxldGVPcmlnaW5GaWxlOiB0cnVlIC8vIFx1NkU5MFx1NjU4N1x1NEVGNlx1NTM4Qlx1N0YyOVx1NTQwRVx1NjYyRlx1NTQyNlx1NTIyMFx1OTY2NChcdTYyMTFcdTRFM0FcdTRFODZcdTc3MEJcdTUzOEJcdTdGMjlcdTU0MEVcdTc2ODRcdTY1NDhcdTY3OUNcdUZGMENcdTUxNDhcdTkwMDlcdTYyRTlcdTRFODZ0cnVlKVxyXG4gICAgICAvLyB9KSxcclxuICAgIF0sXHJcbiAgICBjc3M6IHtcclxuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xyXG4gICAgICAgIGxlc3M6IHtcclxuICAgICAgICAgIHBsdWdpbnM6IFtBbnRkdkxlc3NQbHVnaW5dLFxyXG5cclxuICAgICAgICAgIG1vZGlmeVZhcnM6IHtcclxuICAgICAgICAgICAgLi4uQW50ZHZNb2RpZnlWYXJzLCAvLyBcdTRGRERcdTc1NTlcdTlFRDhcdThCQTRcdTUzRDhcdTkxQ0ZcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMENcdTYzMDlcdTk3MDBcdTZERkJcdTUyQTBcdUZGMDlcclxuICAgICAgICAgICAgJ0BwcmltYXJ5LWNvbG9yJzogJyM3MjJlZDEnLFxyXG4gICAgICAgICAgICAvLyBcdTRGNjBcdTc2ODRcdTgxRUFcdTVCOUFcdTRFNDlcdTRFM0JcdTgyNzJcdThDMDNcdUZGMDhcdTY4MzhcdTVGQzNcdUZGMUFcdTg5ODZcdTc2RDZcdTlFRDhcdThCQTRcdTUwM0NcdUZGMDlcclxuICAgICAgICAgICAgLy8gXHU1MTc2XHU0RUQ2XHU5NzAwXHU4OTgxXHU0RkVFXHU2NTM5XHU3Njg0XHU1M0Q4XHU5MUNGXHJcbiAgICAgICAgICAgIC8vICdAbGluay1jb2xvcic6ICcjNzIyZWQxJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIC8vIGJhc2U6IGVudi5WSVRFX0JBU0VfVVJMLFxyXG4gIH0pO1xyXG59O1xyXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQWdQLFNBQVMsY0FBYyxlQUFlO0FBQ3RSLE9BQU8sU0FBUztBQUNoQixPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7QUFDdkIsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxpQkFBaUIsdUJBQXVCO0FBTGpELElBQU0sbUNBQW1DO0FBT3pDLElBQU0sYUFBWSxvQkFBSSxLQUFLLEdBQUUsUUFBUTtBQUNyQyxJQUFNLG9CQUFvQjtBQUFBLEVBQ3hCLFFBQVE7QUFBQSxJQUNOLGdCQUFnQixDQUFDLFVBQVU7QUFDekIsYUFBTyxZQUFZLE1BQU0sT0FBTyxhQUFrQixZQUFZ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 diff --git a/appsettings.json b/appsettings.json index b0d1663..5f6f58a 100644 --- a/appsettings.json +++ b/appsettings.json @@ -1,5 +1,5 @@ { "dbconn": "", "dbtype": "Sqlite", - "tagName": "beta_1.6.5" + "tagName": "beta_1.6.6" } \ No newline at end of file diff --git a/dto/FollowErrorDto.cs b/dto/FollowErrorDto.cs new file mode 100644 index 0000000..9fc908d --- /dev/null +++ b/dto/FollowErrorDto.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace dy.net.dto +{ + public class FollowErrorDto + { + /// + /// + /// + [JsonProperty("followings")] + public object Followings { get; set; } + + /// + /// 8 - 用户未登录 + /// + [JsonProperty("status_code")] + public int StatusCode { get; set; } + /// + /// 用户未登录 + /// + [JsonProperty("status_msg")] + public string StatusMsg { get; set; } + } +} diff --git a/job/DouyinFollowedUsersSyncJob.cs b/job/DouyinFollowedUsersSyncJob.cs index 528d15a..ccc8fe5 100644 --- a/job/DouyinFollowedUsersSyncJob.cs +++ b/job/DouyinFollowedUsersSyncJob.cs @@ -48,7 +48,21 @@ namespace dy.net.job List follows = new List(); while (hasmore) { - var data = await _douyinService.SyncMyFollows(count, offset, ck.SecUserId, ck.Cookies); + var data = await _douyinService.SyncMyFollows(count, offset, ck.SecUserId, ck.Cookies, async err => + { + if (err.StatusCode != 0) + { + Serilog.Log.Error($"同步用户[{ck.UserName}]关注列表时发生错误,错误信息:{err.StatusMsg},状态码:{err.StatusCode}"); + } + // 如果是未登录错误,则跳出循环 + if (err.StatusCode == 8) + { + hasmore = false; + } + ck.StatusMsg = err.StatusCode == 8 ? "已过期" : "正 常"; + ck.StatusCode = err.StatusCode; + await _dyCookieService.UpdateAsync(ck); + }); if (data != null) { diff --git a/model/DouyinCookie.cs b/model/DouyinCookie.cs index 048a7fd..ea41137 100644 --- a/model/DouyinCookie.cs +++ b/model/DouyinCookie.cs @@ -84,60 +84,17 @@ namespace dy.net.model [SugarColumn(Length = 500, IsNullable = true)] public string ImgSavePath { get; set; } + /// + /// 抖音返回的状态码,主要用于判断Cookie是否有效 + /// 0 正常 8 - 用户未登录 + /// + public int StatusCode { get; set; } - //[SugarColumn(IsIgnore = true)] - //public List UpSecUserIdsJson - //{ - // get - // { - // // 反序列化逻辑(保持不变) - // if (string.IsNullOrWhiteSpace(UpSecUserIds)) - // { - // return new List(); - // } - - // try - // { - // return JsonConvert.DeserializeObject>(UpSecUserIds); - // } - // catch (JsonSerializationException ex) - // { - // // 日志记录(按需添加) - // // Logger.Error($"反序列化失败:{ex.Message},原始值:{UpSecUserIds}"); - // return new List(); - // } - // catch (Exception ex) - // { - // // 日志记录(按需添加) - // // Logger.Error($"处理异常:{ex.Message}"); - // return new List(); - // } - // } - // set - // { - // // 序列化逻辑:将列表转为JSON字符串,赋值给UpSecUserIds - // try - // { - // // 若传入的列表为null,直接设为空字符串(避免序列化后出现"null"字符串) - // UpSecUserIds = value == null - // ? string.Empty - // : JsonConvert.SerializeObject(value); - // } - // catch (JsonSerializationException ex) - // { - // // 捕获序列化异常(如对象循环引用、不支持的类型等) - // // Logger.Error($"序列化失败:{ex.Message},列表值:{value}"); - // // 异常时默认设为空字符串,避免存储错误的JSON - // UpSecUserIds = string.Empty; - // } - // catch (Exception ex) - // { - // // 捕获其他未知异常 - // // Logger.Error($"设置值异常:{ex.Message}"); - // UpSecUserIds = string.Empty; - // } - // } - //} + /// + /// + /// + [SugarColumn(Length = 100, IsNullable = true)] + public string StatusMsg { get; set; } } } diff --git a/service/DouyinHttpClientService.cs b/service/DouyinHttpClientService.cs index bf31e49..ed04b4b 100644 --- a/service/DouyinHttpClientService.cs +++ b/service/DouyinHttpClientService.cs @@ -229,8 +229,9 @@ namespace dy.net.service /// /// /// + /// /// - public async Task SyncMyFollows(string count,string offset,string secUserId,string cookie) + public async Task SyncMyFollows(string count,string offset,string secUserId,string cookie,Action callBack) { try @@ -255,7 +256,21 @@ namespace dy.net.service if (respose.IsSuccessStatusCode) { var data = await respose.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(data); + var res= JsonConvert.DeserializeObject(data); + if(res.Followings==null) + { + var err= JsonConvert.DeserializeObject(data); + Serilog.Log.Error($"SyncMyFollows error: {err.StatusMsg}"); + if (err != null) + { + callBack(err); + } + } + else + { + callBack(new FollowErrorDto { StatusCode = 0 }); + } + return res; } else { diff --git a/service/DouyinQuartzJobService.cs b/service/DouyinQuartzJobService.cs index df39283..e9f1b72 100644 --- a/service/DouyinQuartzJobService.cs +++ b/service/DouyinQuartzJobService.cs @@ -43,7 +43,7 @@ namespace dy.net.service var jobTasks = new List> { //关注列表 - StartJobAsync("follow_user", expression), + //StartJobAsync("follow_user", expression), //我收藏的作品 StartJobAsync("collect", expression), //我喜欢的作品