本ページには PR が含まれます。
PythonでTwitterの自動投稿ってどうすればいいの??
今回は、Twitter APIを使ってPythonから自動投稿・ツイートする方法をご紹介します。
- Twitter運用を自動化していきたい方
- Twitterのbotアカウントを作ってみたい方
- Python初学者でTwitter APIに触れてみたい方
実際に私のTwitterアカウントで自動投稿していくので動作イメージを確認できます!!
サンプルコードをコピペしながらサクサク処理を試せますので、ぜひ参考にしてみてください!!
なお、Twitter APIを利用するには利用登録と申請が必要です。こちらの記事で解説しているので登録がまだの方は参考にしてみてください。
>> Twitter APIを利用登録・申請する方法
ライブラリのインストール
Twitter APIへのリクエストにOAuth認証を使用します。
OAuth認証をカンタンに実装できる「requests_oauthlib」ライブラリをインストールしましょう。
コマンドプロンプト(Windows)もしくはターミナル(macOS)で下記を実行します。
pip install requests_oauthlib
コンソールに「Successfully installed 〜〜〜」と表示されていればインストールは成功です。
OAuth認証でアクセス
ライブラリをインストールできたら、API申請で取得した下記のキーを使ってOAuth認証を通します。
- API Key
- API Key Secret
- Access Token
- Access Token Secret
さっそく実装してみましょう!!
# ライブラリのインポート
from requests_oauthlib import OAuth1Session
# キーの設定
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
# OAuth認証を通して「twitter」という変数に格納
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
これでPythonからあなたのTwitterアカウントにアクセスできるようになりました。
自動投稿・ツイートの実装
OAuth認証が通れば、Twitterの自動投稿・ツイートの準備はOKです!!
Twitter APIによる自動ツイートでできることは以下のとおり。
- テキストツイート
- URLリンクツイート
- 画像つきツイート
- 動画つきツイート
さっそくシンプルなテキストメッセージを自動投稿・ツイートしてみましょう!!
テキストの投稿・ツイート
from requests_oauthlib import OAuth1Session
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
# ツイート用のapiアクセス先
scope = "https://api.twitter.com/1.1/statuses/update.json"
# ツイート本文
text = "tweet test!! with Python"
params = {"status" : text}
# 自動ツイート・ツイート実行
response = twitter.post(update_url, params=params)
URLリンクつき投稿・ツイート
URLリンクつきのツイートもやってみます。
from requests_oauthlib import OAuth1Session
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
# ツイート用のapiアクセス先
update_url = "https://api.twitter.com/1.1/statuses/update.json"
# ツイート本文
text = """
私のブログは↓こちら\n
https://junpage.com/\n
※これはTwitter APIを使った自動ツイートです。
"""
params = {"status" : text}
# 自動ツイート・ツイート実行
response = twitter.post(update_url, params=params)
URLを認識してリンクテキストでツイートできていますね!!
シンプルなテキストツイートのツイート本文にURLを入れるだけでとてもカンタン。
画像つき投稿・ツイート
Twitter APIでは画像つき投稿・ツイートもできますよ。
- ローカル上の画像ファイル(/Users/~~~.pngなど)
- Web上の画像(https://~~~.jpegなど)
のどちらの方法でも画像つき投稿が可能です。
両方の画像つき投稿の方法を確認していきましょう!!
ローカル上の画像ファイルをツイート
ローカル上の画像パスを使って、以下のようにして投稿できますよ。
# jsonライブラリをインポート
import json
from requests_oauthlib import OAuth1Session
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
update_url = "https://api.twitter.com/1.1/statuses/update.json"
# メディアpostのapiアクセス先
url_media = "https://upload.twitter.com/1.1/media/upload.json"
# ローカル上にある同ディレクトリ内のimage.pngの画像を選択
files = {"media": open("image.png", "rb")}
# Twitter APIにPOSTする
req_media = twitter.post(url_media, files=files)
# メディアidを取得
media_id = json.loads(req_media.text)['media_id']
text = "画像つきで投稿できます!!"
# 画像つきでtextをツイート
params = {"status": text, "media_ids": [media_id]}
response = twitter.post(update_url, params=params)
テキスト投稿よりやや複雑に見えますが、処理としては
- 画像をTwitter APIにPOST
- POSTした画像のmedia_idをjsonで読み込み
- media_idを指定してテキストと一緒にツイート
といった流れです。
Web上の画像をツイート
Web上の画像は以下のようにして、Webサーバ上に特定の画像URLで保存されています。
画像URLから画像コンテンツを抽出することで、ローカル上の画像ファイルと同じようにツイートできます。
ここでWeb上のデータにアクセスするための「requestsライブラリ」を使用します。
コマンドプロンプト(Windows)もしくはターミナル(macOS)で下記を実行しましょう。
pip install requests
コンソールに「Successfully installed 〜〜〜」と表示されていればインストールは成功です。
画像つきツイートのサンプルコードは以下の通り。
import json
# requestsライブラリをインポート
import requests
from requests_oauthlib import OAuth1Session
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
update_url = "https://api.twitter.com/1.1/statuses/update.json"
url_media = "https://upload.twitter.com/1.1/media/upload.json"
# Web上の画像URLを指定
image_url = "https://~~~~~~~~~~~~~.png"
# Web上の画像データにアクセスして情報をレスポンスに格納
response = requests.get(image_url, stream=True)
# レスポンスから画像データを抽出
image = response.content
files = {"media": image}
req_media = twitter.post(url_media, files=files)
media_id = json.loads(req_media.text)['media_id']
text = "画像つきで投稿できます!!"
params = {"status": text, "media_ids": [media_id]}
response = twitter.post(update_url, params = params)
ローカル上の画像投稿との違いは、
「requestsライブラリ」を使って画像URLにアクセスして、オブジェクトから画像コンテンツを抽出している
という点です。
動画つき自動投稿・ツイート
Twitter APIでは動画つきツイートも可能です!!
ローカルの動画ファイルをツイートしみましょう。サンプルコードは以下の通り。
import os, json
import requests
from requests_oauthlib import OAuth1Session
API_KEY = "あなたのAPI Key"
API_KEY_SECRET = "あなたのAPI Key Secret"
ACCESS_TOKEN = "あなたのAccess Token"
ACCESS_TOKEN_SECRET = "あなたのAccess Token Secret"
twitter = OAuth1Session(API_KEY, API_KEY_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
update_url = "https://api.twitter.com/1.1/statuses/update.json"
url_media = "https://upload.twitter.com/1.1/media/upload.json"
# ローカルの動画ファイルサイズを取得
totalBytes = os.path.getsize("movie.mov")
# メディアIDの取得
initParams = {
"command": "INIT",
"media_type": "video/mp4",
"total_bytes": totalBytes,
"media_category": "tweet_video"
}
initResponse = twitter.post(url=url_media, data=initParams)
media_id = initResponse.json()['media_id']
# 分割アップロード
segment_id = 0
bytesSent = 0
with open("movie.mov", "rb") as f:
while bytesSent < totalBytes:
# 4MBずつアップロード
chunk = f.read(4*1024*1024)
addParams = {
"command": "APPEND",
"media_id": media_id,
"segment_index": segment_id
}
files = {"media": chunk}
appendResponse = twitter.post(url=url_media, data=addParams, files=files)
segment_id += 1
bytesSent = f.tell()
print("%s of %s bytes uploaded" % (str(bytesSent), str(totalBytes)))
print("アップロード完了")
# ファイナライズ処理
finalizeParams = {"command": "FINALIZE", "media_id": media_id}
finalizeResponse = twitter.post(url=url_media, data=finalizeParams)
statusParams = {"command": "STATUS", "media_id": media_id}
statusResponse = twitter.get(url=url_media, params=statusParams)
processingInfo = statusResponse.json().get("processing_info", None)
while processingInfo['state'] == 'in_progress':
time.sleep(1)
statusResponse = twitter.get(url=url_media, params=statusParams)
processingInfo = statusResponse.json().get("processing_info", None)
print(processingInfo)
text = "ローカル内の動画ファイルも自動投稿できますよ!!\n※このツイートはPythonから自動ツイートしています。\n#API #自動化"
# ツイート
params = {"status": text, "media_ids": media_id}
twitter.post(url=update_url, data=params)
動画ツイートでは下記の流れで処理を行なっています。
- 動画のファイルサイズを取得
- ファイルサイズを指定してTwitter APIにPOST
- レスポンスからmedia_idを取得
- 動画を4MBずつTwitter APIにアップロード
- Twitter APIにファイナライズコマンドをPOST
- status_codeを確認しつつ、アップロード処理が完了を待つ
- media_idを指定して、テキストと一緒にツイート
まとめ
Twitter APIを使った自動投稿・ツイートの方法をご紹介しました。
ぜひ活用してみてください!!
他にもTwitter APIの活用方法を紹介しているので、合わせてどうぞ!!