Twitter是一个很棒的交流和社交媒体平台。 它拥有一切:突发新闻,政治见解,幽默,名人,娱乐,特殊兴趣聊天等等。 个人,公司,部门,项目等(实际上是任何人或任何东西)都可以拥有Twitter帐户。 某些Twitter帐户甚至不是由一个人或一群人手动运行的,它们是自动机器人。
使用Python编写Twitter机器人非常简单,而Raspberry Pi是运行代码的理想工具。 而不是让PC或笔记本电脑永久打开,您可以使Raspberry Pi以24/7的速度运行,几乎不使用任何电源。 就是说,如果您没有Raspberry Pi,则本教程中的大部分内容仍然可以在PC上使用。
Twitter API入门
Twitter是提供应用程序编程接口(API)的Web服务,这意味着您可以编写与实时Twitter服务通信的软件-可能实时读取tweet或自动发布tweet。
该API是免费的,但是您必须拥有一个Twitter帐户并注册您的应用程序才能访问该API,但这很容易。
首先转到apps.twitter.com 。 通过填写必填字段来创建新应用-确保在应用权限下选择“ 读取”和“写入 ”。 这将生成使用者密钥 , 使用者密钥 , 访问令牌和访问令牌密钥 。 您需要这四个键才能从Python代码连接到您的Twitter帐户。 请勿与任何人共享这些密钥,因为无需帐户密码即可使用它们。 如果您在线共享代码,请确保不包括这些密钥 。
要从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!” 从您的帐户。
如果出现错误,请检查API密钥是否正确复制。
现在尝试为您的程序添加一些随机性。 在顶部添加随机模块:
import random
添加消息列表,然后随机选择一个:
messages
=
[
"Hi Twitter"
,
"Hello from Python"
,
"Hello from my Raspberry Pi"
,
"I'm a bot"
,
]
然后更改您的代码以在发推文之前从列表中选择一条随机消息:
message = random . choice ( messages )
您可能还想尝试在Twitter上发布图片:
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
)
阅读推特
除了使用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方法中。 数据是包含推文和大量元数据的字典。 在这里,我们只打印了推文内容。 您可以使其保持运行状态,并且每当有一条新的推文与搜索匹配时,它将运行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关于将Twitter API与Python结合使用的学习指南。
如果您希望Twitter机器人代码以24/7运行,您可以将其安装在Web服务器上,也可以在家里的Raspberry Pi上运行,甚至可以使用托管的Raspberry Pi 。
物理组成
使用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显示屏上滚动推文:
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零启动程序项目以及Sense HAT 入门的文章。 您还可以通过遵循Raspberry Pi学习资源上的Tweeting Babbage教程,制作一个Twitter Raspberry Pi相机项目。
真正的Twitter机器人
不久前,我创建了一个名为pyjokes的Twitter机器人,从我维护的Python模块中发布了令人讨厌的笑话。 该代码非常简单:
import pyjokes
joke
= pyjokes.
get_joke
(
)
twitter.
update_status
( status
= joke
)
我只是使用Cron安排任务运行。
跟随@pyjokes_bot获得有趣的单线 。 你可以阅读更多关于该项目的网站pyjokes pyjok.es ,你可以看到代码为Twitter的僵尸在GitHub上 。
我最近制作了另一个Twitter机器人, 该机器人在推特上发布了“ 今天 ”链接到Raspberry Pi Foundation博客前几年内容的链接。
它稍微复杂一点,因为它维护着所有历史博客文章的(单表)数据库,但是bot代码非常简单。 它只是在数据库中查询日期与当前日期的月份和日期相匹配的所有帖子,随机选择一个,然后发布年份,标题和链接:
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
)
您可以按照此提要@raspberrypi_otd并在GitHub上查看该机器人的代码。
翻译自: https://opensource.com/article/17/8/raspberry-pi-twitter-bot