序章

Twitterbotは、Twitterプラットフォームと統合され、他のユーザーを自動的に投稿、リツイート、いいね、またはフォローするプログラムです。 ツイッターボットは、興味深い情報や更新を提供することで役立つことが証明できます。また、楽しくてユーモラスなこともあります。

嫌がらせやスパム行為は問題ないだけでなく、Twitterの利用規約に違反したためにTwitterbotのアカウントが停止されるため、Twitterbotを作成する際は注意が必要です。 Twitterbotを作成する前に、Twitterの自動化ルールとベストプラクティスに精通して、TwitterbotがTwitterコミュニティの優れたメンバーであることを確認する必要があります。

このチュートリアルでは、2つのTwitterbotプログラムについて説明します。1つはファイルからツイートする、もう1つはリツイート、フォロー、お気に入りです。 さらに、クレデンシャルを別のプログラムファイルに保存し、Twitterbotをサーバー上で実行し続けるを実行します。 これらの各手順はオプションですが、実行する順序で表示されます。

前提条件

ローカルコンピューターを使用してTwitterbotをセットアップして実行することもできますが、継続的に実行したい場合は、サーバー上のPythonプログラミング環境がこのプロジェクトに最適です。

さらに、有効な電話番号に関連付けられた Twitter アカウントが必要です。このアカウントは、設定モバイルセクションから追加できます。ログインしました。 Twitterアプリを作成し、Python Tweepyライブラリをインストールする必要があります。これは、「Twitterアプリの作成方法」チュートリアルに従って行うことができます。 このチュートリアルを開始する前に、コンシューマーキー、コンシューマーシークレット、アクセストークン、およびアクセストークンシークレットを用意しておく必要があります。

このプロジェクトの一環として、Pythonを使用してファイルを読み取ります。 Pythonでのテキストファイルの操作に慣れるために、「 Python3でプレーンテキストファイルを処理する方法」ガイドを読むことができます。

クレデンシャルの保存

Twitterコンシューマーキー、コンシューマーシークレット、アクセストークン、およびアクセストークンシークレットをプログラムファイルの先頭に保持できますが、ベストプラクティスとして、メインプログラムファイルがアクセスできる別のPythonファイルにこれらを保存する必要があります。 。 これらの文字列にアクセスできる人は誰でもあなたのTwitterアカウントを使用できるので、これらを共有したり公開したりしたくはありません。 セキュリティに加えて、個別のファイルを保持することで、作成する各プログラムファイルの資格情報に簡単にアクセスできます。

まず、Tweepyライブラリがインストールされた仮想環境にいることを確認する必要があります。 環境がアクティブになったら、プロジェクトのディレクトリを作成して、プロジェクトを整理しておくことができます。

  1. mkdir twitterbot
  2. cd twitterbot

次に、nanoなどのテキストエディタを開いてファイルを作成しましょう credentials.py これらの資格情報を保存するには:

  1. nano credentials.py

