使用 Python 和 Raspberry Pi 制作你自己的 Twitter 机器人

通过一些简单的 Python 代码在 Raspberry Pi 上运行,自动化你的推文。
495 位读者喜欢这个。
Enter our Twitter contest, win open leadership books

Opensource.com

Twitter 是一个很棒的通讯和社交媒体平台。它应有尽有:突发新闻、政治观点、幽默、名人、娱乐、特定兴趣聊天,以及,嗯,任何东西。个人、公司、部门、项目以及更多——真的任何人或任何事物——都可以拥有一个 Twitter 账户。有些 Twitter 账户甚至不是由一个人或一群人手动运行的——它们是自动化的机器人。

使用 Python 编写 Twitter 机器人 非常简单——而 Raspberry Pi 是运行代码的完美工具;与其让 PC 或笔记本电脑永久开启,不如让你的 Raspberry Pi 24/7 全天候运行,并且几乎不会消耗任何电力。话虽如此,如果你没有 Raspberry Pi,本教程的大部分内容仍然可以在你的 PC 上运行。

Twitter API 入门

Twitter 是一种 Web 服务,它提供应用程序编程接口 (API),这意味着你可以编写软件来与实时 Twitter 服务通信——可能用于实时读取推文或自动发布推文。

API 可以免费使用,但你必须拥有一个 Twitter 账户并注册你的应用程序才能获得 API 访问权限,但这很容易。

首先访问 apps.twitter.com。通过填写必填字段创建一个新应用——确保在你的应用的权限下选择读取和写入。这将生成一个 Consumer key(消费者密钥)Consumer secret(消费者密钥Secret)Access token(访问令牌)Access token secret(访问令牌 Secret)。你需要这四个密钥才能从你的 Python 代码连接到你的 Twitter 账户。不要与任何人分享这些密钥,因为它们可以在没有账户密码的情况下使用。如果你在线分享你的代码,请确保你不包含这些密钥

Creating a Twitter app

opensource.com

要从 Python 访问 Twitter API,你需要安装 Twython 库。在终端窗口中使用 pip 安装它

sudo pip3 install twython

打开你的 Python 编辑器并创建一个新文件。将其保存为 auth.py 并将你自己的 API 密钥插入到这个示例代码中

consumer_key        = 'ABCDEFGHIJKLKMNOPQRSTUVWXYZ'
consumer_secret     = '1234567890ABCDEFGHIJKLMNOPQRSTUVXYZ'
access_token        = 'ZYXWVUTSRQPONMLKJIHFEDCBA'
access_token_secret = '0987654321ZYXWVUTSRQPONMLKJIHFEDCBA'

在另一个文件中,编写这个简单的程序来测试你是否可以发送推文

from twython import Twython

