2018/06/06

【Python・Twitter】Twitterでファボった画像を一括DLするスクリプトをPython3.x用に微改造した

久しぶりにTwitterでふぁぼった画像を一掃しようということでスクリプトを動かしてみたのだが,以前書いた時はPython2.x系,今の環境は同3.x系.微妙なところで互換性がなくエラーを吐くので3.x系で動くように小改造しました.

# -*- coding: utf-8 -*- from requests_oauthlib import OAuth1Session import json import urllib import os import sys CK = 'xxxxxxxxxxxxxxxx...

前回のやつ.

Sponsored Link

コード

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

import requests
from requests_oauthlib import OAuth1Session
import json
import os
import shutil
import sys

CK = 'xxxxxxxxxxxxxxxxxxxxxx'         #ConsumerKey
CS = 'xxxxxxxxxxxxxxxxxxxxxx'         #ConsumerSecret
AT = 'xxxxxxxxxxxxxxxxxxxxxx'         #AccessToken
AS = 'xxxxxxxxxxxxxxxxxxxxxx'         #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":"[screen nameを入れる]", "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"]
                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)
                    r = requests.get(img_url_large, stream=True)
                    with open(savepath, 'wb') as f:
                        r.raw.decode_content = True
                        shutil.copyfileobj(r.raw, f)
                    #画像をDLしたツイートへのファボ解除
                    destroyFav(tweet["id"])
                    print('Donwload completed.')
                    #1つのツイートに複数枚の画像がある可能性を考慮
                    imgnum += 1
            except KeyError: #画像がないツイートの場合
                #ファボを解除
                destroyFav(tweet["id"])
                print('No Image.')
            except:
                print('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('destroyed fav')
 
getFavImage(200)

変更点

一番大きいのは画像のDL周りで,2.x系のときのurllibではなくてrequestsというものを使っている.この辺りは3系のほうがスムーズにやれる印象.

デバッグ用のprintでエラーを吐いたのはさすがに萎えたが,そこも直した.

OAuth認証周りも何か変更があるような話をちらほら見かけたが,修正しなくても動いているのでそのまま.

参考にしたサイト

python3のrequestsを使って画像を保存(Qiita)を参考にした.urllibではできたファイル保存のやり方がよくわからなくなって困っていたので助かった.

おわりに

相変わらず時間が経つとコードが読みにくくなる.コメントをつけないのとそもそもコードが汚いのが原因なんだが,なんとかならんもんか.

悲しみのIT系社畜になることが確定したので本気で勉強せねば.

0 件のコメント:

コメントを投稿