#背景
前回の記事(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のインストール
#コード
#!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) + ')')
再度見てみると自動的にアルバムが作成され、今回保存された画像が格納されています。
動画はpythonista内のコードがあるディレクトリにあります。
#解説
動画を写真と同じようにアルバムに収める方法が分かりませんでした。(pythonistaのphotosが動画に非対応?)分かる方がいらっしゃったらぜひ教えてください。
検索回数のリミットや検索方法は、各自使いやすいように変更してください。
#課題
何度か使っていて気になったこと
○動画のより良い保存方法
とりあえず時間があるときにフォルダ分けくらいはできるようにしようかなと思いました。
○重複する画像の自動削除
何度か同じキーワードで検索すると、どうしても同じ画像がちらほら保存されている状態に。同じ名前のアルバムはできないようにしていますが、検索結果と既存のアルバムを比較する部分があるといいかなと思いました。
#結論
やりたいことは形になりました!が、使いやすくするための改善の余地はまだまだありそうです・・・