使用Google Photos API时被禁止使用403

时间:2019-01-28 09:39:50

标签: google-photos google-photos-api

对不起,英语不是我的母语,我的英语不好。

我正在尝试使用Google Photos API和Python下载3000张以上的图片。

首先,我使用此代码下载了MediaItems列表。

from pathlib import Path
from requests_oauthlib import OAuth2Session
import json

api_url = "https://photoslibrary.googleapis.com/v1/mediaItems"
scope = ["https://www.googleapis.com/auth/photoslibrary.readonly"]


def save_token(token):
    token = {
        "access_token": token.get("access_token"),
        "refresh_token": token.get("refresh_token"),
        "token_type": token.get("token_type"),
        "expires_in": token.get("expires_in")
    }
    Path("token.json").write_text(json.dumps(token))


def load_token():
    token = {
        "access_token": "",
        "refresh_token": "",
        "token_type": "",
        "expires_in": "-30",
    }
    path = Path("token.json")
    if path.exists():
        token = json.loads(path.read_text())
    return token


def login():
    auth_info = json.loads(Path("credentials.json").read_text()).get("installed", None)
    assert auth_info is not None
    token = load_token()
    extras = {
        "client_id": auth_info.get("client_id"),
        "client_secret": auth_info.get("client_secret"),
    }
    google = OAuth2Session(
        auth_info.get("client_id"),
        scope=scope,
        token=token,
        auto_refresh_kwargs=extras,
        token_updater=save_token,
        auto_refresh_url=auth_info.get("token_uri"),
        redirect_uri=auth_info.get("redirect_uris")[0]
    )
    if not google.authorized:
        authorization_url, state = google.authorization_url(
            auth_info.get("auth_uri"),
            access_type="offline",
            prompt="select_account"
        )
        print("Access {} and paste code.".format(authorization_url))
        access_code = input(">>> ")
        google.fetch_token(
            auth_info.get("token_uri"),
            client_secret=auth_info.get("client_secret"),
            code=access_code
        )
        assert google.authorized
        save_token(google.token)
    return google


def test():
    google = login()
    response = google.get(api_url)
    print(response.text)


if __name__ == "__main__":
    test()

这段代码可以正常工作,我用nextPageToken下载了大约30个json文件(包含3000张图片信息)。

之后,我尝试通过此代码下载这些图片。

photo_info_list变量包含所有MediaItem。

photo_download_format = "{base}=w{width}-h{height}"

def download_photos(photo_info_list):
    google = login()
    for photo_info in photo_info_list:
        photo_id = photo_info.get("id", "dummy_id")
        base_url = photo_info.get("baseUrl")
        metadata = photo_info.get("mediaMetadata")
        filename = photo_info.get("filename")
        download_url = photo_download_format.format(
            base=base_url,
            width=metadata["width"],
            height=metadata["height"]
        )
        response = google.get(download_url)
        # save_picture

此代码适用于前162张图片(约270MB),但后来却出现403禁止错误。

我删除了令牌,然后再次尝试登录过程,创建了另一个凭据,但是出现了相同的错误。

有人知道是什么问题吗?

任何建议或信息都非常感谢。谢谢!

1 个答案:

答案 0 :(得分:3)

baseUrls在获取后的60分钟内到期。根据{{​​3}}

的文档
  

您也不应存储baseUrl,后者会在大约60分钟后过期。

最可能的解释是您的baseUrl已在下载过程中到期。