Skip to content

Commit b6edbad

Browse files
committed
refactor: 重构复制粘贴写入 Cookie 功能
复制粘贴写入 Cookie 功能 已经重构为 从剪贴板读取 Cookie 功能;直接从剪贴板读取内容,避免内容过长超出终端限制
1 parent c9c79ab commit b6edbad

10 files changed

Lines changed: 122 additions & 82 deletions

File tree

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
* ✅ 采集抖音热榜数据
5959
* ✅ 记录已下载作品 ID
6060
* ☑️ ~~扫码登陆获取 Cookie~~
61-
*从浏览器获取 Cookie
61+
*从浏览器读取 Cookie
6262
* ✅ 支持 Web API 调用
6363
* ✅ 支持多线程下载作品
6464
* ✅ 文件完整性处理机制
@@ -146,17 +146,17 @@ demo()
146146
</li>
147147
<li>阅读 DouK-Downloader 的免责声明,根据提示输入内容</li>
148148
<li>将 Cookie 信息写入配置文件
149-
<ol><b>手动复制粘贴 Cookie</b>
149+
<ol><b>从剪贴板读取 Cookie</b>
150150
<li>参考 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 提取教程</a>,复制所需 Cookie 至剪贴板</li>
151-
<li>选择 <code>复制粘贴写入 Cookie</code> 选项,按照提示将 Cookie 写入配置文件</li>
151+
<li>选择 <code>从剪贴板读取 Cookie</code> 选项,程序会自动读取剪贴板的 Cookie 并写入配置文件</li>
152152
</ol>
153-
<ol><b>从浏览器获取 Cookie</b>
154-
<li>选择 <code>从浏览器获取 Cookie</code> 选项,按照提示选择浏览器类型</li>
153+
<ol><b>从浏览器读取 Cookie</b>
154+
<li>选择 <code>从浏览器读取 Cookie</code> 选项,按照提示输入浏览器类型或序号</li>
155155
</ol>
156156
<ol><b><del>扫码登录获取 Cookie</del>(失效)</b>
157157
<li><del>选择 <code>扫码登录获取 Cookie</code> 选项,程序会显示登录二维码图片,并使用默认应用打开图片</del></li>
158158
<li><del>使用抖音 APP 扫描二维码并登录账号</del></li>
159-
<li><del>按照提示操作, Cookie 写入配置文件</del></li>
159+
<li><del>按照提示操作,程序会自动将 Cookie 写入配置文件</del></li>
160160
</ol>
161161
</li>
162162
<li>返回程序界面,依次选择 <code>终端交互模式</code> -> <code>批量下载链接作品(通用)</code> -> <code>手动输入待采集的作品链接</code></li>
@@ -182,7 +182,7 @@ demo()
182182
</ul>
183183
</li>
184184
</ol>
185-
<p>Docker 容器无法直接访问宿主机的文件系统,部分功能不可用,例如:<code>从浏览器获取 Cookie</code>;其他功能如有异常请反馈!</p>
185+
<p>Docker 容器无法直接访问宿主机的文件系统,部分功能不可用,例如:<code>从浏览器读取 Cookie</code>;其他功能如有异常请反馈!</p>
186186

187187
<hr>
188188

