如何使用 Python 和 Heroku 设置 Twitter 机器人
我刚刚搭建了一个 Twitter 机器人,用来生成药品广告,每天发几条推文。(源代码在这里)。为了实现这个功能,我把几个不同的教程里的概念拼凑起来,但没有一个教程能完整地讲解整个流程,所以我就把它写在这里了。
步骤可以概括如下:
- 编写一个函数来生成文本字符串,供你的机器人发推文
- 创建一个Twitter 帐户,并在其下 设置一个应用程序
- 使用 Google Voice 设置电话号码
- 为您的帐户分配该电话号码,以便您创建应用程序
- 编写一个连接到 Twitter 应用程序的脚本,并向其发送 API 调用,以发布步骤 1 中函数的输出
- 设置一个Heroku 应用,以工作者身份运行步骤 3 中的函数
- 在 Heroku 应用中设置一个基本服务器,这样 Heroku 就不会崩溃并抛出错误
- 在 Heroku 中为您的 Twitter 应用程序凭据设置环境变量。
步骤 4 到 6 也可用于设置在 Heroku 上运行的任何 Python 脚本。
我正在使用一些 Google 功能为 Twitter 帐户生成唯一的电子邮件和电话号码,但您可以使用您喜欢的任何服务来创建这些内容。
本文假设您具备以下概念的一些基本背景知识:Python、REST API、Git、环境变量。
因为它使用 Heroku,所以应用程序必须保存在 Git 存储库中。
此外,我使用了虚拟环境,并通过运行将需求保存在文件中
$ pip freeze > requirements.txt
当您设置 Heroku 时,这会变得相关,它用于requirements.txt
安装您需要的 Python 包。
1. 生成字符串
我之前就实现了这个功能。对于制药机器人,我使用马尔可夫链生成药品名称,然后将其插入到随机生成的模板中,这样就能得到如下广告:
担心听小骨抽搐?Sudate® 可以帮助您!
您是否正饱受肘部不适的困扰?今天就向您的医生咨询Estron®吧!
您无需独自应对脾脏肥大。立即咨询医生,了解 Ryzema Prenztriumetine® 的功效!
创建这些的函数称为get_ad
。
在您自己的代码中,get_ad
用生成您喜欢的任何类型文本的函数进行替换。
2. 创建 Twitter 应用
您可能希望为机器人提供自己的帐户,而不是从现有帐户发推文,因此请设置一个。
Twitter 帐户需要一个唯一的电子邮件地址。如果您想使用已有 Twitter 帐户的电子邮件地址,可以利用 Gmail 的功能,注册一个“备用”电子邮件地址,该电子邮件地址会发送到同一个收件箱。
您还需要在应用中设置一个电话号码;同样,您可以使用 Google 创建一个连接到现有号码的备用联系人,这次使用Google Voice。
接下来,转到您的 Twitter 应用信息中心并创建一个新应用(以机器人帐户登录)。
对于应用程序的网站,我放置了该项目存储库所在的 GitHub URL。
创建应用程序后,请确保它允许读写访问。
3. 连接到 Twitter App 并发送推文
我参考了这篇文章《如何使用 Python 和 tweepy 编写 Twitter 机器人》作为这部分的粗略指南。您可以参考这篇文章,了解如何设置 Twitter 应用并通过 API 连接到它。需要注意的是,您需要在 Twitter 应用中添加一个“访问密钥”。
他们的机器人会从文本文件中读取内容;而我的机器人则调用get_ad
。执行此操作的脚本名为bot.py。以下是生成并发送推文的部分:
from generate_advertisement import get_ad
INTERVAL = 60 * 60 * 6 # tweet every 6 hours
# INTERVAL = 15 # every 15 seconds, for testing
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
while True:
print("about to get ad...")
ad = get_ad()
api.update_status(ad)
time.sleep(INTERVAL)
然后我bot.py
在本地终端运行。
成功!
它能够正常发送推文,但我不想让我的笔记本电脑和终端一直开着,所以我需要把它放在一个独立的服务器上运行。我的下一个任务是把这个机器人放到 Heroku 上。
重要提示:不要提交你的密钥
通过 API(包括通过类似 的包装器库tweepy
)连接到 Twitter 需要您使用密钥来标识您的应用并验证您的用户身份。请确保不要将这些密钥提交到 Git 代码库中——这相当于公开您的密码。即使您之后从代码中删除了这些密钥,它们仍然会保留在您的提交历史记录中。
最初,我将密钥存储在一个名为的文件中credentials.py
,并将其添加到我的 中.gitignore
。它看起来像这样:
CONSUMER_KEY = 'consumer key'
CONSUMER_SECRET = 'consumer secret'
ACCESS_KEY = 'access key'
ACCESS_SECRET = 'access secret'
然后我将密钥导入bot.py
。当我将应用程序放到 Heroku 上时,这并没有奏效,但在我本地机器上测试它是没问题的。
4. 设置 Heroku
如果您还没有Heroku 帐户,请注册一个。Heroku 允许您使用 Git 推送和部署代码,并且您可以免费创建最多 5 个应用。
安装Heroku 命令行界面后,请使用 Heroku 初始化您的代码库。您可以让它为您的应用生成一个随机 URL,因为没有人会直接查看它。
$ heroku create
这将设置一个 Heroku 应用,并为您的 Git 仓库提供一个名为 的远程仓库heroku
。该远程仓库分支上的代码master
将由 Heroku 运行。
你需要设置一个配置文件,Procfile
告诉 Heroku 在获取到你的代码后该做什么。请将以下配置文件放入你的Procfile
配置文件中:
worker: python bot.py
python bot.py
这意味着 Heroku 将执行与您在本地终端上运行的操作相同的操作。
然后提交您的代码并将其推送到 Heroku。
从本地分支部署master
:
$ git push heroku master
要从不同的分支部署:
$ git push heroku my_branch_name:master
然后,您可以登录 Heroku 仪表板并检查其活动和日志以查看发生了什么。
5. 基本 Web 服务器
事实证明,Heroku 并不喜欢仅仅使用工作人员运行脚本,因为它希望看到一个 Web 服务器。
你可以通过创建一个简单的 Web 服务器来解决这个问题。我参考了StackOverflow 上的这个答案。
代码(server.py):
from os import environ
from flask import Flask
app = Flask(__name__)
app.run(environ.get('PORT'))
然后,在您的 Procfile 中,只需说:web:python server.py。
我尝试了这个(并再次提交并推送到 Heroku)。然后我看到了以下错误:
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch python flask
我在运行应用程序时通过设置主机解决了这个问题:
app.run(host= '0.0.0.0', port=environ.get('PORT'))
6.设置环境变量
还记得我说过不要将你的 Twitter 凭证提交到你的 Git 仓库吗?当你部署到 Heroku 时,这就会成为一个问题,因为它使用你的 Git 仓库进行部署,因此从被忽略的文件中导入常量将不起作用。
您可以在 Heroku 仪表板中设置环境变量,然后在 Python 中使用它来获取它们。在进行 API 调用之前os.environ
添加以下内容:bot.py
from os import environ
CONSUMER_KEY = environ['CONSUMER_KEY']
CONSUMER_SECRET = environ['CONSUMER_SECRET']
ACCESS_KEY = environ['ACCESS_KEY']
ACCESS_SECRET = environ['ACCESS_SECRET']
然后,您的应用程序将能够连接到 Twitter API,而无需提交您的秘密。
下一步是什么?
现在您知道如何创建 Twitter 机器人并在 Heroku 上运行它!
您可以调整此项目以发布任何您喜欢的推文。本文介绍如何使用 Python 生成包含马尔可夫链的文本。您可以创建一个文本文件,每行包含一个您想要发布的句子,方法参见“如何使用 Python 和 tweepy 编写 Twitter 机器人” 。您还可以发布来自古腾堡计划 (Project Gutenberg)公共领域作品的推文。或者,做任何您想做的事情!
注:本文早期版本已发布于emcain.github.io。
文章来源:https://dev.to/emcain/how-to-set-up-a-twitter-bot-with-python-and-heroku-1n39