CI / backend (push) Canceled after 0s
公众号的文章也能抓:走 mp.weixin.qq.com 的 DOM(#js_content),
按 data-src 取图,不靠通用抽取器——它会把公众号的图全丢掉。
正文里的外链图下载进我们自己的存储(最多 12 张、单张 8 MB),
地址改成 /attachments/{id}/raw?签名:公众号那边一换图,外链就是一排红叉。
抓取入口谁都能触发,所以只允许公网地址(内网段、回环、链路本地、
保留段、解析不出的域名一律拒绝),否则就是个 SSRF 跳板。
抓不到要说人话:"这个链接没抓下来(原因)。想直接记成任务的话,
加「任务:」前缀再发一次。" 反爬验证页、SPA 空壳都走这条路。
- 新增 services/article.py:extract_url / parse / fetch / store_images / compose_body
- wechat_intake:整条消息是链接时走抓取,落知识草稿,回「已存成知识草稿:标题」
- 依赖 trafilatura==2.0.0(装法见 requirements.txt 注释:必须逐个装再 --no-deps)
- 测试 9 例:链接判定、公众号解析、验证页、通用页裁导航、SSRF 拒绝、图片本地化、失败提示
37 lines
1.1 KiB
Plaintext
37 lines
1.1 KiB
Plaintext
fastapi==0.115.6
|
||
uvicorn[standard]==0.34.0
|
||
# 生产进程管理:gunicorn + UvicornWorker(开发用 `uvicorn --reload` 即可)
|
||
gunicorn==23.0.0
|
||
sqlalchemy[asyncio]==2.0.36
|
||
asyncpg==0.30.0
|
||
alembic==1.14.0
|
||
pydantic==2.10.4
|
||
pydantic-settings==2.7.0
|
||
pyjwt==2.10.1
|
||
redis==5.2.1
|
||
python-multipart==0.0.20
|
||
# Windows has no system tz database; ZoneInfo("Asia/Shanghai") fails without this.
|
||
# On Linux the package simply shadows the system one -- harmless.
|
||
tzdata==2026.5
|
||
|
||
# dev / test only (split into requirements-dev.txt when it grows)
|
||
pytest==8.3.4
|
||
pytest-asyncio==0.25.0
|
||
httpx==0.28.1
|
||
# 微信登录态加密(Fernet)与二维码渲染
|
||
cryptography==50.0.2
|
||
qrcode==8.2
|
||
# 微信里发来链接时抓正文:trafilatura 的正文抽取在中文站上最稳,lxml 是它的解析底座;
|
||
# lxml_html_clean 是 jusText(trafilatura 的回退抽取)还要的模块,lxml 6 起被拆成独立包。
|
||
trafilatura==2.0.0
|
||
lxml==6.1.3
|
||
lxml_html_clean==0.4.6
|
||
courlan==1.4.0
|
||
htmldate==1.11.0
|
||
jusText==3.0.2
|
||
charset-normalizer==3.5.2
|
||
urllib3==2.8.0
|
||
tld==0.13.2
|
||
dateparser==1.5.0
|
||
ruff==0.8.4
|