from auth import (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
twitter = Twython(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
message = "Hello world!"
twitter.update_status(status=message)
print("Tweeted: {}".format(message))

保存并运行此文件。它应该从你的账户发送一条推文,内容为“Hello world!”。

A Hello world tweet

opensource.com

如果出现错误,请检查你的 API 密钥是否复制正确。

现在尝试为你的程序添加一些随机性。在顶部添加 random 模块

import random

添加一个消息列表,并随机选择一个

messages = [
	"Hi Twitter",
	"Hello from Python",
	"Hello from my Raspberry Pi",
	"I'm a bot",
]

然后更改你的代码,使其在发布推文之前从列表中选择一条随机消息

message = random.choice(messages)

你可能还想尝试发布图片推文

message = "Hello world - here's a picture!"
with open('/home/pi/Downloads/image.jpg', 'rb') as photo:
    twitter.update_status_with_media(status=message, media=photo)

读取 Twitter

除了使用 Python 发送推文外,你还可以使用 TwythonStreamer 类读取推文

from twython import TwythonStreamer
from auth import (
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            print(data['text'])
stream = MyStreamer(
    consumer_key,
    consumer_secret,
    access_token,
    access_token_secret
)
stream.statuses.filter(track='raspberry pi')

此代码跟踪所有包含短语“raspberry pi”的推文。当它找到一条推文时,它会将关于该推文的数据集合发送到 on_success 方法中。 Data 是一个字典,其中包含推文文本以及大量元数据。在这里,我们只打印出了推文内容。你可以让它一直运行,并且每次有新推文与搜索匹配时,它都会运行 on_success 方法。这可以是单词、短语或标签。

此示例打印出发布推文的账户用户名以及推文内容

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            username = data['user']['screen_name']
            tweet = data['text']
            print("@{}: {}".format(username, tweet))

有关更多信息,请参阅 Raspberry Pi 关于 使用 Python 的 Twitter API 的学习指南。

如果你想让你的 Twitter 机器人代码 24/7 全天候运行,你可以将其安装在 Web 服务器上,在家中的 Raspberry Pi 上运行,甚至可以使用 托管的 Raspberry Pi

物理组件

Adding physical components to a Twitter program

opensource.com

使用 Raspberry Pi,你可以轻松地将物理组件(例如按钮和 LED)添加到你的 Twitter 程序中。例如,你可以将其设置为在按下物理按钮时发送一条随机推文

from gpiozero import Button
button = Button(2)
button.wait_for_press()
message = "Hello world!"
twitter.update_status(status=message)
print("Tweeted: {}".format(message))

或者发布 Sense HAT 的温度读数

from sense_hat import SenseHat

sense = SenseHat()

message = "The temperature is currently {:2.2f} 
degrees".format(sense.temperature)

twitter.update_status(status=message)

或者在推文与搜索匹配时点亮 LED

from gpiozero import LED

led = LED(3)

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            led.on()
            username = data['user']['screen_name']
            tweet = data['text']
            print("@{}: {}".format(username, tweet))
            sleep(10)
            led.off()

Sense HAT

opensource.com

或者在 Sense HAT 显示屏上滚动显示推文

from sense_hat import SenseHat

sense = SenseHat()

class MyStreamer(TwythonStreamer):
    def on_success(self, data):
        if 'text' in data:
            username = data['user']['screen_name']
            tweet = data['text']
            sense.show_message("@{}: {}".format(username, tweet))

有关使用 Raspberry Pi 进行物理计算的更多信息,请参阅我关于 GPIO Zero 入门项目Sense HAT 入门 的文章。你还可以按照 Raspberry Pi 学习资源上的 Tweeting Babbage 教程制作一个发布推文的 Raspberry Pi 相机项目。

真实的 Twitter 机器人

不久前,我创建了一个名为 pyjokes 的 Twitter 机器人,它发布来自我维护的 Python 模块的极客笑话。代码非常简单

import pyjokes

joke = pyjokes.get_joke()
twitter.update_status(status=joke)

我只是使用 Cron 来安排任务运行。

关注 @pyjokes_bot 以获得搞笑的单行笑话。你可以在项目网站 pyjok.es 上阅读更多关于 pyjokes 的信息,并且你可以在 GitHub 上查看 Twitter 机器人的代码。

我最近制作了另一个 Twitter 机器人,它发布 “在今天” 链接到 Raspberry Pi 基金会博客往年内容。

Raspberry Pi on this day twitter feed

opensource.com

它稍微复杂一些,因为它维护着一个包含所有历史博客文章的(单表)数据库,但机器人代码非常简单。它只是查询数据库中所有日期与当前日期的月份和日期匹配的文章,随机选择一篇,并发布年份、标题和链接

date = datetime.now().date()
month = date.month
day = date.day
posts = db.get_posts_on_date(month=month, day=day)

post = random.choice(posts)

year = int(post['year'])
title = html.unescape(post['title'])
slug = post['slug']
url = 'https://www.raspberrypi.org/blog/{}'.format(slug)

tweet = "On this day in {}: {} {}".format(year, title, url)
print('Tweeting: {}'.format(tweet))
twitter.update_status(status=tweet)

你可以关注此 feed @raspberrypi_otd 并在 GitHub 上查看机器人的代码。

User profile image.
Ben 是 BBC News Labs 的软件工程师,曾任 Raspberry Pi 的社区经理。他热衷于 Linux、Python 和所有开源事物!在 Twitter 上关注 Ben @ben_nuttall。

3 条评论

看起来第一个示例被截断了,所以无法工作。

哎呀 - 看起来好像遗漏了一点。完整的一行应该是

print("Tweeted: {}".format(message))

谢谢 - 我会把它修复好。

你好
当发布推文时,一切正常。但是当我尝试不同的操作,例如回复(不是转发而是回复)发送给我推文的人时,我的推文发布在我的时间线上,但对方没有任何反应。

twitter.update_status(username='destination', in_reply_to_status_id_str="23234234344445464556")

对方“destination”没有任何反应,他的“通知”中也没有显示任何内容。

如何自动化回复某人?请注意,我拥有他的推文 ID,

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.