twitter-to-sqlite 作者 dogsheep

标星

README 源代码

twitter-to-sqlite

PyPI Changelog Tests License

将 Twitter 数据保存到 SQLite 数据库。

此工具目前使用 Twitter API v1。如果您没有该版本 API 的密钥,则可能无法使用此工具。

如何安装

$ pip install twitter-to-sqlite

身份验证

首先,您需要在 https://developer.twitter.com/en/apps 创建一个 Twitter 应用程序。您可能需要申请 Twitter 开发者账户 - 如果是这样,您可能会发现这个 电子邮件申请示例 对您有用,该示例过去曾被批准。

创建应用程序后,导航到“Keys and tokens”(密钥和令牌)页面,并记下以下信息

  • 您的 API 密钥
  • 您的 API secret key
  • 您的访问令牌
  • 您的 access token secret

您需要将所有这四个值保存到一个 JSON 文件中才能使用此工具。

您可以通过运行以下命令并在提示符处粘贴值来创建该 JSON 文件

$ twitter-to-sqlite auth
Create an app here: https://developer.twitter.com/en/apps
Then navigate to 'Keys and tokens' and paste in the following:

API key: xxx
API secret key: xxx
Access token: xxx
Access token secret: xxx

这将在当前目录中创建一个名为 auth.json 的文件,其中包含所需的值。要将文件保存到不同的路径或文件名,请使用 --auth=myauth.json 选项。

按特定账户检索推文

user-timeline 命令检索指定用户账户发布的所有推文。它默认为已认证用户的账户。

