将 Twitter 数据保存到 SQLite 数据库。
此工具目前使用 Twitter API v1。如果您没有该版本 API 的密钥,则可能无法使用此工具。
- 如何安装
- 身份验证
- 按特定账户检索推文
- 批量检索用户资料
- 批量检索推文
- 检索 Twitter 关注者
- 检索朋友
- 检索收藏的推文
- 检索 Twitter 列表
- 检索 Twitter 列表成员
- 仅检索关注者和朋友 ID
- 检索您的主页时间线推文
- 检索提及您的推文
- 使用 --sql 和 --attach 从 SQL 查询提供输入
- 运行搜索
- 使用 track 和 follow 实时捕获推文
- 从您的 Twitter 归档导入数据
- 设计说明
$ 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
选项意味着已经存储在数据库中的推文将不会再次抓取。
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
lists
命令检索属于一个或多个用户的所有列表。
$ twitter-to-sqlite lists lists.db simonw dogsheep
此命令也接受 --sql
、--attach
和 --ids
选项。
要额外抓取每个列表的成员列表,请使用 --members
。
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
还可以仅检索特定用户正在关注(在 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
相同。
此选项适用于某些子命令 - 运行 twitter-to-sqlite command-name --help
进行检查。
您可以直接将 Twitter 屏幕名(或用户 ID 或推文 ID)作为命令行参数提供,或者通过执行 SQL 查询来提供这些屏幕名或 ID。
例如:考虑一个 SQLite 数据库,其中有一个 attendees
表列出了姓名和 Twitter 账户 - 如下所示:
First | Last | |
---|---|---|
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 语言代码,例如en
或es
--locale
: 区域设置:目前只有ja
有效--result_type
:mixed
(混合)、recent
(最新)或popular
(热门)。默认为mixed
。--count
: 每页结果数量,默认为最大值 100--stop_after
: 在抓取指定数量的结果后停止--since_id
: 抓取自此推文 ID 以来的推文。您可能更想使用--since
代替此选项。
此功能处于实验阶段。如果您发现任何问题,请提交 Bug 报告!
Twitter 提供了一个实时 API,可用于订阅正在发生的推文。twitter-to-sqlite
可以使用此 API 不断地用匹配特定关键词或提及特定用户的推文更新 SQLite 数据库。
要跟踪关键词,请使用 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
命令将捕获与一个或多个特定 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 会向您发送一个下载 .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 查询来实现:
$ 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-ids
和friends-ids
命令用用户 ID 填充该表,即使用户账户本身尚未存在于users
表中。