如何使用Python 3和Tweepy库创建Twitterbot

介绍

Twitterbot是一个与Twitter平台集成的程序,自动发布,转发,喜欢或关注其他用户。通过提供有趣的信息或更新,Twitterbots可以证明是有用的,他们也可以是有趣或幽默。 在创建TwitterBot时要小心,因为不仅骚扰和垃圾邮件不行,而且它们会导致您的Twitterbot的帐户因违反Twitter的服务条款而被暂停。在此之前创建Twitterbot,你应该熟悉Twitter的 自动化规则和最佳实践 ,以确保您Twitterbot是Twitter社区的一个好成员。 本教程将引导您通过两个Twitterbot节目,一个 从文件中tweets ,另一个 retweets, follows, 和 favorites 。 此外,我们将通过 存储您的凭证在一个单独的程序文件,并 保存在服务器上运行Twitterbot 。每个步骤都是可选的,但是它们按照您执行的顺序显示。

先决条件

虽然可以使用本地计算机设置和运行Twitterbot,如果你想它可以连续运行,一个 服务器上的Python编程环境将是理想的项目。 此外,你应该有一个 Twitter的是与一个有效的电话号码,您可以通过添加相关的帐户 Mobile ,当你已经登录你 设置的部分。你需要创建一个Twitter的应用程序,并安装Python Tweepy库,您可以按照“做 如何创建一个Twitter的应用程序 ”教程。在开始本教程之前,您应该拥有您的Consumer Key,Consumer Secret,Access Token和Access Token Secret。 作为这个项目的一部分,我们将使用Python来读取文件。要使用Python中处理文本文件,熟悉,您可以阅读我们“ 如何处理纯文本文件在Python 3指南

存储凭据

您可以在程序文件的顶部保留您的Twitter Consumer Key,Consumer Secret,Access Token和Access Token Secret,但是为了获得最佳实践,我们应该将它们存储在我们的主程序文件可以访问的单独的Python文件中。任何有权访问这些字符串的人都可以使用您的Twitter帐户,因此您不想共享这些字符或将其公开。除了安全性,保持单独的文件可以允许我们轻松访问我们创建的每个程序文件中的凭据。 首先,我们应该确保我们在我们的虚拟环境中安装了Tweepy库。随着环境激活,我们可以为我们的项目创建一个目录,以保持其组织:
mkdir twitterbot
cd twitterbot
接下来,让我们打开一个文本编辑器如纳米和创建文件 credentials.py存储这些凭据:
nano credentials.py
我们会为每个键,秘密创建变量和令牌,我们生成的(如果你需要生成的,请按照 下列步骤操作 。你从Twitter的应用程序的网站唯一的字符串替换单引号的项目(并保持单引号) 。
credentials.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
接下来,让我们通过他们要么加入到我们文件的顶部,或导入我们已经存储在建立我们的微博凭据 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下载一个,该项目是一个志愿者项目,向读者提供免费电子书(大部分是在公共领域)。让我们节省翻译成英文 在海第二十千载儒勒凡尔纳为一个名为 verne.txtcurl
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帐户的状态更新将会从线路是未来从 verne.txt我们已经分配给 file_lines变量。 这些行需要迭代,所以我们将从创建一个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文件输出到终端窗口,因为我们没有其他的代码,或致电其停止。 而不是在我们的终端窗口接收输出,我们希望每一行都成为一个新的tweet。为了实现这一目标,我们需要使用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)
现在我们的程序设置为tweet线路到我们的帐户。

异常处理和计时推文

有了一个工作程序,在这一点上,如果我们运行代码,第一行将打印。但是,我们不会得到远在我们收到错误之前:
Output...
tweepy.error.TweepError: [{'code': 170, 'message': 'Missing required parameter: status.'}]
这是因为文件中的第二行是空白行,不能用作状态。为了处理这个问题,让我们只打印一行,如果它不是一个空行。我们将添加一个 if语句如下:
if line != '\n':
在Python中, \n转义字符为空行,所以我们 if声明中说的是程序,如果该行不等于( != ),以一个空行,那么我们就应该继续并打印。否则,Python应该忽略该行。我们将在下面的语境中查看语句。 我们应该增加一个就是 sleep()以确保这些鸣叫不全力以赴一次。 函数 sleep()的工作原理与秒计的时间单位的措施,因此,如果我们想鸣叫之间小时,我们应该写函数为 sleep(3600)因为有3600秒在一个小时。 为了我们的测试目的(仅用于我们的测试目的),让我们使用5秒。一旦我们定期运行我们的Twitterbot,我们将大大增加tweet之间的时间。 你可以玩弄在其中添加 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)
运行程序现在将处理异常,以便您可以保持程序运行。您可以修改,比方说有15分钟的鸣叫之间的时间,通过修改 sleep(5)函数来 sleep(900)

