网站搜索

使用 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%!

相关文章: