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抓取, 命令控制, 实时处理, 数据采集, 日志审计, 社交媒体