0
0

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.

API RESTを使ってフォト蔵の写真をダウンロードしてみた

Last updated at Posted at 2020-07-24

はじめに

pythonを使って、フォト蔵の自分のアカウントにログインし、アルバムの中の写真を取ってくることが出来たのでその方法を書きます。

作るもの

demo

対象読者

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行ずつ実行すると仮想環境ができあがります。

python.py
pip install pipenv 
mkdir photozou_api
cd photozou_api
pipenv install --python=3.7
pipenv shell

pipenv shellで仮想環境の中に入れます。

インポートしたモジュール

python.py
import requests
import json
import pprint
import os
import filetype
import time
from io import BytesIO
from PIL import Image

最終的には全部で8このモジュールをインポートしました。

保存するフォルダーをつくる

python.py
path = '/Users/YOUR PC NAME/Downloads/album'
os.makedirs(path, exist_ok=True)

私はローカルのダウンロードフォルダに「album」というフォルダをつくるようにコードを書きました。
osをインポートして、makedirsで指定した場所にフォルダをつくります。
exist_ok=Trueは、すでに同じ名前のフォルダがあったらスルーするようにするコードです。

フォト蔵APIからアルバム名を取ってくる

フォト蔵APIの中にphoto_albumというAPIメソッドがあります。

python.py
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文を使ってアルバム名を取ってこようと思います。

取ってきたアルバム名でフォルダーをつくる

python.py
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を書いておきます。

ちゃんとすべてダウンロードされたか確認

python.py
    # フォルダーの中のファイルの数を数える
    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

この中にアルバムの中の写真の情報が入っています。

python.py
    # アルバムの中の写真を取ってくる
    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_idlimitというパラメータがあります。
payloadにはそのパラメータを指定しています。
limitが1000なのはフォト蔵の連続アクセスの上限が1000だったからです。

画像を保存する前に、保存したとき、後ろに番号があると今何枚目かわかって、わかりやすいので、数字を数えておこうと思います。

python.py
num = 0

アルバムの中の写真を保存する

python.py
    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】カレントディレクトリのファイル数をカウントする

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?