UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Twitter API でファイルをアップロードして BOT に画像付きツイートをさせる方法

f:id:mochizuki_p:20161005192705p:plain

通常のホーム画面からのツィートと異なり、twitter APIを利用して画像付きのツィートを行うには少々面倒な手順をたどらなければならない。それは一度POST media/uploadに画像をアップロードして(この時点ではtwitterのサーバーに画像が保存されただけの状態)media idを取得する。そしてこのmedia idをクエリに入れて、ツィートしたい文章と一緒に POST statuses/update

にアクセスする。

最初にPOST media/uploadについて説明したい、

POST media/upload

概要

このエンドポイントを使用して画像をTwitterのサーバーにアップロードする。これはmedia_idを返却する。このIDを使用することでたいていのTwitterのエンドポイントで画像を使用できる。

レスポンス形式 ユーザー認証 アクセス回数
JSON 必要 制限あり

パラメータ

mediaまたはmedia_dataのどちらかが必須

パラメータ 説明
media jpeg,png,gif画像形式のバイナリデータ、media_dataと一緒に送信することはできない、
media_data base64形式に変換されたjpeg,png,gif画像データ、mediaと一緒に送信することはできない。
additional_owners コンマ区切りでほかのユーザーにアップロードした画像の利用許可を与える。最大100のアカウントに対して利用可能。(任意)

サポートしている画像形式と容量

  1. 画像形式 jpg,png,gif,webpのみ
  2. 容量は5MB以下

アニメーションgifを利用する場合は別に制約があります。 画像にaltタグを付けて説明文を追加する場合は、media metadata endpointを利用してください。

リクエスト

POSTリクエストでは必ずmultipart/form-dataを指定するようにしてください。アップロードの際にはバイナリ形式(mediaパラメータで指定する)か、base64形式(media_dataパラメータで指定する)を使用する。そしてファイル容量の節約のため、バイナリ形式を利用することが推奨されている。

レスポンス

レスポンスはmedia_idとmedia_id_stringが含まれています。media_id_stringJavaScriptなどLong Integer形式をサポートしていないプログラミング言語で使用するとよい。

返却されたmedia_idには有効期限がある。有効期限はexpires_after_secsで指定されている。この数値は秒単位である。この有効期限を過ぎてから、アップロードされた画像を利用することはできない。

そしてadditional_ownersでほかのユーザーに画像の利用許可を与えることができる。指定にはユーザーIDを利用する。

まずはmedia/uploadのレスポンスについて確認してみましょう。

今回投稿するのはこの画像です。

f:id:mochizuki_p:20161031192652p:plain

アクセストークンはあなたの取得したものに変更しておいてくださいね

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import twython

ACCESS_TOKEN = "4552442054-n2BKq5hjn5gsehbwhstarnMA1o"
ACCESS_TOKEN_SECRET = "PfpBvNtja6u6iwk56jhq45jftTECUviPOLj44M"
CONSUMER_KEY = "UFEHCtjskw56jq465J89EgFlgu"
CONSUMER_SECRET = "sZTkmUrlo5hq6j56jw57ke67kw5yuw56uCV206hsM96uw56uHTw9T"


twitter = twython.Twython(CONSUMER_KEY, CONSUMER_SECRET,ACCESS_TOKEN, ACCESS_TOKEN_SECRET)


imagefile = open('./twitter.png', 'rb')

r = twitter.upload_media(media=imagefile)
print(r)

リスポンスはJSON形式で、このmedia_id_stringが重要です。

またこの時点ではTwitterのサーバーにアップロードされただけでタイムラインに反映されていないことに注意してください。

{'expires_after_secs': 86400, 'image': {'h': 300, 'w': 300, 'image_type': 'image/png'}, 'media_id_string': '793034866598158336', 'size': 12617, 'media_id': 793034866598158336}

さてこのメディアIDを利用して画像付きのツィートを行ってみましょう。

t = twitter.update_status(status="BOT投稿のテストです!",media_ids='793034866598158336')

うまくいきました!

f:id:mochizuki_p:20161031192619p:plain