$ twitter-to-sqlite user-timeline twitter.db
Importing tweets  [#####-------------------------------]  2799/17780  00:01:39

所有这些命令都假定当前目录中有一个 auth.json 文件。您可以使用 -a 提供 auth.json 文件的路径。

$ twitter-to-sqlite user-timeline twitter.db -a /path/to/auth.json

要加载其他用户的推文,请将他们的屏幕名作为参数传递。

$ twitter-to-sqlite user-timeline twitter.db cleopaws nichemuseums

Twitter 的 API 对大多数用户账户最多只返回约 3,200 条推文,但您可能会发现它会返回您自己用户账户的所有可用推文。

您可以使用 --ids 参数传递数字 Twitter 用户 ID 而不是屏幕名。

您可以使用 --since 检索自上次为该用户导入以来的所有推文,或使用 --since_id=xxx 检索自特定推文 ID 以来的所有推文。

此命令也接受下面文档中说明的 --sql--attach 选项。

批量检索用户资料

如果您有一个 Twitter 屏幕名(或用户 ID)列表,您可以使用 users-lookup 命令批量抓取他们完整的 Twitter 资料。

$ twitter-to-sqlite users-lookup users.db simonw cleopaws

您可以改用 --ids 选项传递用户 ID。

$ twitter-to-sqlite users-lookup users.db 12497 3166449535 --ids

此命令也接受下面文档中说明的 --sql--attach 选项。

批量检索推文

如果您有一个推文 ID 列表,您可以使用 statuses-lookup 命令批量抓取它们。

$ twitter-to-sqlite statuses-lookup tweets.db 1122154819815239680 1122154178493575169

支持 --sql--attach 选项。

这里有一个方法来检索现有推文回复但尚未存储在您的数据库中的任何推文。

$ twitter-to-sqlite statuses-lookup tweets.db \
    --sql='
        select in_reply_to_status_id
        from tweets
        where in_reply_to_status_id is not null' \
    --skip-existing

--skip-existing 选项意味着已经存储在数据库中的推文将不会再次抓取。

检索 Twitter 关注者

followers 命令检索指定账户的每个关注者的详细信息。您可以使用它来检索您自己的关注者,或者您可以传递一个或多个屏幕名来抓取其他账户的关注者。

以下命令抓取您的关注者并将其保存在名为 twitter.db 的 SQLite 数据库文件中。

$ twitter-to-sqlite followers twitter.db

此命令非常慢,因为 Twitter 对此端点施加了每分钟不超过一次请求的速率限制!如果您对拥有数千名关注者的账户运行此命令,预计将需要数小时。

要检索其他账户的关注者,请使用

$ twitter-to-sqlite followers twitter.db cleopaws

此命令也接受 --ids--sql--attach 选项。

请参阅 使用 Datasette 分析我的 Twitter 关注者 获取此命令的原始灵感。

检索朋友

friends 命令与 followers 命令类似,但检索指定(或当前认证)用户的“朋友” - 定义为用户正在关注的账户。

$ twitter-to-sqlite friends twitter.db

它接受与 followers 命令相同的选项。

检索收藏的推文

favorites 命令检索由指定用户收藏的推文。在没有额外参数的情况下调用时,它会检索当前认证用户收藏的推文。

$ twitter-to-sqlite favorites faves.db

您也可以使用 --screen_name--user_id 参数检索其他用户的收藏推文。

$ twitter-to-sqlite favorites faves-obama.db --screen_name=BarackObama

使用 --stop_after=xxx 参数仅检索最近指定数量的收藏,例如获取认证用户最近的 50 条收藏。

$ twitter-to-sqlite favorites faves.db --stop_after=50

检索 Twitter 列表

lists 命令检索属于一个或多个用户的所有列表。

$ twitter-to-sqlite lists lists.db simonw dogsheep

此命令也接受 --sql--attach--ids 选项。

要额外抓取每个列表的成员列表,请使用 --members

检索 Twitter 列表成员

list-members 命令可用于检索一个或多个 Twitter 列表的详细信息,包括其所有成员。

$ twitter-to-sqlite list-members members.db simonw/the-good-place

您可以传递多个 screen_name/list_slug 标识符。

如果您知道列表的数字 ID,则可以使用 --ids

$ twitter-to-sqlite list-members members.db 927913322841653248 --ids

仅检索关注者和朋友 ID

还可以仅检索特定用户正在关注(在 Twitter API 术语中称为“朋友”)或被关注的账户的数字 Twitter ID。

$ twitter-to-sqlite followers-ids members.db simonw cleopaws

这将使用两个指定账户的 followed_id/follower_id 对填充 following 表,列出关注这两个账户中任何一个的每个账户 ID。

$ twitter-to-sqlite friends-ids members.db simonw cleopaws

这会做同样的事情,但抓取那些账户正在关注的 ID。

这两个命令也支持 --sql--attach 作为直接将屏幕名作为命令行参数传递的替代方案。您可以使用 --ids 将输入作为用户 ID 而不是屏幕名进行处理。

底层的 Twitter API 有一个速率限制,每 15 分钟最多请求 15 次 - 尽管每次调用可以返回多达 5,000 个 ID。默认情况下,为了保持在速率限制内,这两个子命令在 API 调用之间都会等待 61 秒 - 如果您知道不会进行许多调用,您可以使用 --sleep=1 将此行为调整为仅延迟一秒。

检索您的主页时间线推文

home-timeline 命令从已认证用户的主页时间线检索最多 800 条推文 - 通常这意味着您关注的人的推文。

$ twitter-to-sqlite home-timeline twitter.db
Importing timeline  [#################--------]  591/800  00:01:14

推文存储在 tweets 表中,并且在 timeline_tweets 表中添加一条记录,说明此推文因出现在您用户的时间线中而被捕获。

您可以使用 --since 仅检索自上次运行此命令以来发布的推文,或使用 --since_id=xxx 显式传递一个推文 ID 作为最后位置。

然后您可以使用以下 URL 在 Datasette 中查看您的时间线:

/tweets/tweets?_where=id+in+(select+tweet+from+[timeline_tweets])&_sort_desc=id&_facet=user

这将过滤您的推文表,仅显示出现在您时间线中的推文,按最新优先排序,并使用分面功能向您展示哪些用户发布了最多的推文。

检索提及您的推文

mentions-timeline 命令的功能类似于 home-timeline,但它检索提及已认证用户账户的推文。它将在 mentions_tweets 表中记录被提及的用户账户。

它支持 --since--since_id,用法与 home-timeline 相同。

使用 --sql 和 --attach 从 SQL 查询提供输入

此选项适用于某些子命令 - 运行 twitter-to-sqlite command-name --help 进行检查。

您可以直接将 Twitter 屏幕名(或用户 ID 或推文 ID)作为命令行参数提供,或者通过执行 SQL 查询来提供这些屏幕名或 ID。

例如:考虑一个 SQLite 数据库,其中有一个 attendees 表列出了姓名和 Twitter 账户 - 如下所示:

First Last Twitter
Simon Willison simonw
Avril Lavigne AvrilLavigne

您可以通过使用 --sql 查询加载屏幕名,运行 users-lookup 命令来抓取该数据库中列出的每个用户的 Twitter 资料。

$ twitter-to-sqlite users-lookup my.db --sql="select Twitter from attendees"

如果您的数据库表包含 Twitter ID,您可以选择这些 ID 并传递 --ids 参数。例如,要抓取使用 twitter-to-sqlite friends-ids 命令将其用户 ID 插入到 following 表中的用户的资料:

$ twitter-to-sqlite users-lookup my.db --sql="select follower_id from following" --ids

或者为了避免重新抓取已经抓取过的用户:

$ twitter-to-sqlite users-lookup my.db \
    --sql="select followed_id from following where followed_id not in (
        select id from users)" --ids

如果您的数据位于一个单独的数据库文件中,您可以使用 --attach 附加它。例如,考虑上面的与会者示例,但数据位于 attendees.db 文件中,并且您想将用户资料抓取到 tweets.db 文件中。您可以这样做:

$ twitter-to-sqlite users-lookup tweets.db \
    --attach=attendees.db \
    --sql="select Twitter from attendees.attendees"

文件名(不带扩展名)将用作 SQLite 中的数据库别名。如果出于某种原因想要不同的别名,可以使用冒号指定,如下所示:

$ twitter-to-sqlite users-lookup tweets.db \
    --attach=foo:attendees.db \
    --sql="select Twitter from foo.attendees"

运行搜索

search 命令针对 Twitter 标准搜索 API 运行搜索。

$ twitter-to-sqlite search tweets.db "dogsheep"

这将导入最多约 320 条与该搜索词匹配的推文到 tweets 表中。它还会在 search_runs 表中创建一条记录,记录搜索的发生,并在 search_runs_tweets 表中创建多对多记录,记录当时针对该搜索看到的推文。

您可以使用 --since 参数检查具有相同参数的先前搜索运行,并仅检索自上次检索到的匹配推文以来发布的推文。

支持 search 命令的以下附加选项:

  • --geocode: latitude,longitude,radius,其中 radius 是一个数字后跟 mi 或 km
  • --lang: ISO 639-1 语言代码,例如 enes
  • --locale: 区域设置:目前只有 ja 有效
  • --result_type: mixed(混合)、recent(最新)或 popular(热门)。默认为 mixed
  • --count: 每页结果数量,默认为最大值 100
  • --stop_after: 在抓取指定数量的结果后停止
  • --since_id: 抓取自此推文 ID 以来的推文。您可能更想使用 --since 代替此选项。

使用 track 和 follow 实时捕获推文

此功能处于实验阶段。如果您发现任何问题,请提交 Bug 报告

Twitter 提供了一个实时 API,可用于订阅正在发生的推文。twitter-to-sqlite 可以使用此 API 不断地用匹配特定关键词或提及特定用户的推文更新 SQLite 数据库。

track

要跟踪关键词,请使用 track 命令:

$ twitter-to-sqlite track tweets.db kakapo

此命令将一直运行直到您按下 Ctrl+C。它将捕获提及关键词 kakapo 的所有推文,并将它们存储在 tweets.db 数据库文件中。

您可以将多个关键词作为空格分隔的列表传递。这将捕获匹配这些关键词中任何一个的推文。

$ twitter-to-sqlite track tweets.db kakapo raccoon

您可以用引号将短语括起来,以搜索匹配这两个关键词的推文。

$ twitter-to-sqlite track tweets.db 'trash panda'

有关使用此命令的高级技巧,请参阅 Twitter track 文档

添加 --verbose 选项可以在捕获推文时(以详细的 JSON 格式)将其显示到终端上。

$ twitter-to-sqlite track tweets.db raccoon --verbose

follow

follow 命令将捕获与一个或多个特定 Twitter 用户相关的所有推文。

$ twitter-to-sqlite follow tweets.db nytimes

这包括这些用户发布的推文、回复或引用这些用户的推文以及该用户转发的推文。有关完整详细信息,请参阅 Twitter follow 文档

此命令接受一个或多个屏幕名。

您可以使用 --ids 标志为其提供数字 Twitter 用户 ID 而不是屏幕名。

此命令还支持 --sql--attach 选项,以及用于在捕获时显示推文的 --verbose 选项。

这里是如何开始关注 following 表中当前表示被关注的每个用户 ID(使用 friends-ids 命令填充)的推文:

$ twitter-to-sqlite follow tweets.db \
    --sql="select distinct followed_id from following" \
    --ids

从您的 Twitter 归档导入数据

您可以通过按照这些说明请求您的 Twitter 数据归档。

Twitter 会向您发送一个下载 .zip 文件的链接。您可以使用 import 命令将该文件的内容导入到一个新的数据库文件 archive.db 中的一组表中(每个表都以 archive_ 前缀开头)。

$ twitter-to-sqlite import archive.db ~/Downloads/twitter-2019-06-25-b31f2.zip

此命令不会填充任何常规表,因为 Twitter 的导出数据与 Twitter API 返回的模式不完全匹配。

每次运行它都会删除并重新创建相应的 archive_* 表。如果这不是您想要的结果,请对一个新的 SQLite 数据库文件名运行命令,而不是对已存在的数据库文件运行。

如果您已经解压缩了归档文件,您可以对您解压缩到的目录运行此命令:

$ twitter-to-sqlite import archive.db ~/Downloads/twitter-2019-06-25-b31f2/

您还可以对该文件夹中的一个或多个特定文件运行此命令。例如,仅导入 follower.js 和 following.js 文件:

$ twitter-to-sqlite import archive.db \
    ~/Downloads/twitter-2019-06-25-b31f2/follower.js \
    ~/Downloads/twitter-2019-06-25-b31f2/following.js

您可能希望使用其他命令根据归档中的数据填充表。例如,要检索您在归档中收藏的每条推文的完整 API 版本,您可以运行以下命令:

$ twitter-to-sqlite statuses-lookup archive.db \
    --sql='select tweetId from archive_like' \
    --skip-existing

如果您希望这些导入的推文随后反映在 favorited_by 表中,您可以通过应用以下 SQL 查询来实现:

INSERT OR IGNORE INTO favorited_by (tweet, user) ...> SELECT tweetId, 'YOUR_TWITTER_ID' FROM archive_like;">
$ sqlite3 archive.db
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> INSERT OR IGNORE INTO favorited_by (tweet, user)
   ...>     SELECT tweetId, 'YOUR_TWITTER_ID' FROM archive_like;

将 YOUR_TWITTER_ID 替换为您的数字 Twitter ID。如果您不知道该 ID,可以通过运行以下命令找到它:

$ twitter-to-sqlite fetch \
    "https://api.twitter.com/1.1/account/verify_credentials.json" \
    | grep '"id"' | head -n 1

设计说明

  • 推文 ID 以整数形式存储,以便以合理的方式按 ID 排序
  • 虽然我们在表之间配置了外键关系,但我们并未要求 SQLite 强制执行它们。following 表利用了这一点,允许 followers-idsfriends-ids 命令用用户 ID 填充该表,即使用户账户本身尚未存在于 users 表中。