LoginSignup
56

More than 5 years have passed since last update.

Python で画像付きツイート

Posted at

以前書いた「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 をリストに並べてテキストを投稿するんだと思う。試してないけど。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56