以前書いた「Python で Twitter API にアクセス」だが、2014年3月頃に複数画像投稿が可能になり、それに伴って画像ツイートまわりの仕様が変更になったようなので追記。
それまでは通常ツイートの statuses/update API と、画像つきツイートの statuses/update_with_media があっだが、新たに media/upload というのが追加され、それまでの update_with_media は非推奨になった模様。
旧APIでは画像とテキストを同時に投稿していたが、新APIではまず画像をアップロードし、その media ID を取得してテキストをツイートする、という形になったようだ。
コードは大体こんなかんじ。CK,CS,AT,AS
は適宜自分のキーに置き換えること。Python2, 3 どっちでも動く。
upload_media.py
#!/usr/bin/env python
# coding: utf-8
import json
from requests_oauthlib import OAuth1Session
CK = 'XXXXXXXXXXXXXXXXXXXXXX' # Consumer Key
CS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Consumer Secret
AT = 'XXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Access Token
AS = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # Accesss Token Secert
url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"
# OAuth認証 セッションを開始
twitter = OAuth1Session(CK, CS, AT, AS)
# 画像投稿
files = {"media" : open('image.jpg', 'rb')}
req_media = twitter.post(url_media, files = files)
# レスポンスを確認
if req_media.status_code != 200:
print ("画像アップデート失敗: %s", req_media.text)
exit()
# Media ID を取得
media_id = json.loads(req_media.text)['media_id']
print ("Media ID: %d" % media_id)
# Media ID を付加してテキストを投稿
params = {'status': '画像投稿テスト', "media_ids": [media_id]}
req_media = twitter.post(url_text, params = params)
# 再びレスポンスを確認
if req_media.status_code != 200:
print ("テキストアップデート失敗: %s", req_text.text)
exit()
print ("OK")
4枚画像つきツイートをする場合 media/upload を4回やって、全部の media id をリストに並べてテキストを投稿するんだと思う。試してないけど。