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 账户。不要与任何人分享这些密钥,因为它们可以在没有账户密码的情况下使用。如果你在线分享你的代码,请确保你不包含这些密钥。

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!”。

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。
物理组件

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()

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 基金会博客往年内容。

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 上查看机器人的代码。
3 条评论