butubb
74a592024c
feat: 部署改为 git 驱动,容器以宿主用户运行
...
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
服务器实测可经 Cloudflare 443 访问 Gitea 且 git 协议正常(此前我只测了 13000 端口就断言不可达,是错的),因此不再需要 tar + SFTP。
- docker-compose: 增加 user: "1000:1000"。容器此前以 root 运行,写进挂载目录的每轮 jsonl 产物都是 root 属主,导致宿主用户连自己的部署目录都挪不动 —— 这在把部署迁到 /mnt/data 时实际发生了
- deploy.sh: 一条命令走完 拉代码 →(webui/ 有改动时)重建前端 → 重启容器。前端产物 api/webui 是 gitignore 的,git pull 带不过来,必须在服务器上重建一次
- Dockerfile: 补 npm 包。corepack 只管 yarn/pnpm 不管 npm,而前端要在服务器上重建;这样服务器只需要 Docker,不必另配 Node 环境
2026-10-07 11:13:43 +08:00
butubb
cffb407d15
feat: 生产库克隆脚本 + 容器补 Node 运行时
...
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
- tools/clone_database.py: 同服务器跨库克隆并建立独立应用账号的 provisioning 脚本。本机与服务器都没有 mysql 客户端,所以走 INSERT...SELECT 而非 dump/reload。刻意只读写命令行指定的两个 schema,且给应用单开账号而不是复用管理员
- Dockerfile: 补 nodejs。douyin/help.py 在模块导入阶段就执行 execjs.compile(libs/douyin.js),缺 JS 运行时会抛 RuntimeUnavailableError;而 main.py 要导入全部 7 个平台,于是整个应用连带环境自检一起挂掉
已在 192.168.20.220 上验证:7 个平台导入全部通过。
2026-10-07 11:08:11 +08:00
butubb
bcc7361145
refactor: 镜像只装依赖,代码改为挂载
...
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
- Dockerfile: 去掉 COPY . .,镜像退化为纯依赖层,改代码不再需要重建镜像
- Dockerfile: 补 libgl1 / libxcb1 / libglib2.0-0 等 X11 库。opencv-python 在导入时需要它们,而 tools/utils.py 会经 slider_util 导入 cv2 —— 缺了不是某个边角功能挂掉,是整个应用起不来(已在真机冒烟中验证)
- Dockerfile: 补 tzdata,否则 TZ=Asia/Shanghai 被静默忽略,所有时间戳落成 UTC
- Dockerfile: apt 与 pip 均改走国内源。deb.debian.org 实测约 13 kB/s,96 MB 构建依赖要跑半小时以上
- docker-compose: 挂载 ./ 到 /app,部署流程从「重建镜像」变成「重传 + 重启」
- main.py: 启动时若缺 api/webui/index.html 就打印警告,避免只返回一段 JSON 却看着一切正常
2026-10-07 10:57:44 +08:00
butubb
37ca1b1cd6
feat: CDP 接管开关 + 扫码登录面板 + Docker 部署
...
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
- 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 大包传输必断时补历史
2026-10-07 10:41:11 +08:00
butubb
4e60524f37
feat: 监控面板 / 登录鉴权 / 多平台切换 / MySQL
...
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
在上游 MediaCrawler 之上新增一层:
- 监控层 api/monitor/ —— 多博主/多笔记的定时采集、指标快照差分、报表、
企业微信通知。每轮采集写入独立目录,差分才成立。
- WebUI 登录鉴权 api/auth.py —— PBKDF2 口令 + 服务端会话,/api 全接口防护。
WebSocket 单独加依赖:BaseHTTPMiddleware 对 ws 作用域直接放行,覆盖不到。
- 全局平台切换 + 能力矩阵 —— 如实区分「爬虫模块支持」与「监控层已接线」,
未接通的平台直接拒绝建任务,而不是静默跑空。
- 监控库改用 MySQL 5.7(可回退 SQLite 供测试):逐表强制 utf8mb4
(服务端与库默认都是 latin1),启动校验所连 schema 以防写错库,
连接池 recycle + pre_ping 应对 MySQL 的 8 小时空闲断连。
修复上游缺陷:
- xhs/core.py: 主页抓取失败会跳掉整个博主,导致一条作品都抓不到,
而那份资料只喂给一个空函数。改为尽力而为,失败不中断。
- xhs/login.py: cookie 登录只注入 web_session,冷启动签名会失败。
新增 INJECT_ALL_COOKIES 开关(默认关闭,原有行为不变)。
- requirements.txt: 补上 websockets。它在上游 pyproject.toml 里有声明、
这里漏了,导致 uvicorn 没有 WebSocket 能力,实时日志流从未工作。
改动过的上游文件清单及合并方式见 UPSTREAM.md。
测试:492 passed(另有 1 个既有的 Windows/gbk 上游测试失败,与本改动无关)
2026-10-07 09:58:40 +08:00
程序员阿江(Relakkes)
5d547f4586
update readme
2026-10-05 22:21:13 +08:00
程序员阿江(Relakkes)
83c638b9d1
docs: README 新增 OpenLux 赞助商,西语版补上 Atlas Cloud
2026-10-04 22:58:52 +08:00
程序员阿江(Relakkes)
bf28178082
docs: 更新 README 中的 Pro 版介绍
2026-10-04 03:37:23 +08:00
程序员阿江(Relakkes)
380b426000
fix(dy): 补上 ArgusSecurityPlugin 要求的 x-tt-argus 请求头
...
抖音在边缘网关新挂了 ArgusSecurityPlugin,对 aweme/detail、aweme/post 这批接口做
业务前置校验:缺少 x-tt-argus 时直接 403,响应体为
"Blocked by ArgusSecurityPlugin Uifid Not Found";只补 uifid 参数但仍没有这个头
则是 "... Signature Not Found"——后者很容易被误判成 a_bogus / verifyFp 的问题。
网关当前不校验该头取值,传固定字符串即可(实测 "1" 就够)。
参考 https://github.com/Johnserf-Seed/f2/issues/443
注意这是权宜之计:网关哪天升级到真校验该值,会重新出现 Signature Not Found,
届时需要改为页面内注入 JS 让抖音自带 SDK 补齐 Argus 头。
验证:真实 cookie 下 get_video_by_id 恢复可用。
- client.py: 默认请求头补 x-tt-argus,cookie 有 UIFID 时带 uifid 头
(两种都没有则不发,避免被当成「有但为空」)
- 新增 tests/test_douyin_argus_header.py(不发网络请求)
2026-09-19 13:25:59 +08:00
程序员阿江(Relakkes)
8ecfa31de2
chore(ks): 示例配置改用分享短链并补上支持的输入形式
...
- KS_SPECIFIED_ID_LIST 换成两条 /f/<token> 分享短链,用于验证短链解析链路
- 注释补上第三种输入形式(分享短链),与 help.py 的解析实现保持一致
2026-09-18 17:26:42 +08:00
程序员阿江(Relakkes)
c7e6c9fdc0
feat(ks): 支持分享短链 /f/<token> 形式的视频输入
...
快手分享短链 https://www.kuaishou.com/f/X9Idt15MQb9L2cv 路径里是 share_token
而不是视频 ID,它只做 302 跳转,真实地址在 Location 里。原先的解析器只认
/short-video/<id> 和纯 ID,遇到短链会抛 ValueError 被 continue 掉——只有一行
ERROR 日志,看起来像"爬了但没数据"。
- help.py: 新增 /f/<token> 分支,返回 url_type="short"(token 不是视频 ID,
必须跟随重定向),并补上第三种形式的文档
- client.py: 新增 resolve_short_url,GET 时 follow_redirects=False,读
301/302/303/307/308 的 Location
- core.py: url_type == "short" 时先解析短链再解析一次,失败则跳过该条
- 新增 tests/test_kuaishou_url_parse.py(6 条,不发网络请求)
验证:两条真实短链分别解析到 3xyziwesje8e9jg / 3xbbkdxtxqm8sae,详情均成功;
带 query 的标准视频页不会被误判成短链。
2026-09-18 17:23:20 +08:00
程序员阿江(Relakkes)
1e1ae64cb4
fix(ks): 视频不可用时 photo 为 null 导致整轮爬取崩溃
...
快手对已删除/私密/不存在的视频,返回的 visionVideoDetail 里 photo/author 是
null——key 存在、值是 null。而 detail.get("photo", {}) 只在 key 缺失时给默认值,
key 存在且为 null 时拿到的仍是 None,紧接着的 photo.get(...) 抛 AttributeError。
该异常不在 get_video_info_task 的 except 列表里(只 catch DataFetchError /
KeyError),会穿过 asyncio.gather 直接把整轮爬取带崩。
- core.py: 用 (x or {}) 兜住 null;photo 为空时打 WARNING 并跳过该视频,
不再返回半残的 detail 让下游存空记录、再去下载媒体
- 新增 tests/test_kuaishou_unavailable_video.py(不发网络请求)
验证:photo=null / photo 缺失 / visionVideoDetail 缺失 均返回 None;
真实 cookie 端到端确认不可用视频被跳过、正常视频照常返回详情。
2026-09-18 17:18:01 +08:00
程序员阿江(Relakkes)
cf513e70a1
fix(dy): 补上 detail 接口的 uifid/verifyFp 风控参数
...
抖音 detail 接口的 Argus 风控要求 uifid / verifyFp / fp 三个参数,缺一则直接
403:响应体为 "Blocked by ArgusSecurityPlugin Uifid Not Found",补上 uifid 但
verifyFp 不对时换成 "... Signature Not Found"。原实现只传 aweme_id,于是
get_aweme_detail 全线失败,详情和媒体都拿不到。
- 三个参数取自浏览器 cookie:uifid 用 UIFID(缺失时退到 UIFID_TEMP),
verifyFp/fp 用 s_v_web_id。必须用 cookie 里的 s_v_web_id——实测 uifid 搭配
自生成的 verifyFp 会被判 Signature Not Found,两者需要同源
- 新增 tests/test_douyin_aweme_detail_params.py(不发网络请求)
验证:抓包比对真实浏览器发出的 detail 请求,参数逐项一致;真实爬取中详情与
74MB 视频均下载成功。
2026-09-18 17:00:11 +08:00
程序员阿江(Relakkes)
281b445f52
chore(xhs): 更新 XHS_SPECIFIED_NOTE_URL_LIST 示例笔记
...
换成当前可用的测试笔记,用于验证详情抓取与媒体下载链路。
2026-09-18 16:18:42 +08:00
程序员阿江(Relakkes)
eec25bb0a0
fix(xhs): 适配上游 EF* 分档,修复视频只下到封面
...
小红书把 DASH 分档名从按编码命名(h264/h265/av1)改成了按内部档位命名
(EF4/EF5/EF6/EF7),同时 video.consumer 里的 origin_video_key 也没了。
extract_video_urls 写死 stream["h264"],两条路都取不到地址,于是静默返回
空列表:笔记照常入库,但 video_url 为空、媒体只下到封面,全程不报错。
- media.py: 遍历 stream 下所有列表型分档,不再写死分档名;同一分档内含多个
分辨率(720P→4K),按 (height, avg_bitrate) 降序,最高档作主地址,其余作为
备用地址交给下载器回退;origin_video_key 分支保留
- 测试 fixture 换成真实响应结构,旧的 h264 结构另存一份确保兼容性不被改坏
验证:真实响应下旧实现取到 0 条、新实现 5 条;真实下载得到 4K 视频
(54079413 字节 / hevc 3840x2160 / 281.87s),旧结构与图文笔记行为不变。
2026-09-18 16:10:18 +08:00
程序员阿江(Relakkes)
c03ab60aac
fix(bili): 登录态判定改为校验 cookie 有效性,避免静默降级到 480P
...
check_login_state 原先只判断 SESSDATA 是否存在。过期会话的 SESSDATA 会一直
留在浏览器里,于是 pong 报"账号未登录"后进入的登录流程会被立刻判成成功:
既不等待扫码,又把这份死 cookie 灌给 API client。
后果是隐蔽的:详情和评论两个接口不要求登录,照常爬到;而 playurl 依据
Cookie 决定清晰度,未登录状态会静默封顶在 480P,不报任何错。
- login.py: 抽出 is_login_cookie_refreshed(),要求 SESSDATA 被扫码换发成新值
才算登录成功;进入登录流程前记录旧值,残留死 cookie 时输出告警
- core.py: 登录流程结束后补一次 pong 校验,仍失败则明确报错退出,
不再带着未登录状态跑完全程
- 新增 tests/test_bilibili_login_state.py 覆盖上述分支
2026-09-18 15:48:06 +08:00
程序员阿江(Relakkes)
9cfc148577
fix(bili): 兼容首页新版 header 的登录入口选择器
...
B 站首页 header 新旧两套实现并行灰度,登录入口选择器不同:
- 新版 header:.header-avatar-unlogin-entry
- 旧版 header:.right-entry__outside.go-login-btn 内的 .header-login-entry
原代码只匹配旧版,且 header 版本按 cookie 分流(携带过期 SESSDATA 也会
被分到新版),导致未登录场景下点击登录按钮直接 30s 超时。
改为组合选择器,并在等待超时时输出明确的排查提示,替代原先裸的
Playwright traceback。两套 header 的按钮均调用同一个 openMiniLogin(),
弹窗及二维码结构未变,故无需改动。
2026-09-18 14:44:26 +08:00
程序员阿江(Relakkes)
0ca7b29cf0
feat(media): 重构媒体下载,支持 xhs/dy/ks/bili/wb 五平台
...
旧实现只覆盖 4 个平台,且把整个文件读进内存、无重试与完整性校验,
代码按平台复制粘贴了 4 份。本次用统一下载器替换:
- 新增 media_downloader/:流式写入、Range 续传、指数退避重试、大小校验、
路径穿越防护;B 站 DASH 音视频分轨下载后交由 ffmpeg 无损合流
- 新增 media_platform/<平台>/media.py:从平台原始响应提取媒体地址,
与下载器解耦;快手首次接入下载能力
- 开关:config.ENABLE_GET_MEDIA 与 --get_media,并打通 API/WebUI;
同时修正旧配置项 ENABLE_GET_MEIDAS 的拼写
- 落盘按帖子聚合:{SAVE_DATA_PATH 或 data}/{platform}/media/{内容ID}/
- B 站装好 ffmpeg 时走 DASH 最高画质,否则降级 mp4 直链(产物 video-durl.mp4,
避免低清文件阻塞后续的高清路径)
- 删除 4 个 *_store_media.py、AbstractStoreImage/Video 及各 client 的媒体 GET 方法
媒体下载失败只记录日志,不中断爬取主流程。
2026-09-17 22:54:22 +08:00
程序员阿江(Relakkes)
60e66f2a92
docs: update README.md
2026-09-15 16:15:03 +08:00
程序员阿江(Relakkes)
d6f7c5bb90
docs: update README.md
2026-08-14 16:18:52 +08:00
程序员阿江(Relakkes)
5665a271ef
docs: update README
2026-08-12 19:22:18 +08:00
程序员阿江(Relakkes)
439509782c
update readme
2026-08-11 18:26:17 +08:00
程序员阿江(Relakkes)
d594c20c13
fix(xhs,bilibili): 修复访问受限异常击穿与评论采集边界问题
...
xhs: PR #958 把 IPBlockError / PlatformAccessError 加入 request() 的
retry_if_not_exception_type 后,tenacity 会直接重抛原异常而不再包装成
RetryError,core 层的 except 分支接不住,单条笔记被限流会让整批
asyncio.gather 抛出,同批已抓取但未入库的数据全部丢失。
- get_note_detail_async_task / get_creators_and_notes 捕获访问受限异常,
记录明确日志后跳过当前条目,恢复原有的"跳过并继续"语义
- 移除 request() 中已不可达的 IP_ERROR_CODE 分支
bilibili: 修复 get_video_all_comments 的两处翻页边界问题
- is_first_page 改为独立标志,接口返回 next=0 且 is_end=False 时
不再把后续页误判为首页而重复注入置顶评论
- result 无条件累加,否则开启楼中楼抓取时循环守卫永不推进,
max_count 完全失效并可能死循环;截断提前到抓取楼中楼之前,
避免为已被丢弃的评论抓子评论
2026-08-11 18:10:16 +08:00
程序员阿江-Relakkes
3c25521bbb
Merge pull request #958 from ottercoconut/agent/fix-xhs-raw-response-errors
...
fix(xhs): 在返回原始 HTML 前识别访问限制
2026-08-11 18:00:22 +08:00
程序员阿江-Relakkes
7fd42cf448
Merge pull request #957 from muzimu/fix_bilibili_top
...
fix(bilibili): 修复缺失置顶评论
2026-08-11 17:59:51 +08:00
ottercoconut
508abc504f
补全小红书响应与重试回归测试
2026-08-11 17:52:54 +08:00
ottercoconut
6937b12738
修复小红书原始响应错误分类与重复重试
2026-08-11 16:45:49 +08:00
muzimu
17c6d386b8
fix(bilibili): 修复缺失置顶评论
2026-08-08 18:01:26 +08:00
程序员阿江(Relakkes)
071c8c0aca
fix(kuaishou): 降低服务端限流概率并支持限流退避重试
...
- 请求延时在固定基础上加 1-3 秒随机抖动,降低被限流概率
- 签名 REST 请求遇到限流(result:2)时指数退避重试 3 次,不再直接中断
- 重试时重新生成签名(签名绑定请求内容和时间窗口)
2026-08-05 17:39:33 +08:00
程序员阿江(Relakkes)
2a8063a9f2
docs: replace broken star history charts
2026-08-04 18:04:22 +08:00
程序员阿江(Relakkes)
02294b9ea4
style(kuaishou): 优化终端日志输出为条目摘要
...
- 视频详情不再打印完整 JSON,改为单行摘要(id/作者/点赞/播放/标题)
- 搜索每页输出搜索到的视频条数
- 创作者输出获取到的视频总数
2026-08-04 01:29:21 +08:00
程序员阿江(Relakkes)
2e558f1352
fix(kuaishou): 支持网页端 REST 接口签名请求
...
- 新增页面签名环境捕获脚本,通过 caver 属性赋值轨迹获取签名调用入口
- 作品列表/关键词搜索接口迁移到带签名的 REST v2 请求,并显式校验 result 状态码
- 修复分页停止条件,空列表时结束翻页
- 更新默认创作者主页 ID
2026-08-04 01:14:39 +08:00
程序员阿江-Relakkes
1779dde972
Merge pull request #950 from ztcools/fix/weibo-rfc2822-timestamp-timezone
...
fix(weibo): 修复 RFC2822 时间转换丢弃时区偏移导致时间戳晚 8 小时
2026-07-30 19:42:22 +08:00
ztcools
04631ba8e4
fix(weibo): 修复 RFC2822 时间转换丢弃时区偏移导致时间戳晚 8 小时
...
rfc2822_to_timestamp 先用 %z 解析出带偏移的 datetime,再用
replace(tzinfo=timezone.utc) 处理。replace 只是覆盖 tzinfo 而不做换算,
+0800 的时间被当成 UTC,算出的时间戳比真实时间晚 8 小时。
改用 astimezone(timezone.utc) 做真正的时区换算,与紧邻上方的
rfc2822_to_china_datetime 保持一致。
影响 store/weibo 落库的 create_time 字段(帖子与评论各一处)。同一条记录里
create_time 与 create_date_time 会相差 8 小时,跨日内容的日期还会整体偏移
一天。
补两条离线单测:一条断言 +0800 输入对应的时间戳,一条断言 create_time 与
create_date_time 指向同一时刻。两条测试在修复前均失败。
2026-07-30 15:07:07 +08:00
程序员阿江(Relakkes)
17f66121e0
fix: 升级 xhshow 至 0.2.0, 移除 GET 签名猴子补丁
...
xhshow 0.2.0 调整了 build_payload_array 参数顺序, 旧的位置参数调用会
导致 creator 等 GET 请求报 'float' object has no attribute 'encode'。
该版本已原生修复 GET 请求 a3_hash 问题(Cloxl/xhshow#104 ), 本地补丁
不再需要, GET 分支改用 sign_headers_get 高层接口。
2026-07-25 01:12:08 +08:00
程序员阿江(Relakkes)
e6e863a1d3
docs: update README.md
2026-07-25 00:03:17 +08:00
程序员阿江(Relakkes)
0625e01a6b
docs: 更新赞助商展示
2026-07-16 16:17:35 +08:00
程序员阿江(Relakkes)
076dcba978
fix: 修复 WebUI 源码缺失、环境检测路径及文档说明
...
- 调整 .gitignore,避免误忽略 webui/src/lib/ 和 webui/src/components/env/
- 补齐 WebUI 缺失的 lib 工具函数、API 封装及环境检测组件
- 修复 /api/env/check 使用相对路径导致启动目录不同时检测失败的问题
- 更新中/英/西三语 README 的 WebUI 开发调试与生产构建说明
2026-07-01 23:32:10 +08:00
程序员阿江(Relakkes)
92c98e658e
Merge branch 'worktree-desktop-main-e750a46a'
2026-07-01 23:05:20 +08:00
程序员阿江(Relakkes)
65ddaa8828
refactor: 将 WebUI 源码纳入仓库,移除打包产物
...
- 新增 webui/ 前端源码目录(React+Vite+TypeScript+Tailwind)
- 删除 api/webui/ 中旧的打包静态资源
- 更新 .gitignore 忽略 api/webui/ 构建输出和 webui/node_modules
- 更新 README 增加前端构建说明
2026-07-01 23:05:03 +08:00
程序员阿江(Relakkes)
a06273ea6c
fix: 将平台业务ID统一改为String并自动建表
...
- 抖音、B站、快手、微博的帖子/视频/评论ID从BigInteger改为String,
避免PostgreSQL下字符串写入BIGINT报错及未来ID溢出风险
- B站dynamic_id改为String,修复API返回id_str被强转int导致的精度丢失
- 知乎提取器对content_id/question_id显式str()转换
- main.py启动数据库保存模式时自动建表,无需手动--init_db
- 同步更新相关老化测试
2026-07-01 23:03:43 +08:00
程序员阿江(Relakkes)
51d4853db5
fix: 放宽依赖版本以支持 Python 3.13
...
- 将 pydantic、playwright、pillow、wordcloud、matplotlib 从 == 改为 >=
- 统一 requirements.txt 与 pyproject.toml 中 pillow 的版本
- 使用 Python 3.13 重新生成 uv.lock
2026-07-01 22:40:33 +08:00
程序员阿江-Relakkes
2ac0716c41
Merge pull request #899 from lee90fly/patch-1
...
Fix: skip notes that fail to fetch instead of crashing
2026-07-01 22:07:16 +08:00
程序员阿江-Relakkes
98a2830985
Merge pull request #925 from kapil971390/fix/proxy-provider-unknown-name-error
...
fix(proxy): raise ValueError for unknown IP_PROXY_PROVIDER_NAME instead of crashing with AttributeError
2026-07-01 22:03:09 +08:00
程序员阿江(Relakkes)
2295208b2d
docs: 更新 BrowserAct 赞助商落地链接
2026-07-01 19:20:29 +08:00
程序员阿江(Relakkes)
9d04f9dbda
chore: 升级 playwright 依赖版本至 1.55.0
2026-07-01 19:20:24 +08:00
程序员阿江(Relakkes)
9f4f8bf768
refactor: 教学版移除全平台用户个人信息采集与持久化
...
- 用户 ID 转为匿名 creator_hash,昵称中间脱敏,IP/头像/主页/签名/性别不再采集
- 覆盖 xhs/weibo/bilibili/douyin/kuaishou/tieba/zhihu 7 个平台
- 删除 7 张 creator 档案 ORM 表,15 张内容/评论表新增 creator_hash 列
- B 站禁用粉丝/关注/联系人列表抓取
- 新增 tools/user_hash.py 与 4 个平台的 mock+SQLite 端到端测试
测试: pytest tests/test_no_user_info.py tests/test_weibo_no_user_info.py tests/test_douyin_no_user_info.py tests/test_kuaishou_no_user_info.py (21 passed)
2026-07-01 13:09:55 +08:00
程序员阿江(Relakkes)
8b4d8fcffa
docs: 添加 BrowserAct 白金赞助商
2026-07-01 13:05:05 +08:00
kapil971390
e3861fe9be
fix(proxy): raise ValueError for unknown IP_PROXY_PROVIDER_NAME
...
When IP_PROXY_PROVIDER_NAME in config.py is set to an unrecognised
value (e.g. typo "kuaidalli" instead of "kuaidaili"), IpProxyProvider.get()
returns None which is silently stored in ProxyIpPool.ip_provider. The
crash surfaces later as:
AttributeError: 'NoneType' object has no attribute 'get_proxy'
with no hint about what went wrong or how to fix it.
Add an explicit None-check in create_ip_pool() that raises ValueError
with the bad name and the list of valid options, so the root cause is
immediately visible. Also add a regression test covering the four
invalid-name edge cases (typo, empty string, wrong case, unknown name)
and the three valid names to confirm they are unaffected.
2026-06-26 12:12:38 +05:30
程序员阿江(Relakkes)
c9a111be73
fix: 修复已有浏览器 CDP 连接
2026-06-18 17:22:38 +08:00