仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

Pythonでwebアプリケーション開発④ ~TwitterAPIのTweepyとforegoでつぶやき~


こんばんは!


今日は「Twitterのツイートって、自動化できないかな?」ということでTwitterのAPIをちょっと触ってみた結果をご紹介します!


TwitterAPIキーの取得


まずは、TwitterAPIを使うための準備をしていきます!TwitterのAPIを使ってツイートをしたり、タイムラインの情報を取得したりするためには、自分のアプリケーションを認証するConsumer KeyとConsumer Secret、Access TokenとAccess Token Secretの4つが必要です。まずはこれらを用意していきましょう。


こちらから、Twitterアプリケーションの管理画面にアクセスします。


遷移した先で「Create New App」というボタンをクリックし、アプリケーションの作成を進めていきます。
f:id:virtual-surfer:20180211195632p:plain


次に、①Name(アプリケーションの名前)、②Description(アプリケーションの内容説明)、③Website(自分の任意のサイトURL)を入力し、④のDeveloper Agreementに同意すればチェックをして、⑤Create your Twitter applicationをクリックします。③のWebsiteは特にサイトがない場合はTwitterの自分のアカウントURLでも一時的に入れておきましょう。
f:id:virtual-surfer:20180211200208p:plain


アプリケーションが作成できたら、下の画像の画面に遷移します。ここで、①Keys And Access TokensをクリックしてAPI Keyのページに移動します。
f:id:virtual-surfer:20180211201100p:plain


下の画像のようなページに遷移するので、①Create my access tokenをクリックして、アクセストークンを取得します。
f:id:virtual-surfer:20180211201301p:plain


無事アクセストークンを取得することができたら、下の画像のように①Consumer Key、②Consumer Secret、③Access Token、④Access Token Secretをそれぞれメモしておきます。これらの情報は他人に知られると悪用されうるものなので、知られないように注意しましょう。
f:id:virtual-surfer:20180211201822p:plain


これで、Twitter APIを使うためのAPIキーの取得ができました。次に、実際にこのキーを使ってAPIアクセスをしていきましょう。


TwitterAPIを使ってツイートする


Pythonの実行環境構築、Pycharmのインストールが終わっていない方は、こちらを参考にPythonを実行できる環境を用意しておいてください!


PyCharmを開いて、terminal(ファイルが操作できればいいので、terminalでもAtomでもいいです)で任意のディレクトリに移動します。また、「$ . activate」コマンドを打って、python実行環境をActivateしておきます。
f:id:virtual-surfer:20180211224250p:plain


まずは、ファイルにAPIキーを直書きせずにAPIキーを取得することができるように、.envファイルに先ほどメモしておいたAPIキーを記載しておきます。以下のコマンドを打って、.envファイルを作成します。(.envファイルには認証情報を記載するので、Github上にアップしてしまうなど間違って公開しないように注意しましょう。)

$ touch .env


.envファイルを開いて、それぞれ「CONSUMER_KEY」「CONSUMER_SECRET」「ACCESS_TOKEN」「ACCESS_TOKEN_SECRET」を以下のように記載します(xxxの箇所に自身の情報を入れてください)。

CONSUMER_KEY=xxx
CONSUMER_SECRET=xxx
ACCESS_TOKEN=xxx
ACCESS_TOKEN_SECRET=xxx


f:id:virtual-surfer:20180211225504p:plain


次に、.envに書いた変数をファイルから参照するためのツールであるforegoと、TwitterAPIを使うためのライブラリであるtweepyをインストールして使える状態にします。

$ brew install forego
$ pip install tweepy


それでは、TwitterAPIを使ってつぶやきを行うための処理をtweet.pyファイルに記載していきます。

$ touch tweet.py


作ったtweet.pyファイルを開いて、以下のようなコードを書きます。このファイルを実行することで、tweet_textに記載した「まだPythonで自動つぶやきできるようにしてないの?」というつぶやきが自分のアカウントからつぶやかれます。

import tweepy
import os

CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

tweet_text = "まだPythonで自動つぶやきできるようにしてないの?"

api = tweepy.API(auth)
api.update_status(tweet_text)


それでは、以下のコマンドでこのファイルを実行してみましょう。

$ forego run python tweet.py


f:id:virtual-surfer:20180212092050p:plain
ちゃんとつぶやけていますね!これでTwitterAPIを使って超簡単につぶやきをすることができることが確認できました。


ちなみに、ここでAPIキーのコピペにミスっていると、「"{"errors":[{"message":"Could not authenticate you","code":32}]}"」というエラー文が表示されてエラーになります。正しくコピペできているかどうか確認しましょう。僕もコピペミスってて一瞬はまりました。

スクリーンショットを撮影してつぶやき


次に、ちょっと応用してCoingeckoという仮想通貨の価格が一覧で見れるダッシュボード画面をスクリーンショット撮影して、スクリーンショットと文章をつぶやくという処理を実装します!


まだSeleniumがインストールできていない方は、こちらからインストールして使える状態にしておいてください。


まずは、Coingeckoにログインするために、登録しているメアドとパスワードを.envファイルに追記しておきます。

CONSUMER_KEY=XXX
CONSUMER_SECRET=XXX
ACCESS_TOKEN=XXX
ACCESS_TOKEN_SECRET=XXX

EMAIL_ADDRESS=XXX
PASSWORD=XXX


そして、「tweet_with_screenshot.py」というファイルを作成し、そのファイルに以下のような記述をしていきます。

from selenium import webdriver
import time
import tweepy
import os

# Coingeckoにログインするためのメアド、パスワードを取得して、ログインします。
EMAIL_ADDRESS = os.environ['EMAIL_ADDRESS']
PASSWORD = os.environ['PASSWORD']

driver = webdriver.PhantomJS()
driver.get('https://www.coingecko.com/account/sign_in')
input_element_email = driver.find_element_by_id('user_email')
input_element_password = driver.find_element_by_id('user_password')
send_button = driver.find_element_by_name('commit')
input_element_email.send_keys(EMAIL_ADDRESS)
input_element_password.send_keys(PASSWORD)
send_button.click()

# ページ読込み時間を加味して5秒待ち、スクリーンショットを保存して、コンソールに「スクリーンショットを保存しました!」と表示します
time.sleep(5)
driver.save_screenshot('screenShot.png')
print('スクリーンショットを保存しました!')

# TwitterAPIの認証データを取得して、指定された画像とテキストをつぶやく
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth)
tweet_text = "各種通貨の値動きなう"
tweet_image = "./screenShot.png"

api.update_with_media(filename=tweet_image, status=tweet_text)


あとは、これまで通りファイルを実行するだけ。

$ forego run python tweet_with_screenshot.py


少し待ってTwitterにアクセスして、結果を確認してみると、撮影されたスクリーンショットと共につぶやきができていることが分かります! f:id:virtual-surfer:20180317142513p:plain


今回はCoingeckoにアクセスしてスクリーンショットを撮影するという処理にしましたが、ブラウザ上の操作はSeleniumを活用すればほぼプログラム上で再現できるので、SeleniumとTwitterAPIを活用すればTwitter上の作業をどんどん自動化できそうですね。

まとめ


TwitterAPIを使って簡単なつぶやき処理を実装して実行してみましたが、他にもTwitterAPIでできることはめちゃくちゃあります! もっとTwitterAPI使いこなしてTwitterの自動運用できるようになりたいものですね。


目指すはこの状態↓


【参考にした著書】


では!