はじめに
pythonを使って、フォト蔵の自分のアカウントにログインし、アルバムの中の写真を取ってくることが出来たのでその方法を書きます。
作るもの
対象読者
pythonの基礎終わってる人。
フォト蔵の一括ダウンロードがしたい人。
環境
macbook Air High Sierra 10.13.6
VScode 1.47.1
Python 3.7
インストールするもの
Python 3.7
requests 2.24.0
opencv-python 4.3.0.36
pillow 7.2.0
filetype 1.0.7
仮想環境をつくる
Macのターミナルか、パスが通って入れば、VScodeのターミナルを開いて下記コードを1行ずつ実行すると仮想環境ができあがります。
pip install pipenv
mkdir photozou_api
cd photozou_api
pipenv install --python=3.7
pipenv shell
pipenv shell
で仮想環境の中に入れます。
インポートしたモジュール
import requests
import json
import pprint
import os
import filetype
import time
from io import BytesIO
from PIL import Image
最終的には全部で8このモジュールをインポートしました。
保存するフォルダーをつくる
path = '/Users/YOUR PC NAME/Downloads/album'
os.makedirs(path, exist_ok=True)
私はローカルのダウンロードフォルダに「album」というフォルダをつくるようにコードを書きました。
os
をインポートして、makedirs
で指定した場所にフォルダをつくります。
exist_ok=True
は、すでに同じ名前のフォルダがあったらスルーするようにするコードです。
フォト蔵APIからアルバム名を取ってくる
フォト蔵APIの中にphoto_album
というAPIメソッドがあります。
url = 'https://api.photozou.jp/rest/photo_album.json'
r = requests.get(url, auth=(MAIL, PASSWORD), verify=False)
json_data = r.json()
data = json_data['info']['album']
ここからrequests.get
を使って、アルバム名を取得してきます。
フォト蔵API photo_album
json
の中を見ると、info
の中にalbum
があり、その中にアルバム名が入っています。
私の場合、アルバムは複数あります。
なので、data
の中にalbum
という情報をすべて入れて、あとでfor文を使ってアルバム名を取ってこようと思います。
取ってきたアルバム名でフォルダーをつくる
for i in data:
# アルバム名のフォルダーを作成
path = '/Users/YOUR PC NAME/Downloads/album/' + i['name']
print(i['name'])
os.makedirs(path, exist_ok=True)
data
の中にあるname
というのがアルバム名にあたります。
先ほどのpath
の中にi['name']
を足してあげることで、ダウンロードフォルダに作ったalbum
の中にアルバム名のついたフォルダが作成されます。
os.makedirs
を使って、指定したところにフォルダをつくるようコードを書きます。
すべてのコードが完成し、実行した時に、途中でエラーになり、止まってもまた続きからダウンロードがはじまるようにexist_ok=True
を書いておきます。
ちゃんとすべてダウンロードされたか確認
# フォルダーの中のファイルの数を数える
files = os.listdir(path)
count = len(files)
# 写真数比較
print(i['photo_num'], count)
# ファイル数が写真の数と同じかそれ以上なら
if count >= i['photo_num']:
continue
フォト蔵のアルバムの中の写真の数と実際にダウンロードした枚数が同じかどうか確認するため、上記のコードをfor文の中に追加します。
if文の中は、ダウンロードした写真の数がフォト蔵のアルバムの写真の数より同じかそれ以上だったら、下に続く画像ダウンロードのコードを飛ばしてもいいというコードです。
フォト蔵APIからアルバムの写真を取ってくる
次はフォト蔵APIのphoto_album_photo
というAPIメソッドをとってきます。
フォト蔵API photo_album_photo
この中にアルバムの中の写真の情報が入っています。
# アルバムの中の写真を取ってくる
url = 'https://api.photozou.jp/rest/photo_album_photo.json'
payload = {'album_id':i['album_id'], 'limit':'1000'}
r = requests.get(url, params=payload, auth=(MAIL, PASSWORD), verify=False)
json_data = r.json()
data = json_data['info']['photo']
photo_album_photo
のAPIメソッドをurl
に入れます。
photo_album_photo
には、album_id
とlimit
というパラメータがあります。
payload
にはそのパラメータを指定しています。
limit
が1000なのはフォト蔵の連続アクセスの上限が1000だったからです。
画像を保存する前に、保存したとき、後ろに番号があると今何枚目かわかって、わかりやすいので、数字を数えておこうと思います。
num = 0
アルバムの中の写真を保存する
for j in data:
time.sleep(0.5)
# アルバムの写真のタイトル名
print(j['photo_title'])
# アルバム内の写真URL
url = j['original_image_url']
# 写真のイメージデータを取ってくる
r = requests.get(url, auth=(MAIL, PASSWORD), verify=False)
# 写真のデータ形式
kind = filetype.guess(r.content)
im = Image.open(BytesIO(r.content))
# 何枚かを足す1して計算している
num+=1
# 写真の名前をつけて保存している
im.save(path + '/' + j['photo_title'] + '_' + str(num) + '.' + kind.extension)
# exit()
1個目のfor文の中に書きます。
最初にtimeで0.5秒待つように書いています。
これは連続で保存するとフォト蔵APIが、連続で保存しないようストップさせるため、その対策です。
url
の中にphoto_album_photo
の中の写真の情報を引き渡しています。
requests.get
で写真のイメージデータを取ってきています。
filetype
では、その写真のファイル形式がなにか識別しています。
これを使って、その写真がpng
なら.png
として、jpeg
なら.jpeg
として保存できるようにしています。
最後にopencv
を使って画像を保存しています。
中身は、「保存先」 + 「画像の名前」 + 「何番目」 + 「ファイル形式」としています。
最後にあるexit
を有効にすると、アルバム1つ終わると止まるようになってます。
おわりに
学生の頃から撮りためていた写真を当時、Googleフォトのようなクラウドの保存先がない時代に利用していました。
が、できればその写真たちをGoogleフォトに移行したいなと思い、挑戦してみました。
文系出身でプログラミング初心者なので間違ったことを書いている部分もあるかと思いますが、大目に見ていただけると恐縮です。
今、アルゴリズムを教えていただいている師匠の力もたくさん借りました。
この記事が私のようにフォト蔵一括ダウンロードしたいのにできないで困っている人の助けになったら嬉しいです。
それと初学者あるあるですが、とりあえず動くものがほしい方もいるかもと下にgithubリンク貼ります。
クローンして必要なモジュールをインポートしたらできるはず...!
【github】Photozou_all_download_by_APIREST
参考サイト一覧
Python, Requestsの使い方
[Python] requestsモジュールを使って楽々HTTP(s)通信を行う
Pythonでディレクトリ(フォルダ)を作成するmkdir, makedirs
Pythonでバイナリ解析する方法を現役エンジニアが解説【初心者向け】
Python, OpenCVで画像ファイルの読み込み、保存(imread, imwrite)
PythonでWeb上の画像などのファイルをダウンロード(個別・一括)
PythonでバイナリをあつかうためのTips
Pythonの画像処理ライブラリPillow(PIL)の使い方
Python3 + Bottle + Pillow でレスポンスとして画像を返す
↑神..!ありがとう。この記事なかったら保存できなかった...
pipenvを使う。pyenv+venvもいいけど、いまどきな'pipenv' で環境構築に使って使い勝手を調べてみた.
【Python】カレントディレクトリのファイル数をカウントする