Получение 403 запрещено при использовании Google Photos API - PullRequest
0 голосов
/ 28 января 2019

Извините, но английский не мой родной язык, и мой английский не работает.

Я пытаюсь загрузить свои 3000+ картинок, используя Google Photos API с Python.

СначалаЯ скачал список 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()

Этот код работал без проблем, и я скачал около 30 файлов json (содержит 3000 изображений информации) с nextPageToken.

После этого я попыталсязагрузите эти изображения этим кодом.

Переменная photo_info_list содержит все MediaItems.

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 изображений (около 270 МБ), но затем я получил 403 запрещенную ошибку.

Я удалил токен и снова попытался войти в систему, создал другие учетные данные, но получил те же ошибки.

Кто-нибудь знает, в чем проблема?

Любые предложения или информация действительно ценятся,Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2019
Срок действия

baseUrls истекает через 60 минут после приобретения.Согласно документации для API Google Фото

Вам также не следует хранить baseUrls, срок действия которых истекает примерно через 60 минут.

Наиболее вероятное объяснениеявляется то, что ваш baseUrl истек в середине загрузки.

...