使用 Python 自动化 Mastodon 交互
跟随我一起使用 Mastodon API 创建一个新应用程序。
Mastodon 联合社交网络最近非常受欢迎。在社交媒体上发帖很有趣,但自动化互动也很有趣。有一些面向客户端的 API 的文档,但示例有点少。本文旨在帮助解决这个问题。
在尝试按照本文进行操作之前,您应该对 Python 有相当的信心。如果您还不熟悉 Python,请查看 Seth Kenlon 的 Python 入门文章和我的程序一个简单的游戏文章。
创建应用程序
第一步是进入 Mastodon 中的首选项并选择开发类别。在开发面板中,单击新应用程序按钮。
创建应用程序后,复制访问令牌。小心一点。这是您向您的 Mastodon 帐户发帖的授权。
有一些 Python 模块可以提供帮助。
- httpx 模块很有用,因为它是一个 Web API。
getpass模块允许您将令牌安全地粘贴到会话中。- Mastodon 使用 HTML 作为其帖子内容,因此内联显示 HTML 的好方法非常有用。
- 通信与时间有关,
dateutil和zoneinfo模块将帮助处理这个问题。
我的典型导入列表如下所示:
import httpx
import getpass
from IPython.core import display
from dateutil import parser
import zoneinfo将令牌粘贴到 getpass 输入中:
token=getpass.getpass()创建httpx.Client:
client = httpx.Client(headers=dict(Authorization=f"Bearer {token}"))verify_credentials 方法用于验证令牌是否有效。这是一个很好的测试,它为您提供了有关您帐户的有用元数据:
res = client.get("https://mastodon.social/api/v1/accounts/verify_credentials")您可以查询您的 Mastodon 身份:
res.raise_for_status()
result = res.json()
result["id"], result["username"]
>>> ('27639', 'moshez')您的里程会有所不同,但您会收到您的内部 ID 和用户名作为响应。该 ID 稍后会有用。
现在,抽象出 raise_for_status 并解析 JSON 输出:
def parse(result):
result.raise_for_status()
return result.json()以下是它的用处。现在您可以通过ID查看您的账户数据。这是交叉检查一致性的好方法:
result = parse(client.get("https://mastodon.social/api/v1/accounts/27639"))
result["username"]
>>> 'moshez'但有趣的事情当然是获取你的时间表。幸运的是,有一个 API 可以实现这一点:
statuses = parse(client.get("https://mastodon.social/api/v1/timelines/home"))
len(statuses)
>>> 20这只是帖子的数量,但目前就足够了。目前还不需要处理分页。问题是,你可以用你的帖子列表做什么?好吧,您可以查询它以获取各种有趣的数据。例如,谁发布了第四个状态?
some_status = statuses[3]
some_status["account"]["username"]
>>> 'donwatkins'
太棒了,来自 Opensource.com 通讯员 Don Watkins 的推文!总是很棒的内容。我会检查一下:
display.HTML(some_status["content"])
<p>Just finished installed <span class="h-card"><a href="https://fosstodon.org/@fedora" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>fedora</span></a></span> <a href="https://fosstodon.org/tags/Silverblue" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Silverblue</span></a> 37 on <span class="h-card"><a href="https://fosstodon.org/@system76" class="u-url mention" rel="nofollow noopener noreferrer" target="_blank">@<span>system76</span></a></span> <a href="https://fosstodon.org/tags/DarterPro" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>DarterPro</span></a></p>“刚刚完成?等等,这条推文是什么时候发布的?我住在加利福尼亚州,所以我希望在本地时间:
california = zoneinfo.ZoneInfo("US/Pacific")
when = parser.isoparse(some_status["created_at"])
print(when.astimezone(california))
>>> 2022-12-29 13:56:56-08:00今天(撰写本文时)下午 2 点前一点。谈论时效性。
您想亲自看看该帖子吗?这是网址:
some_status["url"]
>>> 'https://fosstodon.org/@donwatkins/109599196234639478'尽情享受嘟嘟声吧,现在 API 增加了 20%!