PythonでTwitter投稿する

Pythonとtwitterは身を寄せ合い、そして二人は一つになった…(官能小説風

何故こんな記事を書いたか?それはPHPで動作するtwitteroauthが全然動かないから。

PHPがアップデートで7.2になったこともあってか、対応が全然間に合っていない。エラーでまくりでまともに連携もできない。

そこで思いついた。

Pythonならいけるんじゃね????

PHPよりもライブラリが充実しているし、簡単に仮想環境も作れるしでやるならこっちしかないってなりました。

で、調べたら出てくるpythonのtwitterライブラリ。

自分が使ったのはこれで、恐らくこれが最も安定していて便利なはず。というわけで、今回はpythonとtwitterを連携する記事についてメモがてら書こうと思います。

準備段階

必要なのはpythonを実行する環境です。python2なんか使用していると織田信長呼ばわりされるので、必ずpython3を使いましょう。

必要なものはイカ

  • python3
  • virtualenv(仮想環境を構築)
  • python3-pip(パッケージマネージャ)

あれ、これだけ?

sudo apt install python3 virtualenv python3-pip

ここまでできたらだいたい完了です。

理想はlinuxで動作させることですが、windows10からはbashが実行できるのでそっちからやってしまうのも楽かもしれませんね。

キーを入手する

でtwitterアプリを作成して、投稿に必要なキーを入手します。

Callback URLsは今のところは空っぽでも問題ありません。これを利用するのは他人のキーを入手したい場合なので。

アプリが作成できたらこんな画面になります。Keys and Access Tokensをクリックして次の画面に進みます。

進んだら下部にあるYour Access TokenからCreate my access tokenを押します。

すると自分のアクセストークンが発行されます。ここの値がバレてしまうと誰でもあなたのアカウントを使ってツイートしたり、ツイートを読まれる可能性があるので絶対に漏らさないようにしましょう。

というか、悪意ある人間がアプリを作れば鍵垢にアプリを連携させてツイートを全部読めてしまう気がするのですが、どうなんでしょう?

ここで発行された、

  • Consumer Key (API key)
  • Consumer Secret (API Secret)
  • Access Token
  • Access Token Secret

をどこかにメモしておきます。

仮想環境を構築する

ホームディレクトリに適当に環境を作りたいと思います。

ここでは仮にtwitterというディレクトリに環境を構築するとします。

cd
mkdir twitter
virtualenv --system-site-packages -p python3 twitter #仮想環境構築
cd twitter
source bin/activate #仮想環境をオン
pip3 install python-twitter

ここまで来たらほとんど終わったようなものです。

ツイートするコードを書く

先程発行したキーを使ってtwitterのAPIを叩くだけです。

先人の方のコードをパクリ参考にして以下のようなコードを書きます。参考文献と全く同じです。

# twitter.py
from requests_oauthlib import OAuth1Session

CK = "" # Consumer Key
CS = "" # Consumer Secret
AT = "" # Access Token
AS = "" # Access Token Secert

# Twitterの投稿用URL
url = "https://api.twitter.com/1.1/statuses/update.json"

# ツイートの内容
params = {"status": "Hello, World!"}

# 認証
connection = OAuth1Session(CK, CS, AT, AS)
req = connection.post(url, params = params)

# レスポンスを確認
if req.status_code == 200:
print ("OK")
else:
print ("Error: %d" % req.status_code)

結果

こんな感じで普通にツイートできました。

画像つきツイートがしたい

現在絶賛バグっているsplatoon2の自動戦績ツイートマシーンなんだけど、これは画像をアップロードしてそれをツイートするというプログラムになっている。

これもやはり先人の方のコードをパクリ参考にしました。

import json
from requests_oauthlib import OAuth1Session

CK = "" # Consumer Key
CS = "" # Consumer Secret
AT = "" # Access Token
AS = "" # Access Token Secert

# 画像とテキストのURL
url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"

# 認証
twitter = OAuth1Session(CK, CS, AT, AS)

# 画像投稿
path = "" # 画像ファイルのパス
files = {"media" : open(path, 'rb')}
req_media = twitter.post(url_media, files = files)

# レスポンスを確認
if req_media.status_code != 200:
print ("Upload image is Failed: %s", req_media.text)
exit()

# IDを取得
media_id = json.loads(req_media.text)['media_id']
print ("Media ID: %d" % media_id)

# IDを付加してテキストを投稿
params = {'status': '#splatoon2 #NintendoSwitch', "media_ids": [media_id]}
req_media = twitter.post(url_text, params = params)

# レスポンスを確認
if req_media.status_code != 200:
print ("Upload text is Failed: %s", req_text.text)
exit()

print ("OK")