README_EN.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -151,18 +151,18 @@ demo()
151151
</ol>
152152
</li>
153153
<li>Read the disclaimer of DouK-Downloader and enter content according to the prompt.</li>
154-
<li>Write Cookie information into the configuration file
155-
<ol><b>Manually copy and paste Cookie</b>
156-
<li>Refer to <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie Extraction Tutorial</a>, copy the required Cookie to the clipboard.</li>
157-
<li>Select the option to <code>copy and paste to write Cookie</code>, and follow the prompts to write the Cookie into the configuration file.</li>
154+
<li>Write Cookie Information into Configuration File
155+
<ol><b>Read Cookie from Clipboard</b>
156+
<li>Refer to the <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie Extraction Tutorial</a>, copy the required Cookie to the clipboard</li>
157+
<li>Select the <code>Read Cookie from Clipboard</code> option, the program will automatically read the Cookie from the clipboard and write it into the configuration file</li>
158158
</ol>
159-
<ol><b>Get Cookie from Browser</b>
160-
<li>Select the option <code>Get Cookie from Browser</code> and follow the prompts to choose the browser type.</li>
159+
<ol><b>Read Cookie from Browser</b>
160+
<li>Select the <code>Read Cookie from Browser</code> option, then follow the prompts to input the browser type or its corresponding number</li>
161161
</ol>
162-
<ol><b><del>Scan code login to get Cookie</del> (Disabled)</b>
163-
<li><del>Select the option <code>Scan code login to get Cookie</code>, and the program will display a login QR code image and open the image with the default application.</del></li>
164-
<li><del>Use the DouYin APP to scan the QR code and log into your account.</del></li>
165-
<li><del>Follow the prompts to write the Cookie into the configuration file.</del></li>
162+
<ol><b><del>Obtain Cookie via QR Code Login</del> (No longer valid)</b>
163+
<li><del>Select the <code>Obtain Cookie via QR Code Login</code> option, the program will display a login QR code image and open it with the default application</del></li>
164+
<li><del>Use the TikTok app to scan the QR code and log in</del></li>
165+
<li><del>Follow the prompts, the program will automatically write the Cookie into the configuration file</del></li>
166166
</ol>
167167
</li>
168168
<li>Return to the program interface, sequentially select <code>Terminal interactive mode</code> -> <code>Batch download link works (general)</code> -> <code>Manually enter the link of the works to be collected</code>.</li>

docs/DouK-Downloader文档.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,23 @@
3939
</li>
4040
<li>阅读 DouK-Downloader 的免责声明,根据提示输入内容</li>
4141
<li>将 Cookie 信息写入配置文件
42-
<ol><b>手动复制粘贴 Cookie</b>
42+
<ol><b>从剪贴板读取 Cookie</b>
4343
<li>参考 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 提取教程</a>,复制所需 Cookie 至剪贴板</li>
44-
<li>选择 <code>复制粘贴写入 Cookie</code> 选项,按照提示将 Cookie 写入配置文件</li>
44+
<li>选择 <code>从剪贴板读取 Cookie</code> 选项,程序会自动读取剪贴板的 Cookie 并写入配置文件</li>
4545
</ol>
46-
<ol><b>从浏览器获取 Cookie</b>
47-
<li>选择 <code>从浏览器获取 Cookie</code> 选项,按照提示选择浏览器类型</li>
46+
<ol><b>从浏览器读取 Cookie</b>
47+
<li>选择 <code>从浏览器读取 Cookie</code> 选项,按照提示输入浏览器类型或序号</li>
4848
</ol>
4949
<ol><b><del>扫码登录获取 Cookie</del>(失效)</b>
5050
<li><del>选择 <code>扫码登录获取 Cookie</code> 选项,程序会显示登录二维码图片,并使用默认应用打开图片</del></li>
5151
<li><del>使用抖音 APP 扫描二维码并登录账号</del></li>
52-
<li><del>按照提示操作, Cookie 写入配置文件</del></li>
52+
<li><del>按照提示操作,程序会自动将 Cookie 写入配置文件</del></li>
5353
</ol>
5454
</li>
5555
<li>返回程序界面,依次选择 <code>终端交互模式</code> -> <code>批量下载链接作品(抖音)</code> -> <code>手动输入待采集的作品链接</code></li>
5656
<li>输入抖音作品链接即可下载作品文件</li>
5757
</ol>
58-
<p><b>TikTok 平台功能需要额外设置配置文件 <code>browser_info_tiktok</code> 的 <code>device_id</code> 参数,否则平台功能可能无法正常使用!参数获取方式与 Cookie 类似,详见 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 获取教程</a></b></p>
58+
<p><b>TikTok 平台功能需要额外设置配置文件 <code>browser_info_tiktok</code> 的 <code>device_id</code> 参数,否则 TikTok 平台功能可能无法正常使用!参数获取方式与 Cookie 类似,详见 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 获取教程</a></b></p>
5959
<h2>Docker 容器</h2>
6060
<ol>
6161
<li>获取镜像</li>
@@ -72,7 +72,7 @@
7272
</ul>
7373
</li>
7474
</ol>
75-
<p>Docker 容器无法直接访问宿主机的文件系统,部分功能不可用,例如:<code>从浏览器获取 Cookie</code>;其他功能如有异常请反馈!</p>
75+
<p>Docker 容器无法直接访问宿主机的文件系统,部分功能不可用,例如:<code>从浏览器读取 Cookie</code>;其他功能如有异常请反馈!</p>
7676
<h1>Cookie 说明</h1>
7777
<p><a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">点击查看 Cookie 获取教程</a>;无效或失效的 Cookie 会导致程序获取数据失败!</p>
7878
<ul>
@@ -700,7 +700,7 @@ built with gcc 14.2.0 (crosstool-NG 1.27.0.18_7458341)
700700
<ul>其他示例:
701701
<li><code>6 2</code>:代表依次执行 <code>终端交互模式</code> -> <code>批量下载账号作品(抖音)</code></li>
702702
<li><code>8</code>:代表执行<code>Web API 模式</code></li>
703-
<li><code>2 7</code>:代表依次执行<code>从浏览器获取 Cookie (抖音)</code> -> <code>Edge</code></li>
703+
<li><code>2 7</code>:代表依次执行<code>从浏览器读取 Cookie (抖音)</code> -> <code>Edge</code></li>
704704
</ul>
705705
<h3>程序代理设置</h3>
706706

