使用Python构建Twitter机器人
在接下来的教程中,我们将学习如何使用Python编程语言和 Tweepy 包构建我们自己的Twitter机器人,该包提供了一种高效利用Twitter应用程序编程接口(API)的方法。
Twitter被认为是最广泛采用的社交网络之一。对于许多组织和个人来说,拥有一个优秀的Twitter存在是保持受众参与的关键因素。
一个优秀的Twitter存在意味着参与一些活动,如保持活跃的帐户发布新的推文和转推,关注有趣的账户,并迅速回复关注者的消息。我们可以手动执行所有这些工作,但是这可能需要时间。相反,我们可以依赖Twitter机器人,一个自动化整个或部分Twitter活动的程序。
通过本教程结束时,我们将能够学到以下内容:
- 改进和自动化与Twitter受众的互动
- 安装 Tweepy
- 注册成为Twitter开发者以使用其API
- 利用 Tweepy 调用Twitter API
- 构建一个Twitter机器人
但在开始之前,让我们简要了解一下Twitter API。
理解Twitter API
Twitter API为开发人员提供了几乎每个Twitter功能的访问权限。我们可以利用API来读取和写入与Twitter实体相关的信息,包括推文、用户和趋势。
从技术上讲,API公开了与以下HTTP相关的各种端点:
- 推文
- 转推
- 点赞
- 收藏
- 直接消息
- 媒体
- 趋势
正如我们稍后将讨论的, Tweepy 包为调用这些HTTP端点提供了一种方法,而无需处理低级细节。
Twitter API使用OAuth,这是一种广泛使用的开放授权协议,对所有请求进行身份验证。在调用Twitter API之前,我们必须创建和配置身份验证凭据。我们将在本教程的稍后部分详细介绍这方面的说明。
我们可以利用Twitter API构建各种类型的自动化,例如机器人、分析和其他实用工具。要记住的是,Twitter对我们可以和不能使用其API构建的内容有一定的限制和政策。禁止开发利用其来发送垃圾邮件、误导用户和进行其他活动的工具。这是为了确保用户有良好的体验。
Twitter API还对我们被允许多频繁调用API方法施加速率限制。如果超过这些限制,我们将不得不等待大约5到15分钟才能再次使用API。在设计和实施机器人时,我们必须考虑到这一点,以避免不必要的等待。
关于Twitter API的政策和限制的详细信息可以在其官方文档中找到。
现在让我们了解一下 Tweepy 包。
理解Python的Tweepy包
Tweepy 是一个开源的Python包,能够以高效的方式使用Python访问Twitter API。 Tweepy 包包含一组类和方法,描述了Twitter和API端点的模型,并且透明地处理了不同的实现细节,比如:
- 数据编码和解码
- 结果分页
- HTTP请求
- OAuth认证
- 流
- 速率限制
如果我们不使用 Tweepy 包,就必须处理与HTTP请求、速率限制、认证和数据序列化相关的低级细节。整个过程可能耗时且容易出错。相反,有了 Tweepy ,我们可以专注于构建所需的功能。
通过 Tweepy ,我们几乎可以使用Twitter API提供的所有功能。截至3.7.0版本,目前唯一的限制是由于Twitter API的一些最近更改,直接消息无法正常工作。
使用Python的Tweepy包
下一节将讨论如何安装 Tweepy 包进行开发,配置认证凭据并与Twitter API进行交互。
让我们首先安装该包。
安装
我们可以使用pip,一个Python包管理器,来安装 Tweepy 包。在下一节中,我们将使用虚拟环境( virtualenv )来进行项目,并避免依赖于系统范围的包。
我们可以创建一个名为 tweepyBots 的项目。首先要做的是创建一个目录和一个虚拟环境,我们可以考虑以下语法:
语法:
$ mkdir tweepyBots
$ cd tweepyBots
$ python3 -m venv tweepyEnv
以上命令将在项目目录中创建虚拟环境。
然后我们可以安装 Tweepy 包。首先,我们必须激活新创建的虚拟环境,然后使用pip安装程序进行安装。
语法:
$ path_to_the_tweepyEv_directory ./script/activate.bat
$ pip install tweepy
现在,已经安装了 Tweepy 包,让我们创建一个 requirements.txt 文件,其中包含依赖库的名称。我们可以使用 pip 命令 freeze 来完成此任务,如下所示:
语法:
$ pip freeze > requirements.txt
我们将在部署项目时使用这个requirements.txt文件。
创建Twitter API身份验证凭证
正如我们先前讨论的那样,Twitter API要求所有请求使用OAuth进行身份验证。因此,我们需要创建所需的身份验证凭证才能使用API。这些凭证是四个文本字符串:
- 消费者密钥
- 消费者密钥密钥
- 访问令牌
- 访问令牌密钥
如果我们已经有一个Twitter用户帐户,请按照以下步骤创建密钥、令牌和密钥。否则,在继续之前,我们需要注册一个Twitter用户。
步骤1: 申请Twitter开发者帐户
步骤2: 创建应用程序
步骤3: 创建身份验证凭证
申请Twitter开发者帐户
首先,我们必须访问Twitter开发者网站以申请开发者帐户。该网站的链接如下:
https://developer.twitter.com/en
这里,我们需要选择负责此帐户的Twitter用户。它必须是我们的组织或者我们自己。
然后,Twitter将要求我们提供有关如何使用开发者帐户的一些细节。
然后,我们需要指定开发者帐户的名称以及我们是否计划将其用于个人使用或组织。
创建应用程序
Twitter授予应用程序身份验证凭证,而不是帐户。应用程序可以是任何使用Twitter API的实用工具或机器人。因此,我们必须注册应用程序以便能够进行API调用。
我们必须转到Twitter应用程序页面注册应用程序,并选择“创建应用程序”选项。
然后,我们将提供与应用程序及其用途相关的以下详细信息:
- 应用程序名称: 这个信息将用作标识应用程序的名称(例如,testbot)
- 应用程序描述: 这个信息将用作应用程序的目的(例如,测试机器人,以了解tweepy)
- 应用程序的网站URL: 这个信息是必需的;但是,由于机器人不需要URL来运行,我们可以使用一些个人网站的URL。
- 应用程序的用途: 这个信息说明用户将如何使用应用程序(例如,该应用程序是一个自动回复用户的机器人)
创建身份验证凭证
我们可以转到Twitter应用程序页面创建身份验证凭证。在那里,我们会找到应用程序的详细信息按钮。点击此按钮后,我们将进入下一页,在那里我们可以生成凭证。
通过选择“键和令牌”选项卡,我们可以生成并复制密钥、令牌和密钥,在代码中使用它们。完成生成凭证后,我们可以保存它们以备后续使用。
我们可以用以下代码片段测试凭据:
示例:
# importing the required library
import tweepy
# Authenticating to Twitter
authCreds = tweepy.OAuthHandler("pGBDoAaEpkuiVKBOLwjtcmHGc",
"xF3g1wrP50b6BlZEd20u4oVfjgH1FGQcuSUzlQO5aUWOufvlhw")
authCreds.set_access_token("642518493-6VcLIQprbQbv9wkcBBPvCle8vsjU9fE85Dq9oStl",
"tH9aKQbQQ1iRdYTcLSsPwitl44BkAc6jikrsU0ifnXvZhq")
# creating an object of the API class
apiObj = tweepy.API(authCreds)
# verifying credentials
try:
apiObj.verify_credentials()
print("Authentication Successful")
except:
print("Error raised during authentication")
****解释:** **
在上面的代码片段中,我们导入了所需的包。我们创建了 OAuthHandler 类的对象来验证Twitter上的认证。然后,我们创建了API类的对象。之后,我们使用 try-except 方法,在其中使用 verify_credentials() 函数并打印一些关于它的陈述。如果一切顺利,我们应该看到一条消息说“认证成功”。
注意:本文中使用的所有凭据仅用于理解,将无法使用。我们需要生成并使用我们自己的凭据。
Tweepy功能的回顾
Tweepy为其用户提供一个接口,以便从Python编程语言中访问Twitter API。它通过封装Twitter API的大部分复杂性,并在其上添加模型层和一些实用功能来实现这一目的。
由于随着时间的推移,Twitter的不同概念的名称发生了变化,一些旧名称仍在使用 Tweepy 因此,最好记住,在本教程的上下文中,这些等价性成立:
- 状态被称为推文。
- 关注关系被认为是关注者关系。
- 收藏等同于点赞。
既然我们知道了 Tweepy 如何命名事物,让我们了解它的工作原理。
我们可以将 Tweepy 的功能分为以下几个组:
- OAuth
- API类
- 模型
- 游标
- 流
现在我们要研究这些组,以了解它们各自提供的功能。
理解OAuth
Tweepy包负责使用OAuth所需的所有信息,以验证Twitter API的每个请求。它提供了一个 OAuthHandler 类,我们可以在所有API调用中使用它来设置凭据。
以下代码片段示例了如何创建一个 OAuthHandler 对象,我们稍后可以在API调用中使用它:
示例:
# importing the required package
import tweepy
# Authenticating to Twitter
authCreds = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET")
authCreds.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET")
解释:
在上面的代码片段中,我们导入了所需的包。然后,我们创建了一个 OAuthHandler 类的对象,指定消费者密钥和消费者密钥作为其参数,并使用 set_access_token() 函数来提供访问令牌及其密钥以进行Twitter的身份验证。
在这里,我们告诉 Tweepy 使用我们在步骤3中创建的凭据。必须用之前生成的值重新设置 CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN 和 ACCESS_TOKEN_SECRET 。
了解API类
API类包含多个方法,可以访问Twitter API端点的功能。借助这些方法,我们可以访问Twitter API的功能。
让我们考虑以下代码片段,演示了创建一个API对象的过程,我们可以使用它来调用Twitter API。我们还将设置 wait_on_rate_limit 和 wait_on_rate_limit_notify 参数为True,以确保API对象在超过速率限制时打印消息并等待:
示例:
# importing the required package
import tweepy
# Authenticating to Twitter
authCreds = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET")
authCreds.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET")
# Creating an object of the API class
apiObj = tweepy.API(
authCreds,
wait_on_rate_limit = True,
wait_on_rate_limit_notify = True
)
解释:
在上面的代码片段中,我们设置了身份验证凭据并创建了一个API对象。我们可以调用该对象的方法来执行任何API调用。
API的方法可以分为以下几类:
- 用户时间线方法
- 推文方法
- 用户方法
- 关注者方法
- 账户方法
- 喜欢方法
- 屏蔽用户方法
- 搜索方法
- 趋势方法
- 流式方法
在接下来的小节中,我们将审核各种API方法的分组。我们可以访问API类的完整文档以获取所有API方法的详细列表。
用户时间线方法
这些方法用于从时间线或任何其他公共用户的时间线读取推文、提及和转发。
让我们来看下面的代码片段,它打印出主页时间线中最后一条推文的作者和文本:
示例:
# using the home_timeline() method
time_line = apiObj.home_timeline()
for the_tweet in time_line:
print(f"{the_tweet.user.name} said {the_tweet.text}")
说明:
在上面的代码片段中,我们使用了API类中的home_timeline()方法。此方法用于获取时间线中的最新20条记录。在Tweepy包中,默认值为20。稍后我们将看到如何获取超过20个结果并处理分页结果。
推文方法
这些方法用于创建、获取和转发推文。让我们考虑下面的代码片段,演示了在创建带有一些文本的推文时使用Tweepy包的示例:
示例:
# using the update_status() method
apiObj.update_status("This is a test tweet to learn Tweepy Python")
解释:
在上面的代码片段中,我们使用了 update_status() 方法来创建一个新的推文,其内容为一个Python字符串。
用户方法
该组的方法允许我们使用筛选条件搜索用户,获取用户的详细信息,并列出任何用户的粉丝(如果该用户的帐户是公开的)。
让我们考虑下面的代码片段,以获取用户的详细信息,并打印出该用户最近的20个粉丝:
示例:
# using the get_user() method
the_user = apiObj.get_user("Name of some user")
# printing the details of the user like name, description, location
print("Details of the User:")
print(the_user.name)
print(the_user.description)
print(the_user.location)
# printing the last 20 followers of the user
print("Last 20 Followers of the User:")
for the_follower in the_user.followers():
print(the_follower.name)
说明:
在上面的代码片段中,我们使用了 get_user() 方法,它返回一个包含用户详细信息的对象。返回的对象还有一些方法用于访问与用户相关的信息。然后,我们使用 followers 属性获取粉丝列表并打印他们的名字。
粉丝的方法
这组方法用于关注和取消关注用户,查询用户的粉丝列表以及列出任何用户正在关注的账户。
让我们来看一下下面的代码片段,展示了如何使用 Tweepy 来开始关注一些用户。
示例:
# using the create_friendship() method
apiObj.create_friendship("user_name")
说明:
在以上代码片段中,我们使用了 create_friendship() 方法将用户添加到我们关注的账户列表中。
账户的方法
这些方法使我们能够读取和写入自己的个人资料。
让我们看下面的代码片段,展示了如何更新我们的个人资料描述:
示例:
# using the update_profile() method
apiObj.update_profile(description = "Welcome to javatpoint.com")
解释:
在上面的代码片段中,我们使用了 update_profile() 方法,在这个方法中我们通过传递 description 参数来修改个人资料描述为” Welcome to javatpoint.com “。
流式处理的方法
流式处理允许我们实时地匹配特定条件的推文。这意味着当没有新的推文满足条件时,程序将等待直到有新的推文创建并处理。
我们需要创建两个对象来使用流式处理:
- stream对象 利用Twitter API获取满足一些条件的推文。这个对象是由 stream监听器 处理的推文的来源。
- stream监听器 从流中接收推文。
让我们来看下面的代码片段来演示这一点:
示例:
# importing the required modules
import json
import tweepy
# defining a Class
class TheStreamListener(tweepy.StreamListener):
def __init__(self, api):
self.api = api
self.me = api.me()
def onStatus(self, tweet):
print(f"{tweet.user.name}:{tweet.text}")
def onError(self, status):
print("Error detected")
# Authenticating to Twitter
the_auth = tweepy.OAuthHandler("CONSUMER_KEY", "CONSUMER_SECRET")
the_auth.set_access_token("ACCESS_TOKEN", "ACCESS_TOKEN_SECRET")
# Creating API object
the_api = tweepy.API(
the_auth, wait_on_rate_limit = True,
wait_on_rate_limit_notify = True
)
tweetsListener = TheStreamListener(the_api)
the_stream = tweepy.Stream(the_api.auth, tweetsListener)
the_stream.filter(track = ["Python", "Django", "Tweepy"], languages = ["en"])
说明:
在上面的代码片段中,我们导入了所需的模块并创建了一个类 StreamListener 。这个类用于流监听器 tweetsListener 。通过扩展 Tweepy 包的 StreamListener ,我们重用了所有流监听器的通用代码。流中的推文通过 onStatus() 函数进行处理。
我们通过使用 tweepy.Stream ,传递身份验证凭据和流监听器来创建流。我们必须调用 filter() 函数从流中获取推文,并通过过滤推文传递标准。然后,对于与标准匹配的每个新推文,流对象会调用流监听器的 onStatus() 函数。
模型
Tweepy 使用其模型类封装来自不同Twitter API方法的响应。这为我们提供了一种方便的方法来使用API操作的输出。
模型类如下:
- User
- Status
- Friendship
- SearchResults
让我们考虑一个示例,我们需要获取提到我们的每个推文,然后将每个推文标记为喜欢并关注其作者:
示例:
# using the mentions_timeline() method
the_tweets = apiObj.mentions_timeline()
for the_tweet in the_tweets:
the_tweet.favorite()
the_tweet.user.follow()
解释:
在上面的代码片段中,我们使用Status类的mentions_timeline()方法返回一个推特对象。然后我们使用favorite()方法将其标记为喜欢。接着我们使用user属性以及follow()方法将推特的作者添加到我们关注的人列表中。
利用Tweepy模型可以编写简洁易懂的代码。
光标
很多Twitter API端点使用分页来返回输出。默认情况下,每个方法返回第一页,通常包含几十个元素。
Tweepy 光标简化了处理分页输出的复杂性。光标是一个Tweepy类,名为Cursor。光标对象会自动处理不同结果页面的获取。我们可以通过选择API方法来获取项目以及我们想要的项目数量来使用光标。
让我们看下以下代码片段,它说明了如何通过光标获取时间线的第一页和最后一百条推文。
示例:
# using the Cursor method
for the_tweet in tweepy.Cursor(apiObj.home_timeline).items(100):
print(f"{the_tweet.user.name} said: {the_tweet.text}")
说明:
在上面的代码片段中,我们使用 tweepy.Cursor 创建了一个cursor对象。类构造函数接收一个API方法作为结果的来源。在上面的示例中,我们使用 home_timeline() 函数作为来源,因为我们想要从时间线上获取推文。cursor对象有一个 items() 方法,它返回一个迭代器,我们可以使用它来迭代结果。我们可以向 items() 传递要获取的结果项的数量。
使用Tweepy在Python中创建一个Twitter机器人
现在我们已经了解了 Tweepy 的工作原理,让我们看看如何使用 Tweepy 在Python中创建一个Twitter机器人。机器人通过不断地观察一些Twitter活动并自动对其做出反应来工作。
观察Twitter活动
有两种持续观察Twitter活动的方法:
- 使用流: 在创建符合特定条件的新内容(如推文)时通知
- 使用轮询: 定期进行 Tweepy API调用,然后检查结果以查看是否包含了新内容
选择哪种选项取决于具体情况。使用流是最有效的选项,但我们只能观察与推文相关的活动,所以它的灵活性较低。在接下来的部分中,我们将只使用一种选项来构建一个机器人。
关注粉丝机器人
我们将在接下来的部分学习如何构建一个关注粉丝机器人,该机器人会自动关注关注我们的人。该机器人每分钟从Twitter获取粉丝列表,然后遍历列表以关注我们尚未关注的每个用户。
让我们考虑以下演示相同内容的源代码。
示例:
# importing the required libraries
import tweepy
import logging
import os
import time
logging.basicConfig(level = logging.INFO)
logger = logging.getLogger()
# defining the createApi() function
def createApi():
consumerKey = os.getenv("CONSUMER_KEY")
consumerSecret = os.getenv("CONSUMER_SECRET")
accessToken = os.getenv("ACCESS_TOKEN")
accessTokenSecret = os.getenv("ACCESS_TOKEN_SECRET")
the_auth = tweepy.OAuthHandler(consumerKey, consumerSecret)
the_auth.set_access_token(accessToken, accessTokenSecret)
api = tweepy.API(
the_auth,
wait_on_rate_limit = True,
wait_on_rate_limit_notify = True
)
try:
api.verify_credentials()
except Exception as e:
logger.error("Error creating API", exc_info = True)
raise e
logger.info("API created")
return api
# defining the followFollowers() function
def followFollowers(the_api):
logger.info("Retrieving and following followers")
for the_follower in tweepy.Cursor(the_api.followers).items():
if not the_follower.following:
logger.info(f"Following {the_follower.name}")
the_follower.follow()
# defining the main() function
def main():
the_api = createApi()
while True:
followFollowers(the_api)
logger.info("Waiting...")
time.sleep(60)
if __name__ == "__main__":
main()
解释:
在上面的代码片段中,我们导入了所需的库。然后我们定义了一个名为 createApi() 的函数,该函数从环境变量中读取身份验证凭据并创建 Tweepy API对象。这些凭据包括:
- CONSUMER_KEY
- CONSUMER_SECRET
- ACCESS_TOKEN
- ACCESS_TOKEN_SECRET
该函数使用 os.getenv() 函数读取环境变量,然后创建 Tweepy 认证对象 the_auth 。然后创建API对象。
接下来我们在创建 tweepy.API 对象时传入了 wait_on_rate_limit 和 wait_on_rate_limit_notify 参数,使 Tweepy 在达到请求限制时等待并打印一条消息。
在返回API对象之前, createApi() 函数调用 verify_credentials() 方法来检查有效的凭据。
可以看到我们还使用了 logging Python模块来通知错误和信息消息,以便在出现任何问题时帮助我们调试。
我们还定义了一个名为 main() 的函数,该函数使用 createApi() 函数创建一个 Tweepy API对象,并在循环中每分钟调用一次 followFollowers() 函数。
我们还定义了一个名为 followFollowers() 的函数,该函数使用 Tweepy 游标和 Tweepy API方法 followers() 来获取关注者列表。该列表包含每个关注我们的用户的 Tweepy 用户模型。
然后机器人通过列表迭代,并使用 following 属性检查我们是否已经关注了每个用户。尚未关注的用户将使用 follow() 函数进行关注。
机器人的执行
我们首先需要为身份验证凭据创建环境变量。我们可以通过使用实际凭据替换值来执行此操作。
一旦设置了包含使用Twitter API所需的凭据的环境变量,我们需要激活虚拟环境并执行Python项目文件。
语法:
$ path_to_the_tweepyEv_directory ./script/activate.bat
$ python followFollowersBot.py
当它正在执行时,机器人将跟随任何关注我们的人。我们可以通过取消关注一个正在关注我们的人来测试它是否起作用。一分钟后,他们将再次被关注。我们可以使用 Ctrl + C 停止机器人。