tamnd/facebook-cli
GitHub: tamnd/facebook-cli
一个无需登录或 API Key 即可将 Facebook 公开页面、帖子和评论解析为结构化数据的命令行工具。
Stars: 1 | Forks: 0
# fb
一个令人愉悦、可脚本化的 [Facebook](https://facebook.com) 命令行工具。它是一个单一的
二进制程序,能将公共主页、个人主页或小组解析为丰富的记录,流式传输其
最新动态,并将帖子、评论、照片、视频和活动提取为干净的
结构化数据,你可以通过管道将其传输到任何地方,全程无需登录,也无需浏览器。
```
fb page nasa
```
```
NAME CATEGORY LIKES FOLLOWERS VERIFIED URL
NASA Aerospace company 24.1M 25.0M true https://www.facebook.com/nasa
```
完整文档:[facebook-cli.tamnd.com](https://facebook-cli.tamnd.com)。
## 为什么需要它
从 Facebook 提取数据通常意味着要使用无头浏览器、极其脆弱的
选择器集合,或者是需要经过应用审核和使用 token 的 Graph API。`fb` 采取了
不同的路线:它读取 Facebook 为搜索引擎提供的公共页面,
将服务器渲染的 HTML 解析为有类型的记录,并以
你要求的输出格式呈现它们。一个静态二进制程序,无需登录,无需浏览器,无需 API key。
因为它读取的是公开的爬虫接口,所以 `fb` 能看到搜索引擎
看到的内容:完全公开的主页、个人主页、小组和帖子,是最近的动态流
而不是整个历史记录,以及帖子的预览评论而不是
整个评论线程。私密内容仍然是私密的,当遇到登录限制时 `fb` 会明确提示,
而不是默默地什么都不返回。
## 安装
```
go install github.com/tamnd/facebook-cli/cmd/fb@latest
```
或者从 [发布页面](https://github.com/tamnd/facebook-cli/releases) 获取预构建的二进制文件。
该二进制文件是纯 Go 编写的,没有任何运行时依赖。
从源码构建:
```
git clone https://github.com/tamnd/facebook-cli
cd facebook-cli
make build # produces ./bin/fb
```
## 快速开始
```
fb page nasa # a Page's full profile
fb page nasa --posts --limit 20 # its twenty most recent posts
fb post --comments # a post and its comment thread
fb id # classify any Facebook id or URL
```
## 它如何读取 Facebook
`fb` 以网络爬虫的方式匿名读取,无需登录,也无需 cookie。它向
Facebook 请求搜索引擎获得的相同的服务器渲染页面,并解析
返回的内容。
```
fb whoami # reports the access mode and user agent
```
这适用于任何公开的主页、个人主页、小组或帖子。当目标是
私密的,或者位于登录限制之后时,`fb` 会以退出码 `4` 退出并附带一行提示,以便脚本
能将其与真正的错误区分开来。这种权衡的代价是深度:动态流只展示
最近的帖子而不是完整的历史记录,并且一个帖子只包含少量预览
评论而不是整个评论线程。
## 工作原理
`fb` 首先将任何 handle、id 或 URL 解析为有类型的身份(`fb id` 会准确
显示它的识别结果),然后从
`mbasic.facebook.com` 获取相应的无 JavaScript 页面,并使用
[goquery](https://github.com/PuerkitoBio/goquery) 将 HTML 解析为记录。动态流和评论线程
通过 Facebook 的“查看更多”链接进行分页,因此 `--limit` 会遍历它所需的
任意多页,并干净地停止。响应会按 URL 缓存在磁盘上,因此重新运行
命令是即时的,并且对 Facebook 来说也很友好。
每条记录都是一个带有 JSON 标签的普通 struct,因此 `-o json` 会为你提供完整的
结构,而 `--fields` 会将其缩减。没有任何内容是凭空捏造的:Facebook 不会匿名暴露的字段
只会简单地留空,而不是靠猜测填充。
## 命令
| 命令 | 功能 |
| --- | --- |
| `page` | 一个完全解析的公共主页;支持 `--posts/--about/--photos/--videos/--events` |
| `profile` | 个人公开主页;支持 `--posts`、`--about`、`--photos` |
| `group` | 一个小组及其动态流;支持 `--posts` |
| `post` | 一个或多个帖子;支持 `--comments`、`--replies`、`--reactions` |
| `comments` | 帖子下的所有评论和回复 |
| `reactions` | 表态细分情况,使用 `--list` 列出所有表态者 |
| `photos` / `photo` | 某个 handle 的照片,或一张带有完整元数据的照片 |
| `videos` / `video` | 公共主页的视频和 reels,或使用 `--streams` 获取单个内容 |
| `events` / `event` | 公共主页的公开活动,或单个完整活动 |
| `search` | 搜索公共主页、个人主页、小组、帖子、照片、视频、活动 |
| `feed` | 流式传输任何 handle(公共主页/个人主页/小组)的动态流 |
| `id` | 对任何 Facebook id 或 URL 进行分类,无需网络 |
| `seed` | 将根节点扩展为用于抓取的 URL 流 |
| `crawl` | 将 URL 流抓取为完整记录(并可选存入 DB) |
| `db` | 查询本地 SQLite 存储 |
| `whoami` | 报告 `fb` 当前以何种方式访问 Facebook |
| `config` | 显示已解析的配置和路径 |
| `cache` | 检查并清除磁盘缓存 |
| `completion` | 生成 shell 自动补全脚本 |
| `version` | 打印版本号、commit 和构建日期 |
运行 `fb --help` 可查看任何命令的完整 flag 列表。
## 实用示例
以 JSON Lines 格式提取某个主页的最近 50 条帖子:
```
fb page nasa --posts --limit 50 -o jsonl
```
获取一个帖子及其整个评论线程,并展开回复:
```
fb post --comments --replies -o jsonl
```
查看谁对某个帖子点赞/表态:
```
fb reactions --list --type love -o table
```
收集主页上的每个照片 URL:
```
fb photos nasa --limit 200 -o url
```
将短链接解析为规范化 id:
```
fb id "https://fb.watch/xxxxx" -o json
```
构建数据集:将主页动态流扩展为 URL,然后将每个 URL 抓取到 SQLite 中:
```
fb seed page nasa --limit 100 | fb crawl --db nasa.db --comments
fb db --db nasa.db query "select owner_name, count(*) from posts group by 1"
```
## 输出格式
每个命令都通过相同的格式化程序进行渲染。使用 `-o` 选择格式,或者
让 `fb` 自动选择:输出到终端时为表格,通过管道传输时为 JSON Lines。
```
fb page nasa --posts -o table # aligned columns for reading
fb page nasa --posts -o jsonl # one JSON object per line, for piping
fb page nasa --posts -o json # a single JSON array
fb page nasa --posts -o csv # spreadsheet friendly (tsv too)
fb page nasa --posts -o yaml # YAML documents
fb page nasa --posts -o url # just the permalink
```
使用 `--fields` 缩减列,或者为每一行套用模板:
```
fb page nasa --posts --fields permalink,reactions_count,comments_count
fb page nasa --posts --template '{{.Permalink}} {{.ReactionsCount}}'
```
`--raw` 会原样打印上游的 HTML,适合你想自己解析
的场景。
## 配置
`fb` 将其缓存和数据保存在标准的 XDG 路径下
(默认为 `~/.cache/fb` 和 `~/.local/share/fb`;支持通过 `XDG_CACHE_HOME` 和
`XDG_DATA_HOME` 移动它们)。随时查看已解析的路径和设置:
```
fb config show
fb config path
```
有用的全局 flag(均有合理的默认值):
| Flag | 含义 |
| --- | --- |
| `-o, --output` | 输出格式(默认自动) |
| `-n, --limit` | 最大记录数(`0` 表示无限制) |
| `--since` / `--until` | 根据日期停止或跳过动态流条目 |
| `--rate` | 请求之间的最小延迟,以保持礼貌(默认 2s) |
| `--surface` | `mbasic`、`mobile` 或 `auto` |
| `-j, --workers` | 扇出命令的并发数 |
| `--no-cache` | 绕过磁盘缓存 |
## 退出码
| Code | 含义 |
| --- | --- |
| `0` | 成功 |
| `1` | 通用错误 |
| `2` | 使用错误 |
| `3` | 未找到或不可用的内容 |
| `4` | 登录限制:内容非公开 |
| `5` | 频率受限 |
| `6` | 网络错误 |
## 开发
```
make test # run the test suite
make vet # go vet
make build # build ./bin/fb
make smoke # run every command and assert it works or walls cleanly
```
代码是分层的。`cli/` 是基于 Cobra 构建的命令树。`fb/` 是它
所依赖的库:HTTP client、缓存、针对每种记录类型的服务器渲染 HTML 解析器,
以及 SQLite 存储。`pkg/fbid/` 是一个独立的 URL/id 分类器,没有
其他依赖,可以单独导入。
## License
Apache-2.0。参见 [LICENSE](LICENSE)。
标签:API替代方案, ESC4, EVTX分析, Go, Linux安全, OSINT, Ruby工具, Web抓取, 命令控制, 实时处理, 数据采集, 日志审计, 社交媒体