Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
42
Help us understand the problem. What is going on with this article?
@s_wing

Twitterで特定のユーザーのツイートを遡って、投稿された画像を一気に保存するスクリプトを作ってみた

More than 3 years have passed since last update.

はじめに

Twitterでユーザーのツイートを遡って、その中から投稿された画像を一気に保存できるようなプログラムがあったらいいなあと思って作ってみました。
このプログラムでは現在自分が勉強中のPython2.7を使用しています。Python2の実行環境があれば動くと思います。

仕様

基本的には自分のTwitterアカウントのAPIキー、自分が画像を遡りたいユーザーのアカウントのid、および遡るツイートの数をプログラム中で指定して、実行する形になります。
API制限により1人のユーザーから遡ることができるツイート数の上限は最新3200ツイートまでとなっているようです。
複数画像投稿ツイートにも対応していますが、GIF、動画等は保存されません。
鍵付きアカウントのユーザーを対象にする場合、そのユーザーをフォローしているアカウントのAPIが必要になります。

コード

imgcrawler_twi.py
#coding: UTF-8
from requests_oauthlib import OAuth1Session
import json
import twitkey
import requests
import sys, urllib
import os.path
import time

twitter = OAuth1Session(twitkey.twkey["CONSUMER_KEY"],
                        twitkey.twkey["CONSUMER_SECRET"],
                        twitkey.twkey["ACCESS_TOKEN"],
                        twitkey.twkey["ACCESS_TOKEN_SECRET"]
                        )
#別ファイルtwitkey.pyから必要な各パラメータ値を参照します。

Get_Count = 17 #Get_Countにツイートの取得回数を指定
Get_At_Once = 200 #Get_At_Onceに1回の取得で遡るツイートの数を指定
User_Id = "" #User_Idに画像を遡りたいユーザのidを指定 例:github
Path = "" #Pathに画像を保存したいディレクトリのファイルパスを指定してください 例:./Images/

for i in range(1,Get_Count):
    if(i==1):
        params = {"count":Get_At_Once}
    else:
        params = {"count":Get_At_Once,"max_id":num}
    req = twitter.get("https://api.twitter.com/"
                      "1.1/statuses/user_timeline.json"
                      "?screen_name=%s&include_rts=false" % User_Id,
                      params=params)
    timeline = json.loads(req.text)
    if(req.status_code == 200):
        if(i==1):
            counter=1
        else:
            counter=count
        for tweet in timeline:
            print counter
            print tweet["text"]
            num = tweet["id"]
            counter=counter+1
            if("extended_entities" in tweet.keys()):
                if("media" in tweet["extended_entities"].keys()):
                    print len(tweet["extended_entities"]["media"])
                    for i in range(0,len(tweet["extended_entities"]["media"])):
                        if("type" in tweet["extended_entities"]["media"][i].keys()):
                            if(tweet["extended_entities"]["media"][i]["type"]=="photo"):
                                print tweet["text"]
                                url = tweet["extended_entities"]["media"][i]["media_url_https"]
                                img = urllib.urlopen(url)
                                Name = tweet["user"]["name"]
                                created_at = tweet["created_at"]
                                Month = created_at[4:7]
                                Date = created_at[8:10]
                                Hour = created_at[11:13]
                                Minute = created_at[14:16]
                                Second = created_at[17:19]
                                Year = created_at[26:]
                                img_name = Name+"_"+Year+"_"+Month+"_"+Date+"_"+Hour+"_"+Minute+"_"+Second
                                localfile = open(Path + img_name +"_"+str(i)+".jpg", 'wb')
                                localfile.write(img.read())
                                img.close()
                                localfile.close()
            else:
                print "No Image"
        count=counter
    else:
        print (req.status_code)
        time.sleep(240)
        #エラー処理

twitkey.py
#coding: UTF-8
twkey = {
    "CONSUMER_KEY": "",
    "CONSUMER_SECRET": "",
    "ACCESS_TOKEN": "",
    "ACCESS_TOKEN_SECRET": ""
}

#各パラメータを入力してください

コードの説明

twitkey.py について

twitkey.pyには、使用するTwitterアカウントのAPIキーを入力してください。ここで使用するアカウントは捨て垢でも本垢でもなんでも大丈夫です。必要なパラメータ値は4つありますが、簡単に確認することができます。

CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_TOKEN_SECRETの4つが今回必要な値です。

APIキーの確認については、こちらのページが参考になると思います。
http://phiary.me/twitter-api-key-get-how-to/

imgcrawler_twi.py について

プログラム中には4つのパラメータ値が存在しています。それぞれに必要な値を指定していきます。

Get_Count =  
Get_At_Once =  
User_Id = "" 
Path = "" 

「Get_Count」と「Get_At_Once」について

「Get_Count」と「Get_At_Once」を使って遡るツイートの数を指定します。
具体的には「Get_At_Once」ツイート遡る動作を「Get_Count-1」回行うといった感じです。
一回につき遡ることができるツイート数の制限は200です。よって「Get_At_Once」の最大値は200になります。
また仕様の通り1ユーザーにつき直近3200ツイートまでしか遡れないという制限があるので、「Get_Count-1」×「Get_At_Once」は3200以下になるようにしてください。
とにかくたくさん遡りたいときは、「Get_Count」に17、「Get_At_Once」に200を指定することをオススメします。

「User_Id」について

「User_Id」には画像を遡りたいユーザーのidを指定してください。
例えば「github」のような感じです。

「Path」について

「Path」には画像の保存先となるフォルダのファイルパスを指定してください。
もちろん保存先はどこでもいいですが、例えばコードと同じディレクトリ内に「Images」というフォルダを作って、「./Images/」などとするイメージです。

画像の保存名について

「ユーザーのアカウント名」_「ツイート日時(年月日時分秒)」_「0〜3(これは複数画像添付ツイートだった場合に対応するための場合のナンバリングです)」のようにしてあります。

ツイート日時はロンドン時間で取得されているため、9時間の時差があります。

実行

twitkey.pyとimgcrawler_twi.pyを同じディレクトリ内に保存して、imgcrawler_twi.pyを実行してください。
自分が指定したフォルダ内に画像が無事に保存されていれば成功です。

スクリーンショット 2017-03-22 20.19.29.png

その他

実行の際にこのモジュールを入れろ!と怒られるかもしれません。その際は「requests」「requests-oauthlib」などのモジュールをpipで追加してから実行してみてください。

githubにもこのクローラのリポジトリを投稿しています。ぜひ見ていってください!!
https://github.com/tyokuyoku/Twitter_Images_Crawler

42
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
s_wing

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
42
Help us understand the problem. What is going on with this article?