3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonista3を使ってTwitterの検索にヒットした画像と動画をiPhoneに自動保存する

Last updated at Posted at 2020-02-04

#背景
前回の記事(Pythonista3を使ってTwitterのTLをiphoneに音読してもらう)と動機はほぼ同じです。今回はTwitterの検索結果から画像と動画のみを抽出してiPhoneに自動保存します。

#環境
iPhone8 13.2.3
Pythonista3 3.2
Tweepy 3.8.0

#準備
・Pythonista3のインストール
・Twitter APIの登録申請
・StaShのインストール
・tweepy, requests, youtube-dlのインストール

#コード

sav_photo_video.py
#!Pythonista3
#twitterから検索に一致した画像をiphoneのアルバムに納めるプログラム

import os, requests, photos, youtube_dl
import twitterconfig
from twitterconfig import api

#検索する言葉から画像と動画のurlのリストを返す関数
def twitter_to_url_out(q, max_id):
    gazou_suu = 0
    douga_suu = 0
    kensakukekka = api.search(q = q, count = 20, max_id = max_id)
    if max_id != None:
        kensakukekka = kensakukekka[1:]
    gazou_url_list = []
    douga_url_list = []
    max_id_list = []
    for match_tweet in kensakukekka:
        max_id_list.append(match_tweet.id)
        try:
            video_url = match_tweet.extended_entities['media'][0]['video_info']['variants'][1]['url']
            douga_url_list.append(video_url)
        except:
            try:
                for x in match_tweet.extended_entities['media']:
                    gazou_url = x['media_url']
                    gazou_url_list.append(gazou_url)
            except:    
                continue
    max_id = min(max_id_list)
    gazou_url_list = sorted(set(gazou_url_list), key=gazou_url_list.index)
    douga_url_list = sorted(set(douga_url_list), key=douga_url_list.index)
    return max_id, gazou_url_list, douga_url_list

#url_listを引数にとって、それぞれの動画を保存する関数
def douga_hozon(urllist):
    douga_suu = 0
    for url in urllist:
        try:
            with youtube_dl.YoutubeDL() as ydl:
                ydl.download([url])
            douga_suu += 1
        except:
            continue
    return douga_suu

#url_listを引数にとって、それぞれの画像を保存する関数
def gazou_hozon(urllist):
    gazou_list = []
    for url in urllist:
        response = requests.get(url)    
        try:
            response.raise_for_status()
        except:
            continue
        filename = str(url.split('/')[-1])
        newfile = open(filename,'wb')
        for chunk in response.iter_content(10000):
            newfile.write(chunk)
        newfile.close()
        gazou_list.append(filename)
    image_asset_list = []
    for gazou in gazou_list:
        image_asset = photos.create_image_asset(gazou)
        image_asset_list.append(image_asset)
        try:
            os.remove(gazou)
        except:
            continue
    album_list = photos.get_albums()
    album_name_dict = {}
    number = 0
    for album in album_list:
        album_name = str(album).split('"')[1]
        album_name_dict[album_name] = number
        number += 1
    if kensakukotoba in album_name_dict.keys():
        new_album = album_list[int(album_name_dict[kensakukotoba])]
    else:
        new_album = photos.create_album(kensakukotoba)
    new_album.add_assets(image_asset_list)
    gazou_suu = len(image_asset_list)
    return gazou_suu


kensakukotoba = input('検索したい言葉は\n')
hosiikazu = int(input('欲しい画像数は\n'))
max_id = None
s_gazou_url_list = []
s_douga_url_list = []
syu_kai = 1
while len(s_gazou_url_list) < hosiikazu:
    print(str(syu_kai) + '周目')
    max_id, gazou_url_list, douga_url_list = twitter_to_url_out(q = kensakukotoba, max_id = max_id)
    syu_kai += 1
    for gazou_url in gazou_url_list:
        s_gazou_url_list.append(gazou_url)
    for douga_url in douga_url_list:
        s_douga_url_list.append(douga_url)
    s_gazou_url_list = sorted(set(s_gazou_url_list), key=s_gazou_url_list.index)
    s_douga_url_list = sorted(set(s_douga_url_list), key=s_douga_url_list.index)
    if syu_kai == 30:
        break
douga_suu = douga_hozon(s_douga_url_list)
gazou_suu = gazou_hozon(s_gazou_url_list)
print('保存終了(画像数:' + str(gazou_suu) + ' , 動画数:' + str(douga_suu) + ')')

#結果
初めの状態。写真もアルバムもありません。
写真 2020-02-04 20 06 53.png

プログラムを開いて検索キーワードと保存したい最低枚数を指定
写真 2020-02-04 20 08 57.png

少し待って・・・
写真 2020-02-04 20 09 08.png

保存終了とでたら終了です。
写真 2020-02-04 20 09 37.png

再度見てみると自動的にアルバムが作成され、今回保存された画像が格納されています。
写真 2020-02-04 20 09 53.png

写真 2020-02-04 20 10 33.png

動画はpythonista内のコードがあるディレクトリにあります。
写真 2020-02-04 20 10 52.png

#解説
動画を写真と同じようにアルバムに収める方法が分かりませんでした。(pythonistaのphotosが動画に非対応?)分かる方がいらっしゃったらぜひ教えてください。
検索回数のリミットや検索方法は、各自使いやすいように変更してください。

#課題
何度か使っていて気になったこと
○動画のより良い保存方法
とりあえず時間があるときにフォルダ分けくらいはできるようにしようかなと思いました。

○重複する画像の自動削除
何度か同じキーワードで検索すると、どうしても同じ画像がちらほら保存されている状態に。同じ名前のアルバムはできないようにしていますが、検索結果と既存のアルバムを比較する部分があるといいかなと思いました。

#結論
やりたいことは形になりました!が、使いやすくするための改善の余地はまだまだありそうです・・・

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?