Python3とTweepyライブラリを使用してTwitterbotを作成する方法
序章
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ライブラリがインストールされた仮想環境にいることを確認する必要があります。 環境がアクティブになったら、プロジェクトのディレクトリを作成して、プロジェクトを整理しておくことができます。
mkdir twitterbot cd twitterbot
次に、nanoなどのテキストエディタを開き、ファイルcredentials.py
を作成して、これらの資格情報を保存します。
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
ファイルを作成すると、Gitを介してコードをリリースする予定がある場合に備えて、.gitignore
ファイルに追加することもできます。
ファイルからツイートするツイッターボット
Pythonの機能を使用してファイルを処理および読み取り、Twitterのステータスを更新できます。 この例では、既存のファイルを使用しますが、独自のファイルを作成するか、既存のファイルを変更することをお勧めします。
プログラムファイルの設定
nanoなどのテキストエディタを使用して、プログラムファイルを作成することから始めましょう。
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.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ライブラリを使用してTwitterAPIとやり取りするため、ライブラリをプログラムにインポートする必要があります。
また、時間ベースの方法でツイートを自動化するため、モジュール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.'}]
これは、ファイルの2行目が空白行であり、ステータスとして使用できないためです。 この問題を処理するために、空白行でない場合にのみ行を印刷してみましょう。 次のようなif
ステートメントを追加します。
if line != '\n':
Pythonでは、\n
は空白行のエスケープ文字であるため、if
ステートメントは、行が等しくない場合(!=
)にプログラムに通知します。 )空白行に移動したら、先に進んで印刷する必要があります。 それ以外の場合、Pythonはその行を無視する必要があります。 以下のコンテキストでステートメントを見ていきます。
もう1つ追加する必要があるのは、これらのツイートがすべて一度に送信されないようにするためのsleep()
です。 関数sleep()
は、秒の時間単位で機能します。したがって、ツイート間の時間を1時間にする場合は、1時間に3,600秒あるため、関数をsleep(3600)
と記述する必要があります。
テスト目的で(そしてテスト目的でのみ)、代わりに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ができました。 次のセクションでは、リツイート、フォロー、お気に入りを追加する別のツイッターボットについて説明します。 ツイッターボットの実行を維持するのセクションにスキップすることもできます。
リツイート、フォロー、お気に入りのツイッターボット
Tweepyライブラリを使用することで、他のユーザーのツイートをリツイートしてお気に入りに追加したり、他のユーザーをフォローしたりできるTwitterbotを設定できます。 この例では、ハッシュタグの形式で検索語をクエリすることに基づいてこれらの動作を行います。
プログラムファイルの設定
まず、twitterbot_retweet.py
というPythonファイルを作成しましょう。 ファイルの先頭にクレデンシャルを追加するか、インポートステートメントを追加して、クレデンシャルの保存で作成した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ループに追加できる追加のパラメーターはたくさんあります。
since
およびuntil
を使用した日付範囲(ただし、APIの制限により、ツイートは前週より前のものでなければならないことに注意してください)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()
メソッドは開いたままにしておくことができますが、要求が多すぎてリソースを使い果たしたために、次のエラーが発生する場合があります。
Outputtweepy.error.TweepError: Twitter error response: status code = 429
すべてのエラーコードと応答は、 TweepyAPIを介して利用できます。
例外処理
コードを改善するために、関連付けられたTwitterユーザー名を出力するだけでなく、try ... except
ブロックでエラー処理を使用してみましょう。 また、forループを中断する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に指示することができます。
リツイート、お気に入り、フォロー
まず、ツイッターボットが.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エラー処理では、既にフォローされているフォローしているユーザーが考慮されていないことに気付くかもしれません。そのため、.user.follow()
関数の前にif
ステートメントを導入できます。
... 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プログラムを実行し続けるために、ハングアップ(HUP)信号を無視するnohup
コマンドを使用します。 nohup
を使用すると、通常はターミナルウィンドウに表示される出力が、代わりにnohup.out
というファイルに出力されます。
TweepyライブラリにアクセスできるPython環境にいて、Pythonプログラムファイルが存在するディレクトリにいることを確認し、次のコマンドを入力します。
nohup python twitterbot_retweet.py &
角かっこで囲まれた数字(これが最初のプロセスである場合は[1]
)と数字の文字列を含む出力を受け取る必要があります。
Output[1] 21725
この時点で、アカウントのTwitterページをチェックして、Twitterbotが実行されていることを確認します。 プログラムがsleep()
機能に到達する前に、少なくとも1つの新しいツイートが投稿されている必要があります。 新しいツイートがない場合は、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プログラムが実行されていることを確認する必要があります。この場合、3行目のIDは21725です。 これで、プロセスを停止できます。
kill 21725
コマンドps -x
を再度実行すると、PythonTwitterbotのプロセスは終了します。
結論
このチュートリアルでは、Twitterソーシャルメディアプラットフォームと自動的に対話するために、2つの異なるバージョンのTwitterbotをセットアップして実行する方法について説明しました。 Twitter APIや、開発者がTwitterを簡単に利用できるようにするTweepyなどのライブラリを使用してできることは他にもたくさんあります。
ここから、TweepyライブラリとTwitter APIをさらに深く掘り下げて、リストを作成したり、リストにユーザーを追加したり、ダイレクトメッセージを送信したり、Twitterでストリーミングしてリアルタイムでツイートをダウンロードしたりすることもできます。 上記で作成した2つのTwitterbotの機能を組み合わせることも検討してください。 インタラクティブなツイッターボットを作成するだけでなく、Twitter APIを利用して、実質的なデータマイニングを行うこともできます。