情報学部大学生のダラダラ日記

β日記

機械学習や日記っぽいものを書きます

【Python】Twitter apiを使って複数画像を投稿する

スポンサーリンク

はじめに

 Twitter botを作成する際にapiを使って複数枚画像を投稿する方法があまりネットでは見つからなかったり、のっている情報が誤っていたりしたのでメモします。今回はいらすとやさんの画像を使いました。

プログラム

import requests

import twitter

import urllib.request

import requests

from requests_oauthlib import OAuth1Session

import json





CK=''

CS=''

AT=''

AS=''

twitter = OAuth1Session(CK,CS,AT,AS)



url_media = "https://upload.twitter.com/1.1/media/upload.json"

url_text = "https://api.twitter.com/1.1/statuses/update.json"



img_url = ['https://1.bp.blogspot.com/-SWOiphrHWnI/XWS5x7MYwHI/AAAAAAABUXA/i_PRL_Atr08ayl9sZy9-x0uoY4zV2d5xwCLcBGAs/s1600/pose_dance_ukareru_man.png',

            'https://1.bp.blogspot.com/-CSIokkL0VJc/XVKgHNKp2QI/AAAAAAABUHU/znkuxlOlQ5giZ3gDbks7KAK3TJnT2q1XwCLcBGAs/s1600/kotowaza_hato_mamedeppou.png',

            'https://1.bp.blogspot.com/-8sMAiPmvFuo/XVjgKN2BXoI/AAAAAAABUM0/IfTQp8hHWRsVk_u7s84OE6yvFJ5ekpnLwCLcBGAs/s1600/kid_seikaku_uchiki_girl.png',

            'https://1.bp.blogspot.com/-ahlT7Kd7-T0/XVjgJ3hrbFI/AAAAAAABUMw/MV4su85SnoAMYnSitR9DXVgNFuorpprwQCLcBGAs/s1600/kid_seikaku_uchiki_boy.png']  #①



def call():    

    media_id = []

    for i in range(4):

        headers = {"User-Agent": "Mozilla/5.0"}  #②

        request = urllib.request.Request(url=img_url[i],headers=headers)

        response = urllib.request.urlopen(request)

        data = response.read()

        files = {"media" : data}

        req_media = twitter.post(url_media,files = files)  #③

        media_id.append(json.loads(req_media.text)['media_id_string'])

    media_id= ','.join(media_id)  #④

    status = "投稿テスト"

    params = {"status": status, "media_ids": media_id}

    twitter.post(url_text,params=params)

    

        

if __name__ =='__main__':

    call()

解説と結果

  • ①ここで投稿したい画像のURLをリストにいれておいて準備します。僕はURLから画像を取得したかったのでやっていませんが、ローカルのファイルのパスを指定して投稿したい場合は他の方が多くやっていらっしゃるのでそちらを参照してください。
  • ②ユーザーエージェント(どのようなブラウザがサーバへアクセスしているかの情報)をこのようにFirefoxなどに指定しないと権限エラーが出てアクセスできないので注意してください。これについても多くの情報があるので調べてみてください。
  • ③②~③までの間でリスト内の画像URLをサーバから受け取りました。Twitterには直接画像のURLを画像として呟く事ができないので③ではこれをTwitter(url_media)へpostすることでURLを画像コード(数字の羅列)に変換しています。
  • ④今回の主たるところです。media_idが最終的にTwitterへ送る際にはじめはリストを渡せばいいと思っていましたが一枚しか投稿されませんでした。おそらく、['111','112',・・・]となっていることで途中のシングルクォーテーションが区切りと判断されたことが原因だと思います。なので④のようにリストの要素をカンマでjoin結合し、[111,112,・・・]とすることで複数枚投稿が可能となります。

 呟いた結果がこちら↓

f:id:Parco1021:20191123200647j:image

 

さいごに

 今回はTwitter apiの複数枚投稿についてまとめました。4で割り切れない場合などに臨機応変に対応させて複数枚投稿させたい場合はmodなどを使うといいです。僕が作ったbotはそのような設計になっているのでもしよければ観てみてください。

parco1021.hatenablog.com

(あげたあとにあげる必要ないって気づいたけど一応gitにもあげたので…https://github.com/tnb1021/tweetimgs)

参考文献

こちらのプログラムを拡張し、複数枚投稿できるようにしました。

qiita.com

 

 おわり。

もしよければ↓ぽちっと↓お願いします。

ブログランキング・にほんブログ村へにほんブログ村

 

PVアクセスランキング にほんブログ村

スポンサーリンク