Hubotで外部から取得した画像を添付してツイートする


やりたいこと

画像URLを使って画像を取得。その画像を添付してツイート

環境

Mac OSX El Capitan
Hubot 2.19.0
hubot-twitter 2.1.1

コード

request({method: 'GET', url: image_url,  encoding: null}, (err, res, body) ->
      if err
        console.log err
        return
      @client = new twit(keys)
      @client.post('media/upload', {media_data: btoa(body)}, (err, data, response) ->
        if err
          console.log err
          return

        @client.post('statuses/update', { status: "ツイート内容!", media_ids: [data.media_id_string] }, (err, data, response) ->
          if err
            console.log err
            return
        )

ポイント

  • 画像添付には画像のアップロードとツイートの2ステップ必要
  • robot.httpモジュールじゃなくて、requestモジュールを使う
    • encoding: nullが重要で、これによってレスポンスのbodyがbufferのまま返される。
  •  画像データをbase64でエンコード

    • twitter API Documentによると以下の形式のみ許可してるようなのでbase64に変換した
      • raw binary (media parameter)
      • base64-encoded contents (media_data parameter)
  • ツイート時に画像をアップロードしたときのレスポンスにあるmedia_id_stringを一緒に記述

画像を添付してツイートができました。