改进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个字符的tweet限制。 在这一点上,我们有一个功能齐全的Twitterbot从源文件tweets。在下一节中,我们将讨论另一个Twitterbot,它转发,跟随和收藏。您也可以直接跳到节上 保持Twitterbot运行

Twitterbot,Retweets,Follows和收藏

通过使用Tweepy库,我们可以设置一个Twitterbot,可以转发和收藏他人的tweets,以及跟随其他用户。在我们的示例中,我们将基于这些行为以主题标签的形式查询搜索词。

设置程序文件

首先,让我们创建一个名为Python文件 twitterbot_retweet.py 。 我们应该要么添加我们的凭据到文件的顶部,或通过添加我们的import语句,并获得我们的每一个键,秘密和令牌 credentials.py我们在创建的文件 存储凭据部分之上。我们还将添加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的,你可以阅读 我们的介绍

基于查询查找推文

接下来,我们将创建一个可以在tweet上进行迭代的for循环。我们将着眼于具有包括hashtag鸣叫#ocean,所以我们将用 q='#ocean'来运行查询作为参数,我们的一部分。首先,让我们的终端打印出与使用#ocean主题标签的tweet相关联的用户名,然后将项目(或tweet)的数量限制为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循环,包括:
  • 使用日期范围sinceuntil (但请注意,由于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异常将打破循环。
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帐户。您的帐户应该开始通过转发填充,看起来像这样: Twitter帐户显示Retweets 如果你运行程序几次,你可能会发现Twitterbot再次找到相同的微博,但由于 tweepy.TweepError异常处理,你Twitterbot不会转推这些,而是提供以下的输出:
Output[{'message': 'You have already retweeted this tweet.', 'code': 327}]
我们可以添加功能,让Twitterbot喜欢发现的tweet,并跟随生成tweet的用户。这是以与转发格式类似的语法和样式完成的。
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错误处理不占下了已经遵循的用户,所以我们可以引入一个 if在之前的语句 .user.follow()函数:
...
        if not tweet.user.following:
            # Don't forget to indent
            tweet.user.follow()
            print('Followed the user')
...
您可以根据自己的喜好继续修改此代码,并介绍更多方法来处理各种情况。 现在让我们进入如何保持这个Twitterbot在我们的服务器上运行。

保持Twitterbot运行

因为TwitterBot会执行持续的和自动化的任务,您可能希望保持程序运行,即使您的计算机正在睡觉或关闭。使用服务器,您可以保持您的程序运行,只要你想。 在这个例子中,我们将使用 twitter_retweet.py文件,但您也可以使用 twitterbot_textfile.py文件或您所创建的任何其他Twitterbot文件。确保所有关联的文件在服务器的同一目录中可用。 注意:保持运行这些程序之一之前,最好修改方案,以通过更多的时间给相关sleep()函数,因为您的Twitterbot将运行24/7,直到手动停止(或直到文本文件,你传递给它完成)。回想一下, sleep()函数以秒为参数,所以sleep(3600)就会暂停您的tweets发生每隔一小时, sleep(7200)将计时您的鸣叫每两小时出现,等越频繁鸣叫,特别是使用给定的井号标签,您的Twitterbot将越有可能得到不受欢迎的关注,并打扰其他用户导致您的帐户被锁定。再次,请参阅Twitter的自动化规则和最佳实践 ,如果你不确定如何最好地利用你的Twitterbot。 为了保持我们的Twitterbot程序运行,我们将使用 nohup而忽略挂断(HUP)信号的命令。 通过使用 nohup ,通常出现在终端窗口输出,而不是打印到一个名为 nohup.out 。 确保您在Python环境中访问Tweepy库,并且在Python程序文件所在的目录中,并键入以下命令:
nohup python twitterbot_retweet.py &
您应该收到输出,并在括号中的数字( [1]如果这是你开始的第一道工序)和数字组成的字符串:
Output[1] 21725
此时,通过检查您帐户的Twitter页面来验证您的Twitterbot是否正在运行。至少有一个新的鸣叫应该已经张贴了程序获取到您之前 sleep()函数。 如果新的鸣叫是不存在的,你可以看看在 nohup.out使用文本编辑器如纳米文件:
nano nohup.out
请检查是否有错误,并根据需要进行修改程序,终止该进程,然后运行 nohup再次命令并检查你的Twitter帐户的一个新的鸣叫。 一旦您确认您的Twitterbot运行,使用 logout关闭到服务器的连接。
logout
如果你把你的进程中运行很长一段时间没有监视它,并根据您的服务器的能力, nohup.out可能填满你的磁盘空间。 当你想要或需要的话,你可以通过登录回您的服务器,并使用停止Twitterbot kill命令。 您将使用此命令与上面生成的字符串数字。 在我们的例子中,我们将使用 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流式下载tweets实时。您也可以考虑结合我们上面创建的两个TwitterBot的功能。除了创建交互式TwitterBot之外,您还可以通过使用Twitter API进行大量数据挖掘。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