@@ -733,11 +733,10 @@ built with gcc 14.2.0 (crosstool-NG 1.27.0.18_7458341)
733733
<li>设置服务器模式参数验证</li>
734734
</ul>
735735
<h1>功能介绍</h1>
736-
<h2>复制粘贴写入 Cookie</h2>
737-
<p>参考 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 提取教程</a>,手动从浏览器复制所需 Cookie 至剪贴板,按照程序提示输入 Cookie 后回车确认,程序会自动处理 Cookie 并写入配置文件。</p>
738-
<p>如果粘贴 Cookie 至终端后无响应,可能是 Cookie 文本长度超出终端最大文本长度限制,请考虑更换终端或者其他写入方式。</p>
736+
<h2>从剪贴板读取 Cookie</h2>
737+
<p>参考 <a href="https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6%95%99%E7%A8%8B.md">Cookie 提取教程</a>,手动从浏览器复制所需 Cookie 内容至剪贴板,再按照程序提示操作;程序会自动读取剪贴板的内容并将有效的 Cookie 写入配置文件。</p>
739738
<p>成功写入配置文件后,程序会提示当前 Cookie 登录状态!</p>
740-
<h2>从浏览器获取 Cookie</h2>
739+
<h2>从浏览器读取 Cookie</h2>
741740
<p>自动读取本地浏览器的 Cookie 数据,并提取所需 Cookie 写入配置文件。</p>
742741
<p>成功写入配置文件后,程序会提示当前 Cookie 登录状态!</p>
743742
<p>Windows 系统需要以管理员身份运行程序才能读取 Chromium、Chrome、Edge 浏览器 Cookie!</p>

docs/Release_Notes.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
3. 修复 MacOS 下载直播报错的问题
66
4. 搜索数据为空时不再保存至文件
77
5. 支持设置直播下载的默认清晰度
8-
6. 重构调用 ffmpeg 下载直播功能
9-
7. 优化配置文件参数容错机制
10-
8. 恢复数据请求延时机制
8+
6. 重构复制粘贴写入 Cookie 功能
9+
7. 重构调用 ffmpeg 下载直播功能
10+
8. 优化配置文件参数容错机制
11+
9. 恢复数据请求延时机制
1112

