アートボード_1

pythonでTwitter画像「一括」取得してみた

前回の「slackチャンネル名取得」に続き、勉強中のpythonで今度はTwitterAPIを使ってみました。動機は前回同様アウトプットによるpythonの復習で、いつもの省エネ主義です。

(事前準備)

pythonってなんだという方や、TwitterAPIを使うまでの準備は以前の日記や下記を参考ください。結構頻繁に変更があるみたいなのでご注意。APIを何目的で使うのかなどを英語で記入する必要がありますが、よっぽどおかしなこと書かない限り通ると思います。悪用厳禁。

(作ったもの)特定アカウントのツイートから画像を保存する

当初は自動で「いいね!」する機能を考えましたが、どうやらTwitterの規約的にだめっぽいので、ツイートにて公開されている画像を保存するものにしました。多くの方がブログに公開しているかなり簡単なものです。

# coding: UTF-8
#!/usr/bin/python3

import os
import tweepy
from config import CONFIG
from time import sleep
import urllib.error
import urllib.request

CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)


def download_file(url, dst_path):
   try:
       with urllib.request.urlopen(url) as web_file:
           data = web_file.read()
           with open(dst_path, mode='wb') as local_file:
               local_file.write(data)
   except urllib.error.URLError as e:
       print(e)
       
key_account = input('Enter account name:')
count_no = int(input('Set search count:'))
search_results = tweepy.Cursor(api.user_timeline, screen_name=key_account).items(count_no)

if not os.path.exists('img'):
   os.mkdir('img')

i = 0

for result in search_results:
   try:
       img_url = result.extended_entities['media'][0]['media_url']
       dst_path = 'img/{}.png'.format(i)
       download_file(img_url,dst_path)
       i += 1
       sleep(1)
   except:
       pass

(使ったもの)ライブラリ 「Tweepy」

すぐにpythonでTwitterを扱うとわかる絶妙なネーミングのライブラリ です。他にもTwitterを扱うライブラリ はありますが、一番シンプルでわかりやすかったので採用。

(参考にしたコード)

APIの基幹的な部分は前者の方から、URL取得については後者の方を参考にしています。

(工夫したところ)トークン情報は分けて記載

一応セキュリティ的な懸念から、トークン情報は別ファイルに記載して読み込んでいます。

CONFIG = {
   "CONSUMER_KEY":"XXXXXXX",
   "CONSUMER_SECRET":"XXXXXXX",
   "ACCESS_TOKEN":"XXXXXXX",
   "ACCESS_SECRET":"XXXXXXX",
  }
from config import CONFIG

CONSUMER_KEY = CONFIG["CONSUMER_KEY"]
CONSUMER_SECRET = CONFIG["CONSUMER_SECRET"]
ACCESS_TOKEN = CONFIG["ACCESS_TOKEN"]
ACCESS_SECRET = CONFIG["ACCESS_SECRET"]

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)

(工夫したところ)入力で都度条件を変える

まず対象のアカウントと検索数を都度入力で変更できるようにinputで取得。面倒なので整数判定はしてません。

key_account = input("Enter account name:")
count_no = int(input("Set search count:"))

(工夫したところ)ページ概念(カーソル)導入

slackと同様に、一度に持ってこれるデータ数が決まっているようなので、cursorを使うことでページ数指定の制限を抜ける。


search_results = tweepy.Cursor(api.user_timeline,screen_name='key_account').items(count_no)
To help make pagination easier and require less code, Tweepy has the Cursor object.(中略)Cursor handles all the pagination work for us behind the scenes, so our code can now focus entirely on processing the results.
公式ドキュメントより引用

あとは画像保存するための関数(download_file)を用意する、保存先を作る(os.mkdir)、取得したツイートのメディアのURLを取得して関数に渡す感じです。​

(まとめ)APIの仕組みがわかってきた

もちろん以前からAPIという存在は知っていましたが、slackに続きtwitterのAPIを自ら動かしてみて、どういった物なのか直感的に理解できた感じがします。このコードだとRTしている画像も取得してしまうので検討中。

以上です!何かすこしでも役に立てば嬉しいです。
コメントもお待ちしてます。

この記事が参加している募集

おうち時間を工夫で楽しく

この記事が気に入ったらサポートをしてみませんか?