2016/04/05

[Python]Twitterでファボったツイートの添付画像を一括DLする。

# -*- coding: utf-8 -*-

from requests_oauthlib import OAuth1Session
import json
import urllib
import os
import sys

CK = 'xxxxxxxxxxxxxxxxxxxxxxxxx'         #ConsumerKey
CS = 'xxxxxxxxxxxxxxxxxxxxxxxxx'         #ConsumerSecret
AT = 'xxxxxxxxxxxxxxxxxxxxxxxxx'         #AccessToken
AS = 'xxxxxxxxxxxxxxxxxxxxxxxxx'         #AccesssTokenSecert
folder = os.path.abspath('[画像を保存するフォルダのパス]')

#OAuth認証
twitter = OAuth1Session(CK, CS, AT, AS)

def getFavImage(cntnum):
    url = "https://api.twitter.com/1.1/favorites/list.json?"
    params = {"screen_name":"retore", "count":cntnum, "include_entities":1}
    
    #ふぁぼったツイートを取得する
    req = twitter.get(url, params = params)
    
    # レスポンスを確認
    if req.status_code == 200:
        tweets = json.loads(req.text)
        #取得したツイート(複数)からツイートを取り出し、画像があればダウンロードする。
        for tweet in tweets:
            try:
                img_list = tweet["extended_entities"]["media"]
                print u'id', tweet["id"]
                imgnum = 1
                for img in img_list:
                    img_url = img["media_url"]
                    root, ext = os.path.splitext(img_url)
                    img_url_large = img_url + ':large'
                    filename = str(tweet["id"]) + u'_' + str(imgnum) + ext
                    savepath = os.path.join(folder, filename)
                    urllib.urlretrieve(img_url_large, savepath)
                    #画像をDLしたツイートへのファボ解除
                    destroyFav(tweet["id"])
                    print u'Donwload completed.'
                    #1つのツイートに複数枚の画像がある可能性を考慮
                    imgnum += 1
            except KeyError: #画像がないツイートの場合
                #ファボを解除
                destroyFav(tweet["id"])
                print u'No Image.'
            except:
                print u'Error.'
    elif req.status_code == 404:
        print("Error code: {0}".format(req.status_code))
    else:    
        print("Error code: {0}".format(req.status_code))
        sys.exit()

def destroyFav(id):
    req = twitter.post("https://api.twitter.com/1.1/favorites/destroy.json", params={"id":id, "include_entities":True})
    if req.status_code != 200:
        print "Error code: {0}".format(req.status_code)
        sys.exit()
    else:
        print u'destroyed my fav to', id, u'.'

getFavImage(200)

主に取得したブツ(オブジェクトって言って良いのか?)がどういう構成なのか、という点についてこちらを参考にさせていただいた。
リクエストのステータスコードによる篩分け等も同様である。

画像のDL部分は以前私が書いた画像一括DLスクリプトをだいたい流用している。

実際の上のコードを動かすにはPython関連の環境整備はもちろん、CK,CS,AT,ATSの取得も必要になる。
その辺りはここが参考になるだろう。
あと一応書き加えておくと、このスクリプトで確認したツイートへのファボは解除されるので注意されたし。

API叩ける回数がどうとか、ファイルの書き込み方がどうとか、プログラミングに詳しい人が見れば突っ込みどころが満載だろうが、とりあえず動いているので満足している。
APIを叩く回数制限のあたりはちょっと気になるので、気が向いたらもう少し深掘りしようと思う。

0 件のコメント:

コメントを投稿