Commit Graph

814 Commits

Author SHA1 Message Date
程序员阿江(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
程序员阿江-Relakkes
91eeb3f96a Merge pull request #909 from Miracle778/fix-zhihu-specified-id-cdp
fix: 修复知乎 specified_id 和已有 Chrome CDP 连接问题
2026-06-16 20:40:47 +08:00
程序员阿江-Relakkes
f459764953 Merge pull request #917 from keinoki/fix-kuaishou
fix: 修复快手翻页逻辑
2026-06-16 20:38:37 +08:00
Keinoki
97e4142733 fix: 修复快手翻页逻辑 2026-06-15 15:37:18 +08:00
程序员阿江(Relakkes)
e5ceb08ed4 docs: 添加 Atlas Cloud 赞助商 2026-06-12 20:13:12 +08:00
Miracle778
803e19111c fix: 修复知乎 specified_id 和已有 Chrome CDP 连接 2026-05-31 21:35:11 +08:00
程序员阿江-Relakkes
165776886f Merge pull request #900 from zanmeipaul/main
feat: 启动任务接口添加帖子/视频数量与评论数量覆盖支持
2026-05-29 21:34:07 +08:00
程序员阿江(Relakkes)
8e93438fe5 Keep PR 900 overrides bounded and opt-in
The PR adds API limit overrides and static proxy support, but the review found that the default proxy provider changed to an invalid static placeholder and the new API fields accepted unbounded values. This keeps the existing proxy default intact, makes static proxy explicit via config or CLI, validates API limit ranges, and adds focused regression coverage for both paths.

Constraint: PR branch must remain contributor-branch compatible and avoid adding dependencies

Rejected: Keep static as the default provider | breaks existing --enable_ip_proxy defaults with an invalid placeholder URL

Rejected: Accept arbitrary integer limits | lets API callers request negative or excessive crawl sizes

Confidence: high

Scope-risk: narrow

Directive: Do not change proxy provider defaults when adding new providers; new providers should be opt-in and covered by provider-specific tests

Tested: uv run pytest tests/test_api_limits.py tests/test_static_proxy_provider.py

Tested: uv run pytest tests

Tested: uv run pytest test/test_utils.py

Tested: uv run python -m compileall api cmd_arg config proxy tests

Tested: git diff --cached --check

Not-tested: Live crawler run against external platforms or real proxy vendor endpoints
2026-05-29 21:27:52 +08:00
程序员阿江-Relakkes
10091499f1 Merge pull request #901 from Jaryan-luck/main
修复:WebUI环境检查因Asyncio Windows兼容性而失败并且无任何错误提示
2026-05-29 19:26:08 +08:00
程序员阿江(Relakkes)
d280d22cb3 docs: 更新文档 英文
删除中英文 README 中已不再展示的代理广告内容,保留项目自身的代理池功能说明。

Confidence: high
Scope-risk: narrow
Tested: inspected README diff and verified targeted sponsor text removal
Not-tested: rendered README preview
2026-05-25 20:20:56 +08:00
🐟Jaryán🍋
5ad5a93e00 Update main.py
sys
2026-05-21 15:37:46 +08:00
🐟Jaryán🍋
5ddd969a8e Update main.py
修复Asyncio Windows兼容性
2026-05-20 22:54:27 +08:00
钟保罗
f997befce9 feat: 添加静态代理方式 2026-05-20 14:34:50 +08:00