介绍
Twitterbot 是与 Twitter 平台集成的程序,可自动发布、转发、喜欢或关注其他用户。 Twitterbots 可以通过提供有趣的信息或更新来证明是有用的,它们也可以很有趣或幽默。
在创建 Twitterbot 时要小心谨慎,因为不仅骚扰和垃圾邮件是不行的,而且它们会导致您的 Twitterbot 帐户因违反 Twitter 的服务条款而被暂停。 在创建 Twitterbot 之前,您应该熟悉 Twitter 的 自动化规则和最佳实践 ,以确保您的 Twitterbot 是 Twitter 社区的优秀成员。
本教程将引导您完成两个 Twitterbot 程序,一个 从文件 发推文,另一个 转发、关注和收藏 。 此外,我们将通过 将您的凭据 存储在单独的程序文件中,并 保持 Twitterbot 在服务器上运行 。 这些步骤中的每一个都是可选的,但它们是按照您执行它们的顺序呈现的。
先决条件
尽管您可以使用本地计算机来设置和运行 Twitterbot,但如果您希望它持续运行,服务器 上的 Python 编程环境将是该项目的理想选择。
此外,您应该有一个与有效电话号码关联的 Twitter 帐户,您可以通过 Settings 的 Mobile 部分添加登录。 您需要创建一个 Twitter 应用程序并安装 Python Tweepy 库,您可以按照我们的“如何创建 Twitter 应用程序”教程来完成。 在开始本教程之前,您应该准备好您的 Consumer Key、Consumer Secret、Access Token 和 Access Token Secret。
作为这个项目的一部分,我们将使用 Python 来读取文件。 要熟悉在 Python 中处理文本文件,您可以阅读我们的“如何在 Python 3 中处理纯文本文件”指南。
存储凭证
您可以将 Twitter 消费者密钥、消费者秘密、访问令牌和访问令牌秘密保留在程序文件的顶部,但为了获得最佳实践,我们应该将它们存储在一个单独的 Python 文件中,以便我们的主程序文件可以访问. 任何有权访问这些 字符串 的人都可以使用您的 Twitter 帐户,因此您不想共享这些或公开它们。 除了安全性之外,保留一个单独的文件可以让我们轻松访问我们创建的每个程序文件中的凭据。
首先,我们应该确保我们在安装了 Tweepy 库的虚拟环境中。 激活环境后,我们可以为我们的项目创建一个目录以保持其井井有条:
mkdir twitterbot cd twitterbot
接下来,让我们打开诸如 nano 的文本编辑器并创建文件 credentials.py
来存储这些凭据:
nano credentials.py
我们将为我们生成的每个密钥、秘密和令牌创建变量(如果您需要生成这些,请按照这些步骤。 将单引号中的项目替换为来自 Twitter 应用程序网站的唯一字符串(并保留单引号)。
凭据.py
consumer_key = 'your_consumer_key' consumer_secret = 'your_consumer_secret' access_token = 'your_access_token' access_token_secret = 'your_access_token_secret'
我们将在其他程序文件中调用这些变量。 创建这个单独的 credentials.py
文件还允许我们将它添加到我们的 .gitignore
文件中,以防我们计划通过 Git 发布我们的代码。
从文件中发推文的 Twitterbot
我们可以使用 Python 处理和读取文件的能力来更新我们的 Twitter 状态。 对于此示例,我们将使用已存在的文件,但您可能希望创建自己的文件或修改现有文件。
设置程序文件
让我们首先使用诸如 nano 的文本编辑器创建我们的程序文件:
nano twitterbot_textfile.py
接下来,让我们设置我们的 Twitter 凭据,方法是将它们添加到文件的顶部,或者导入我们在上面 部分 中设置的 credentials.py
文件中存储的内容。 我们还将添加 3 行以通过 Tweepy 库与凭证变量进行交互。
twitterbot_textfile.py
# Import our Twitter credentials from credentials.py from credentials import * # Access and authorize our Twitter credentials from credentials.py auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth)
要了解有关此设置的更多信息,请务必查看“如何创建 Twitter 应用程序”。 要了解有关 OAuth 的更多信息,您可以阅读我们的介绍。
获取要读取的文本文件
对于这个 Twitterbot,我们需要一个文本文件来读取,所以让我们从 Project Gutenberg 下载一个,这是一个为读者提供免费电子书(主要是公共领域)的志愿者项目。 让我们将儒勒·凡尔纳 (Jules Verne) 的 Twenty Thousand Leagues under the Sea 的英文翻译保存为名为 verne.txt
和 curl
的文件:
curl http://www.gutenberg.org/cache/epub/164/pg164.txt --output verne.txt
我们将使用 Python 的文件处理功能,首先 打开文件 ,然后 从文件 中读取行,最后 关闭文件 。
使用 Python 打开和读取文件
下载文件后,我们可以创建变量并在我们刚刚设置的行下添加相关函数以处理凭据。
twitterbot_textfile.py
from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) # Open text file verne.txt (or your chosen file) for reading my_file = open('verne.txt', 'r') # Read lines one by one from my_file and assign to file_lines variable file_lines = my_file.readlines() # Close file my_file.close()
通过此设置,我们现在可以添加代码以使这些行作为状态更新输出到我们的 Twitter 帐户。
文本文件中的推文行
将文件的行存储在变量中后,我们就可以更新我们的 Twitterbot 帐户了。
我们将使用 Tweepy 库与 Twitter API 交互,因此我们应该 将库 导入我们的程序。
我们还将以基于时间的方式自动化我们的推文,所以我们应该导入模块 time
。 出于我们的目的,我们将仅使用 sleep()
函数,因此我们将仅导入该特定方法。
twitterbot_textfile.py
# Add all import statements at top of file import tweepy from time import sleep from credentials import * ...
我们的 Twitter 帐户的状态更新将来自我们已分配给 file_lines
变量的 verne.txt
行。 这些行需要迭代,所以我们首先创建一个 for 循环。 为了确保一切正常,让我们使用 print()
函数将这些行打印出来:
twitterbot_textfile.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) my_file=open('verne.txt','r') file_lines=my_file.readlines() my_file.close() # Create a for loop to iterate over file_lines for line in file_lines: print(line)
如果此时使用命令 python twitter_textfile.py
运行程序,您将看到整个 verne.txt
文件输出到终端窗口,因为我们没有其他代码或要求它停止。
我们希望每一行都成为一条新推文,而不是在我们的终端窗口中接收输出。 为此,我们需要使用 tweepy 函数 api.update_status()
。 这用于更新经过身份验证的用户的状态,但仅在状态为以下任一情况时才会更新:1) 不重复,或 2) 140 个字符或更少。
让我们添加该函数并将 line
变量传递给它:
twitterbot_textfile.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) my_file=open('verne.txt','r') file_lines=my_file.readlines() my_file.close() for line in file_lines: print(line) api.update_status(line)
现在我们的程序设置为向我们的帐户发送推文。
异常处理和定时推文
此时有一个工作程序,如果我们运行代码,第一行将打印出来。 但是,在我们收到错误之前我们不会走太远:
Output... tweepy.error.TweepError: [{'code': 170, 'message': 'Missing required parameter: status.'}]
这是因为文件中的第二行是空白行,不能用作状态。 为了处理这个问题,我们只打印不是空行的行。 我们将添加如下所示的 if
语句:
if line != '\n':
在 Python 中,\n
是空白行的 转义字符 ,所以我们的 if
语句告诉程序,如果行不相等 (!=
) 到一个空白行,那么我们应该继续打印它。 否则,Python 应该忽略该行。 我们将在下面的上下文中查看该声明。
我们应该添加的另一件事是 sleep()
以确保这些推文不会同时全部消失。 函数 sleep()
使用以秒为单位的时间单位,因此如果我们想要在推文之间间隔一小时,我们应该将函数写为 sleep(3600)
因为一小时有 3,600 秒。
出于我们的测试目的(并且仅用于我们的测试目的),让我们使用 5 秒来代替。 一旦我们定期运行我们的 Twitterbot,我们将希望大大增加推文之间的时间。
你可以在你添加 sleep(5)
的地方玩转——我们把它放在下面的地方会导致推文之间有更多的延迟,因为即使该行是空白的也会有延迟。
twitterbot_textfile.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) my_file=open('verne.txt','r') file_lines=my_file.readlines() my_file.close() for line in file_lines: print(line) # Add if statement to ensure that blank lines are skipped if line != '\n': api.update_status(line) # Add an else statement with pass to conclude the conditional statement else: pass # Add sleep method to space tweets by 5 seconds each sleep(5)
当您此时运行程序时——如果您之前没有运行过程序——您将开始在终端上获得文件第一行的输出。 这些行也将发布到您经过身份验证的 Twitter 帐户。
但是,如果您已经运行了该程序,您可能会收到以下错误:
Outputtweepy.error.TweepError: [{'code': 187, 'message': 'Status is a duplicate.'}]
您可以通过从 Twitter 帐户中删除之前的推文或删除文件 verne.txt
的第一行并保存来解决此问题。
要阻止程序向您的 Twitter 帐户输出状态更新,请同时按住键盘上的 CTRL
(或 control
)和 C
键以中断终端中的进程窗户。
此时,您的程序可以运行,但让我们处理当状态为重复时出现的错误。 为此,我们将在代码中添加一个 try ... except
块,并让控制台打印出错误原因。
twitterbot_textfile.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) my_file=open('verne.txt','r') file_lines=my_file.readlines() my_file.close() for line in file_lines: # Add try ... except block to catch and output errors try: print(line) if line != '\n': api.update_status(line) else: pass except tweepy.TweepError as e: print(e.reason) sleep(5)
现在运行程序将处理异常,以便您可以保持程序运行。 您可以通过将 sleep(5)
函数修改为 sleep(900)
来将推文之间的时间修改为 15 分钟。
改进 Twitterbot 程序
为了继续改进您的程序,您可以考虑将其中一些代码块定义为函数,并添加额外的 sleep()
函数来处理不同的情况,如:
twitterbot_textfile.py
... # Tweet a line every 15 minutes def tweet(): for line in file_lines: try: print(line) if line != '\n': api.update_status(line) sleep(900) else: pass except tweepy.TweepError as e: print(e.reason) sleep(2) tweet()
当您继续在 Python 中处理文件时,您可以创建单独的脚本来以对您更有意义的方式对文件的行进行分块,请注意 140 个字符的推文限制。
至此,我们有了一个功能齐全的 Twitterbot,可以从源文件中发布推文。 在下一节中,我们将介绍一个可以转发、关注和收藏的替代 Twitter 机器人。 您还可以跳到 保持 Twitterbot 运行 部分。
转发、关注和收藏的 Twitterbot
通过使用 Tweepy 库,我们可以设置一个 Twitterbot,它可以转发和收藏他人的推文,以及关注其他用户。 在我们的示例中,我们将这些行为基于以主题标签的形式查询搜索词。
设置程序文件
首先,让我们创建一个名为 twitterbot_retweet.py
的 Python 文件。 我们应该将我们的凭证添加到文件的顶部,或者通过我们在 Storing Credentials[X206X ] 部分。 我们还将添加 3 行以通过 Tweepy 库与凭证变量进行交互。
twitterbot_retweet.py
# Import Tweepy, sleep, credentials.py import tweepy from time import sleep from credentials import * # Access and authorize our Twitter credentials from credentials.py auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth)
要了解有关此设置的更多信息,请务必查看“如何创建 Twitter 应用程序”。 要了解有关 OAuth 的更多信息,您可以阅读我们的介绍。
根据查询查找推文
接下来,我们将创建一个可以遍历推文的 for 循环。 我们将查看带有#ocean 标签的推文,因此我们将使用 q='#ocean'
作为参数的一部分运行该查询。 首先,让我们的终端打印出与使用 #ocean 主题标签的推文相关的用户名,然后将返回的项目(或推文)的数量限制为 10,这样我们的输出就不会持续很长时间:
# For loop to iterate over tweets with #ocean, limit to 10 for tweet in tweepy.Cursor(api.search,q='#ocean').items(10): # Print out usernames of the last 10 people to use #ocean print('Tweet by: @' + tweet.user.screen_name)
我们可以在 for 循环中添加很多额外的参数,包括:
- 使用
since
和until
的日期范围(但请注意,由于 API 的限制,推文必须不早于前一周) - 一个
geocode
将采用纬度、经度和该位置周围的给定半径(以公里为单位) - 使用
lang
并将其设置为您希望指定的语言的 2 字母 ISO 639-1 代码 的特定语言
虽然这个特定场景 实际上并没有产生任何结果 ,但让我们继续查询#ocean,然后指定两天的时间范围来检索推文,将我们的位置限制在新加坡周围 100 公里,并询问法语-语言推文。 要玩转,您应该交换每个字符串以获得对您有意义的结果。
for tweet in tweepy.Cursor(api.search, q='#ocean', since='2016-11-25', until='2016-11-27', geocode='1.3552217,103.8231561,100km', lang='fr').items(10): print('Tweet by: @' + tweet.user.screen_name)
要了解有关可以通过此函数和其他 Tweepy 函数传递的不同参数的更多信息,请参阅 Tweepy API 参考 。
对于此处的示例程序,我们将只搜索#ocean 查询。 您可以将 .items()
方法保持打开状态,但您可能会收到以下错误,因为您发出了太多请求并耗尽了资源:
Outputtweepy.error.TweepError: Twitter error response: status code = 429
所有错误代码和响应都可以通过 Tweepy API 获得。
异常处理
为了改进我们的代码,而不仅仅是打印关联的 Twitter 用户名,让我们使用 try ... except
块进行一些错误处理。 我们还将添加一个 StopIteration
异常,它将中断 for 循环。
twitterbot_retweet.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) for tweet in tweepy.Cursor(api.search, q='#ocean').items(): try: print('Tweet by: @' + tweet.user.screen_name) except tweepy.TweepError as e: print(e.reason) except StopIteration: break
现在我们可以开始告诉我们的 Twitterbot 根据收集到的数据执行一些操作。
转发、收藏和关注
我们将首先让 Twitterbot 使用 .retweet()
功能转发推文。 我们还将向终端提供我们所做工作的反馈,并添加 \n
换行符以更好地组织此输出:
twitter_retweet.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) for tweet in tweepy.Cursor(api.search, q='#ocean').items(): try: # Add \n escape character to print() to organize tweets print('\nTweet by: @' + tweet.user.screen_name) # Retweet tweets as they are found tweet.retweet() print('Retweeted the tweet') sleep(5) except tweepy.TweepError as e: print(e.reason) except StopIteration: break
在程序运行时,您应该打开浏览器以检查这些转发是否发布到您的 Twitterbot 帐户。 您的帐户应该开始被转推填充,看起来像这样:
如果您多次运行该程序,您可能会发现 Twitterbot 再次查找相同的推文,但由于 tweepy.TweepError
异常处理,您的 Twitterbot 不会转发这些推文,而是提供以下输出:
Output[{'message': 'You have already retweeted this tweet.', 'code': 327}]
我们可以添加功能让 Twitterbot 收藏找到的推文并关注生成推文的用户。 这是以与转发格式类似的语法和风格完成的。
twitterbot_retweet.py
import tweepy from time import sleep from credentials import * auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) for tweet in tweepy.Cursor(api.search, q='#ocean').items(): try: print('\nTweet by: @' + tweet.user.screen_name) tweet.retweet() print('Retweeted the tweet') # Favorite the tweet tweet.favorite() print('Favorited the tweet') # Follow the user who tweeted tweet.user.follow() print('Followed the user') sleep(5) except tweepy.TweepError as e: print(e.reason) except StopIteration: break
你可能会注意到 Tweepy 错误处理并没有考虑到已经关注的用户,所以我们可以在 .user.follow()
函数之前引入一个 if
语句:
... if not tweet.user.following: # Don't forget to indent tweet.user.follow() print('Followed the user') ...
您可以根据自己的喜好继续修改此代码,并引入更多处理各种情况的方法。
现在让我们来看看如何让这个 Twitterbot 在我们的服务器上运行。
保持 Twitterbot 运行
由于 Twitterbots 执行持续和自动化的任务,即使您的计算机处于睡眠或关闭状态,您也可能希望保持程序运行。 使用服务器,您可以根据需要保持程序运行。
对于此示例,我们将使用 twitter_retweet.py
文件,但您也可以使用 twitterbot_textfile.py
文件或您创建的任何其他 Twitterbot 文件。 确保所有关联文件在服务器的同一目录中可用。
注意: 在保持这些程序之一运行之前,最好修改您的程序,以便将更多时间用于相关的 sleep()
功能,因为您的 Twitterbot 将 24/7 运行,直到您手动运行停止它(或直到您传递给它的文本文件完成)。 回想一下,sleep()
函数以秒为参数,因此 sleep(3600)
会为你的推文每小时发生一次计时,sleep(7200)
会为你的推文每两个小时发生一次计时,等等. 您发推文的频率越高,尤其是使用给定的主题标签,您的 Twitterbot 就越有可能受到不受欢迎的关注并打扰其他用户,从而导致您的帐户被锁定。 如果您不确定如何最好地使用您的 Twitterbot,请再次参考 Twitter 的 自动化规则和最佳实践 。
为了保持我们的 Twitterbot 程序运行,我们将使用忽略挂断 (HUP) 信号的 nohup
命令。 通过使用 nohup
,通常出现在终端窗口中的输出将改为打印到名为 nohup.out
的文件中。
确保您位于可以访问 Tweepy 库的 Python 环境中,并且位于您的 Python 程序文件所在的目录中,然后键入以下命令:
nohup python twitterbot_retweet.py &
您应该收到带有括号中的数字的输出(如果这是您开始的第一个进程,则为 [1]
)和一串数字:
Output[1] 21725
此时,通过检查您帐户的 Twitter 页面来验证您的 Twitterbot 是否正在运行。 在程序进入您的 sleep()
函数之前,至少应该发布一条新推文。 如果没有新的推文,可以使用 nano 等文本编辑器查看 nohup.out
文件:
nano nohup.out
检查是否有错误并根据需要对程序进行修改,终止进程,然后再次运行 nohup
命令并检查您的 Twitter 帐户是否有新推文。
一旦您确认您的 Twitterbot 正在运行,请使用 logout
关闭与您的服务器的连接。
logout
如果您让您的进程长时间运行而不对其进行监控,并且根据您服务器的容量,nohup.out
可能会填满您的磁盘空间。 当您想要或需要时,您可以通过重新登录到您的服务器并使用 kill
命令来停止您的 Twitterbot。 您将将此命令与上面生成的数字字符串一起使用。 在我们的示例中,我们将使用 kill 21725
。 由于您可能不再方便使用该数字,您可以通过运行 ps
命令获取进程状态和 -x
标志来轻松检索数字字符串,以包括所有未连接到终端的进程:
ps -x
您应该会收到如下所示的输出:
Output PID TTY STAT TIME COMMAND 21658 ? Ss 0:00 /lib/systemd/systemd --user 21660 ? S 0:00 (sd-pam) 21725 ? S 0:02 python twitterbot_retweet.py 21764 ? S 0:00 sshd: sammy@pts/0 21765 pts/0 Ss 0:00 -bash 21782 pts/0 R+ 0:00 ps xw
你应该看到你的 Python 程序正在运行,在我们的例子中,它的 ID 是 21725,在第三行。 现在我们可以停止该过程:
kill 21725
如果再次运行命令 ps -x
,Python Twitterbot 的进程将不再存在。
结论
本教程介绍了设置和运行两个不同版本的 Twitterbot 以自动与 Twitter 社交媒体平台交互。 使用 Twitter API 和 Tweepy 之类的库可以让开发人员轻松使用 Twitter,您还可以做很多事情。
从这里,您还可以更深入地了解 Tweepy 库和 Twitter API,以创建列表、将用户添加到列表、与直接消息互动以及使用 Twitter 流式传输以实时下载推文。 你也可以考虑结合我们上面创建的两个 Twitterbot 的功能。 除了制作交互式 Twitter 机器人之外,您还可以利用 Twitter API 进行大量数据挖掘。