1213
<p><strong>更新公告:本项目名称由 <code>TikTokDownloader</code> 变更为 <code>DouK-Downloader</code></strong></p>

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ dependencies = [
1818
"lxml>=5.3.1",
1919
"openpyxl>=3.1.5",
2020
"pydantic>=2.10.6",
21+
"pyperclip>=1.9.0",
2122
"qrcode>=8.0",
2223
"rich>=13.9.4",
2324
"rookiepy>=0.5.6",

requirements.txt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
# This file was autogenerated by uv via the following command:
22
# uv pip compile pyproject.toml --no-deps --no-strip-extras -o requirements.txt
33
aiofiles==24.1.0
4-
# via tiktokdownloader (pyproject.toml)
4+
# via douk-downloader (pyproject.toml)
55
aiosqlite==0.21.0
6-
# via tiktokdownloader (pyproject.toml)
6+
# via douk-downloader (pyproject.toml)
77
emoji==2.14.1
8-
# via tiktokdownloader (pyproject.toml)
8+
# via douk-downloader (pyproject.toml)
99
fastapi==0.115.9
10-
# via tiktokdownloader (pyproject.toml)
10+
# via douk-downloader (pyproject.toml)
1111
gmssl==3.2.2
12-
# via tiktokdownloader (pyproject.toml)
12+
# via douk-downloader (pyproject.toml)
1313
httpx[socks]==0.28.1
14-
# via tiktokdownloader (pyproject.toml)
14+
# via douk-downloader (pyproject.toml)
1515
lxml==5.3.1
16-
# via tiktokdownloader (pyproject.toml)
16+
# via douk-downloader (pyproject.toml)
1717
openpyxl==3.1.5
18-
# via tiktokdownloader (pyproject.toml)
18+
# via douk-downloader (pyproject.toml)
1919
pydantic==2.10.6
20-
# via tiktokdownloader (pyproject.toml)
20+
# via douk-downloader (pyproject.toml)
21+
pyperclip==1.9.0
22+
# via douk-downloader (pyproject.toml)
2123
qrcode==8.0
22-
# via tiktokdownloader (pyproject.toml)
24+
# via douk-downloader (pyproject.toml)
2325
rich==13.9.4
24-
# via tiktokdownloader (pyproject.toml)
26+
# via douk-downloader (pyproject.toml)
2527
rookiepy==0.5.6
26-
# via tiktokdownloader (pyproject.toml)
28+
# via douk-downloader (pyproject.toml)
2729
uvicorn==0.34.0
28-
# via tiktokdownloader (pyproject.toml)
30+
# via douk-downloader (pyproject.toml)

src/application/TikTokDownloader.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,6 @@ class TikTokDownloader:
4949
VERSION_MAJOR = VERSION_MAJOR
5050
VERSION_MINOR = VERSION_MINOR
5151
VERSION_BETA = VERSION_BETA
52-
PLATFORM = (
53-
"cookie",
54-
"cookie_tiktok",
55-
)
5652
NAME = PROJECT_NAME
5753
WIDTH = 50
5854
LINE = ">" * WIDTH
@@ -110,11 +106,11 @@ def __update_menu(self):
110106
0: _("启用"),
111107
}
112108
self.__function_menu = (
113-
(_("复制粘贴写入 Cookie (抖音)"), self.write_cookie),
114-
(_("从浏览器获取 Cookie (抖音)"), self.browser_cookie),
109+
(_("从剪贴板读取 Cookie (抖音)"), self.write_cookie),
110+
(_("从浏览器读取 Cookie (抖音)"), self.browser_cookie),
115111
# (_("扫码登录获取 Cookie (抖音)"), self.auto_cookie),
116-
(_("复制粘贴写入 Cookie (TikTok)"), self.write_cookie_tiktok),
117-
(_("从浏览器获取 Cookie (TikTok)"), self.browser_cookie_tiktok),
112+
(_("从剪贴板读取 Cookie (TikTok)"), self.write_cookie_tiktok),
113+
(_("从浏览器读取 Cookie (TikTok)"), self.browser_cookie_tiktok),
118114
(_("终端交互模式"), self.complete),
119115
(_("后台监测模式"), self.disable_function),
120116
(_("Web API 模式"), self.server),
@@ -312,18 +308,24 @@ async def change_config(
312308
await self.check_settings()
313309

314310
async def write_cookie(self):
315-
await self.__write_cookie()
311+
await self.__write_cookie(False)
316312

317313
async def write_cookie_tiktok(self):
318-
await self.__write_cookie(1)
314+
await self.__write_cookie(True)
319315

320-
async def __write_cookie(self, index=0):
316+
async def __write_cookie(self, tiktok: bool):
321317
self.console.print(
322318
_("Cookie 获取教程:")
323319
+ "https://github.com/JoeanAmier/TikTokDownloader/blob/master/docs/Cookie%E8%8E%B7%E5%8F%96%E6"
324320
"%95%99%E7%A8%8B.md"
325321
)
326-
if self.cookie.run(self.PLATFORM[index], index):
322+
if self.console.input(
323+
_(
324+
"复制 Cookie 内容至剪贴板后,按回车键确认继续;若输入任意内容并按回车,则取消操作:"
325+
)
326+
):
327+
return
328+
if self.cookie.run(tiktok):
327329
await self.check_settings()
328330

329331
async def auto_cookie(self):
@@ -338,7 +340,7 @@ async def auto_cookie(self):
338340
self.parameter,
339341
self.settings,
340342
).run():
341-
self.cookie.extract(cookie)
343+
self.cookie.extract(cookie, platform=_("抖音"))
342344
await self.check_settings()
343345
else:
344346
self.console.warning(

src/config/parameter.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,9 +859,11 @@ async def set_settings_data(
859859
self.set_general_params(data)
860860

861861
async def __update_cookie_data(self, data: dict) -> None:
862-
for i in ("cookie", "cookie_tiktok"):
862+
for i, j in zip(("cookie", "cookie_tiktok"), (_("抖音"), "TikTok")):
863863
if c := data.get(i):
864-
setattr(self, i, self.cookie_object.extract(c, False, key=i))
864+
setattr(
865+
self, i, self.cookie_object.extract(c, False, key=i, platform=j)
866+
)
865867
await self.update_params()
866868

867869
@staticmethod

src/module/cookie.py

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from typing import TYPE_CHECKING
2-
32
from ..tools import cookie_str_to_dict
43
from ..translation import _
4+
from re import compile
5+
from pyperclip import paste
56

67
if TYPE_CHECKING:
78
from ..config import Settings
@@ -11,53 +12,77 @@
1112

1213

1314
class Cookie:
15+
PATTERN = compile(r"[!#$%&'*+\-.^_`|~0-9A-Za-z]+=([^;\s][^;]*)")
1416
STATE_KEY = "sessionid_ss"
15-
PLATFORM = (
16-
_("抖音"),
17-
"TikTok",
18-
)
17+
PLATFORM_KEY = {
18+
False: "cookie",
19+
True: "cookie_tiktok",
20+
}
1921

2022
def __init__(self, settings: "Settings", console: "ColorfulConsole"):
2123
self.settings = settings
2224
self.console = console
25+
self.PLATFORM_NAME = {
26+
False: _("抖音"),
27+
True: "TikTok",
28+
}
2329

2430
def run(
2531
self,
26-
key="cookie",
27-
tiktok=0,
28-
):
32+
tiktok=False,
33+
) -> bool:
2934
"""提取 Cookie 并写入配置文件"""
30-
if not (
31-
cookie := self.console.input(
32-
_("请粘贴 {platform} Cookie 内容: ").format(
33-
platform=self.PLATFORM[tiktok]
34-
)
35+
if self.validate_cookie_minimal(cookie := paste()):
36+
self.extract(
37+
cookie,
38+
key=self.PLATFORM_KEY[tiktok],
39+
platform=self.PLATFORM_NAME[tiktok],
3540
)
36-
):
37-
return False
38-
self.extract(cookie, key=key)
39-
return True
41+
return True
42+
self.console.warning(_("当前剪贴板的内容不是有效的 Cookie 内容!"))
43+
return False
4044

4145
def extract(
4246
self,
4347
cookie: str,
4448
write=True,
4549
key="cookie",
50+
platform: str = ...,
4651
) -> dict:
4752
cookie_dict = cookie_str_to_dict(cookie)
48-
self.__check_state(cookie_dict)
53+
self.__check_state(
54+
cookie_dict,
55+
platform,
56+
)
4957
if write:
5058
self.save_cookie(cookie_dict, key)
51-
self.console.print(_("写入 Cookie 成功!"))
59+
self.console.print(
60+
_(f"写入 {platform} Cookie 成功!").format(platform=platform)
61+
)
5262
return cookie_dict
5363

54-
def __check_state(self, items: dict) -> None:
64+
def __check_state(self, items: dict, platform: str) -> None:
5565
if items.get(self.STATE_KEY):
56-
self.console.print(_("当前 Cookie 已登录"))
66+
self.console.print(
67+
_(f"当前 {platform} Cookie 已登录").format(platform=platform)
68+
)
5769
else:
58-
self.console.print(_("当前 Cookie 未登录"))
70+
self.console.print(
71+
_(f"当前 {platform} Cookie 未登录").format(platform=platform)
72+
)
5973

6074
def save_cookie(self, cookie: dict, key="cookie") -> None:
6175
data = self.settings.read()
6276
data[key] = cookie
6377
self.settings.update(data)
78+
79+
@classmethod
80+
def validate_cookie_minimal(cls, cookie_str: str) -> bool:
81+
"""
82+
只检查整个字符串中是否存在 key=value 子串,
83+
且 key 和 value 都非空。
84+
返回 True 或 False。
85+
"""
86+
if not isinstance(cookie_str, str):
87+
return False
88+
return bool(cls.PATTERN.search(cookie_str))

0 commit comments

Comments
 (0)