本文仅阐述心路历程及简要思路,以供学习 node.js 及网络安全相关知识,请勿过度解读或用于非法用途。
动机
在 twitter 关注了很多小姐姐,但是每隔一段时间就会有“退网”的,推文直接清空或禁止查看。
这个时候的我就会很懊悔没有提前保存好所有影像资料。
检索
然后就去网上找各种现成的工具,发现大部分都是基于 python 的,或者模拟滚屏解析 html 的;
继续检索发现 twitter 提供了开发者 API,但是要申请,并且现在申请成功率很低。
探究
于是观察了一下 twitter 媒体页面的加载方式,发现以下几点:
- xhr 中显然存在着关于推文的直接 http 请求,且有推文数量参数
- 滚屏瀑布加载的起点为当前最后一条推文数据中的标记字段
- 请求到的推文数据直接包含了图片和视频的 uri 地址,其中图片尺寸可通过修改 query 参数控制
- twitter 关于 cookie 的校验非常松
- twitter 对资源的并发数量有限制
开整吧那就
思路
环境及工具:node.js, node-fetch, request, http-proxy, fs
流程:键入某 twitter 用户名 -> 先请求到 media 数量 -> 将数量修改至 media 请求的参数中 -> 发起 media 请求 -> 解析返回 json 中的 资源 uri -> 下载资源到本地
优势
- 只需要一个 node.js ,不用登录 /py 环境 /headless 浏览器
- 代码简单,业务逻辑只需两三百行 js
- 性能优秀,两次毫秒级请求取到所有 uri,具体资源下载速度由带宽决定
结果
- npm run download xxx 将 xxx 用户的所有最大尺寸图片和视频资源到本地
- npm run update 更新./Medias 目录下所有已存在用户的推文资源