生成したキー、シークレット、トークンごとに変数を作成します(これらを生成する必要がある場合は、これらの手順に従ってください。 一重引用符で囲まれたアイテムを、TwitterアプリのWebサイトからの一意の文字列に置き換えます(一重引用符を保持します)。

クレデンシャル.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を介してコードをリリースする予定の場合に備えてファイルします。

ファイルからツイートするツイッターボット

Pythonの機能を使用してファイルを処理および読み取り、Twitterのステータスを更新できます。 この例では、既存のファイルを使用しますが、独自のファイルを作成するか、既存のファイルを変更することをお勧めします。

プログラムファイルの設定

nanoなどのテキストエディタを使用して、プログラムファイルを作成することから始めましょう。

  1. nano twitterbot_textfile.py

次に、ファイルの先頭に追加するか、保存したものをインポートして、Twitterのクレデンシャルを設定しましょう。 credentials.py 上記のセクションで設定したファイル。 また、Tweepyライブラリを介してクレデンシャル変数と対話するための3行を追加します。

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の詳細については、紹介をご覧ください。

読み取るテキストファイルの取得

このツイッターボットの場合、読み取るテキストファイルが必要になるため、読者に無料の電子書籍(主にパブリックドメイン)を提供するボランティアプロジェクトであるProjectGutenbergからダウンロードしてみましょう。 ジュール・ヴェルヌによる海底二万里の英訳を次のファイルとして保存しましょう。 verne.txtcurl:

  1. 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ライブラリを使用してTwitterAPIとやり取りするため、ライブラリをプログラムにインポートする必要があります。

また、時間ベースの方法でツイートを自動化するので、モジュールをインポートする必要があります 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 他にコードがないため、または停止するように要求されているため、ターミナルウィンドウにファイルが出力されます。

ターミナルウィンドウで出力を受け取るのではなく、すべての行を新しいツイートにします。 これを実現するには、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.'}]

これは、ファイルの2行目が空白行であり、ステータスとして使用できないためです。 この問題を処理するために、空白行でない場合にのみ行を印刷してみましょう。 追加します if 次のようなステートメント:

if line != '\n':

Pythonでは、 \n は空白行のエスケープ文字なので、 if行が等しくない場合、ステートメントはプログラムに通知します(!=)空白行に移動したら、先に進んで印刷する必要があります。 それ以外の場合、Pythonはその行を無視する必要があります。 以下のコンテキストでステートメントを見ていきます。

追加する必要があるもう1つのことは sleep() これらのツイートがすべて一度に送信されないようにするためです。 関数 sleep() 秒の時間単位で動作するため、ツイートの間隔を1時間にする場合は、次のように関数を記述します。 sleep(3600) 1時間に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アカウントにも投稿されます。

ただし、すでにプログラムを実行している場合は、次のエラーが発生する可能性があります。

Output
tweepy.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文字のツイート制限に注意しながら、より意味のある方法でファイルの行をチャンク化する個別のスクリプトを作成できます。

この時点で、ソースファイルからツイートする完全に機能するTwitterbotができました。 次のセクションでは、リツイート、フォロー、お気に入りを追加する別のツイッターボットについて説明します。 ツイッターボットの実行を維持するのセクションにスキップすることもできます。

リツイート、フォロー、お気に入りのツイッターボット

Tweepyライブラリを使用することで、他のユーザーのツイートをリツイートしてお気に入りに追加したり、他のユーザーをフォローしたりできるTwitterbotを設定できます。 この例では、ハッシュタグの形式で検索語をクエリすることに基づいてこれらの動作を行います。

プログラムファイルの設定

まず、Pythonファイルを作成しましょう。 twitterbot_retweet.py. ファイルの先頭にクレデンシャルを追加するか、インポートステートメントを追加して、キー、シークレット、トークンのそれぞれにアクセスする必要があります。 credentials.py 上記のクレデンシャルの保存セクションで作成したファイル。 また、Tweepyライブラリを介してクレデンシャル変数と対話するための3行を追加します。

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ループに追加できる追加のパラメーターはたくさんあります。

  • を使用した日付範囲 sinceuntil (APIの制限により、ツイートは前週より前のものでなければならないことに注意してください)
  • a geocode 緯度、経度、およびその場所の周囲の特定の半径をキロメートル単位で取得します
  • 使用する特定の言語 lang 指定する言語の2文字のISO639-1コードに設定します

この特定のシナリオは実際には結果を生成しませんが、#oceanのクエリを保持し、ツイートを取得するために2日間の時間枠を指定し、シンガポール周辺の100 kmに場所を制限し、フランス語を要求しましょう-言語ツイート。 遊んでみるには、それぞれの文字列を入れ替えて、自分にとって意味のある結果を得る必要があります。

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関数を介して渡すことができるさまざまなパラメーターの詳細については、TweepyAPIリファレンスを参照してください。

ここでのサンプルプログラムでは、#oceanクエリを検索するだけです。 あなたは去ることができます .items() メソッドは開いていますが、リクエストが多すぎてリソースを使い果たしたために、次のエラーが発生する場合があります。

Output
tweepy.error.TweepError: Twitter error response: status code = 429

すべてのエラーコードと応答は、 TweepyAPIを介して利用できます。

例外処理

コードを改善するために、関連付けられた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_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を実行し続ける

ツイッターボットは継続的かつ自動化されたタスクを実行するため、コンピューターがスリープ状態または電源がオフの場合でも、プログラムを実行し続けることができます。 サーバーを使用すると、プログラムを好きなだけ実行し続けることができます。

この例では、 twitter_retweet.py ファイルが、あなたも使用することができます twitterbot_textfile.py ファイル、または作成したその他のTwitterbotファイル。 関連するすべてのファイルがサーバーの同じディレクトリで使用可能であることを確認してください。

注:これらのプログラムのいずれかを実行し続ける前に、関連するプログラムにより多くの時間を渡すためにプログラムを変更することをお勧めします sleep() Twitterbotは、手動で停止するまで(または、渡したテキストファイルが完了するまで)24時間年中無休で実行されるため機能します。 思い出してください sleep() 関数はパラメータとして数秒かかるので、 sleep(3600) ツイートが1時間ごとに発生するように時間を計ります。 sleep(7200) ツイートが2時間ごとに発生するように時間を計ります。 特に特定のハッシュタグを使用してツイートする頻度が高いほど、Twitterbotが歓迎されない注目を集め、他のユーザーに迷惑をかけてアカウントがロックされる可能性が高くなります。 繰り返しになりますが、Twitterbotの最適な使用方法がわからない場合は、Twitterの自動化ルールとベストプラクティスを参照してください。

Twitterbotプログラムを実行し続けるために、 nohup ハングアップ(HUP)信号を無視するコマンド。 を使用して nohup、通常はターミナルウィンドウに表示される出力は、代わりに次のファイルに出力されます。 nohup.out.

TweepyライブラリにアクセスできるPython環境にいて、Pythonプログラムファイルが存在するディレクトリにいることを確認し、次のコマンドを入力します。

  1. nohup python twitterbot_retweet.py &

角かっこで囲まれた数字が付いた出力を受け取る必要があります([1] これが開始する最初のプロセスである場合)および数字の文字列:

Output
[1] 21725

この時点で、アカウントのTwitterページをチェックして、Twitterbotが実行されていることを確認します。 プログラムがあなたに届く前に、少なくとも1つの新しいツイートが投稿されている必要があります sleep() 関数。 新しいツイートがない場合は、 nohup.out nanoなどのテキストエディタを使用したファイル:

  1. nano nohup.out

エラーがあるかどうかを確認し、必要に応じてプログラムに変更を加え、プロセスを強制終了してから、 nohup もう一度コマンドを実行し、Twitterアカウントで新しいツイートを確認してください。

Twitterbotが実行されていることを確認したら、 logout サーバーへの接続を閉じます。

  1. logout

プロセスを監視せずに、サーバーの容量に応じて長時間実行し続ける場合は、 nohup.out ディスク容量がいっぱいになる可能性があります。 必要な場合、または必要な場合は、サーバーに再度ログインして、 kill 指図。 このコマンドは、上記で生成された数字の文字列で使用します。 この例では、 kill 21725. その番号はもう手元にないかもしれないので、を実行することで番号の文字列を簡単に取得できます ps プロセスステータスのコマンド、および -x 端末に接続されていないすべてのプロセスを含めるフラグ:

  1. 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プログラムが実行されていることを確認する必要があります。この場合、3行目のIDは21725です。 これで、プロセスを停止できます。

  1. kill 21725

コマンドを実行した場合 ps -x 繰り返しになりますが、PythonTwitterbotのプロセスはなくなります。

結論

このチュートリアルでは、Twitterソーシャルメディアプラットフォームと自動的に対話するために、2つの異なるバージョンのTwitterbotをセットアップして実行する方法について説明しました。 Twitter APIや、開発者がTwitterを簡単に利用できるようにするTweepyなどのライブラリを使用してできることは他にもたくさんあります。

ここから、TweepyライブラリとTwitter APIをさらに深く掘り下げて、リストを作成したり、リストにユーザーを追加したり、ダイレクトメッセージを送信したり、Twitterでストリーミングしてリアルタイムでツイートをダウンロードしたりすることもできます。 上記で作成した2つのTwitterbotの機能を組み合わせることも検討してください。 インタラクティブなツイッターボットを作成するだけでなく、Twitter APIを利用して、実質的なデータマイニングを行うこともできます。