Как загрузить файл Google Drive с помощью Python и Drive API v3 - PullRequest
1 голос
/ 07 февраля 2020

Я пытался загрузить файл с Google Диска в локальную систему, используя скрипт python, но столкнулся с «запрещенной» проблемой при запуске скрипта Python. Сценарий выглядит следующим образом:

import requests

url = "https://www.googleapis.com/drive/v3/files/1wPxpQwvEEOu9whmVVJA9PzGPM2XvZvhj?alt=media&export=download"

querystring = {"alt":"media","export":"download"}

headers = {
    'Authorization': "Bearer TOKEN",

    'Host': "www.googleapis.com",
    'Accept-Encoding': "gzip, deflate",
    'Connection': "keep-alive",
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.url)
#
import wget
import os
from os.path import expanduser


myhome = expanduser("/home/sunarcgautam/Music")
### set working dir
os.chdir(myhome)

url = "https://www.googleapis.com/drive/v3/files/1wPxpQwvEEOu9whmVVJA9PzGPM2XvZvhj?alt=media&export=download"
print('downloading ...')
wget.download(response.url)

В этом сценарии у меня есть запрещенная проблема. Я что-то не так делаю в скрипте?

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

import auth
import httplib2
SCOPES = "https://www.googleapis.com/auth/drive.scripts"
CLIENT_SECRET_FILE = "client_secret.json"
APPLICATION_NAME = "test_Download"
authInst = auth.auth(SCOPES, CLIENT_SECRET_FILE, APPLICATION_NAME)
credentials = authInst.getCredentials()
http = credentials.authorize(httplib2.Http())
drive_serivce = discovery.build('drive', 'v3', http=http)

file_id = '1Af6vN0uXj8_qgqac6f23QSAiKYCTu9cA'
request = drive_serivce.files().export_media(fileId=file_id,
                                             mimeType='application/pdf')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print ("Download %d%%." % int(status.progress() * 100))

Этот скрипт дает мне Ошибка несоответствия URL-адреса .

Итак, что следует указать для URL-адреса перенаправления в учетных данных консоли Google? или любое другое решение проблемы? Нужно ли авторизовать консольное приложение Google от Google в обоих сценариях? Если да, то каков будет процесс авторизации приложения, потому что я не нашел никакого документа относительно этого.

1 Ответ

1 голос
/ 07 февраля 2020

Для отправки запросов в API Google рабочий процесс по сути следующий:

  1. Go до консоль разработчика , войдите в систему, если у вас ее нет.
  2. Создайте проект облачной платформы.
  3. Включите для своего проекта API-интерфейсы, которые вы хотите использовать с приложениями ваших проектов (например, Google Drive API).
  4. Создание и загрузите идентификаторы клиентов OAuth 2.0 учетные данные, которые позволят вашему приложению получить авторизацию для использования ваших включенных API.
  5. Перейдите на Экран согласия OAuth нажмите на enter image description here и добавьте область с помощью кнопки enter image description here. (объем: https://www.googleapis.com/auth/drive.readonly для вас). Выберите Внутренний / Внешний в соответствии с вашими потребностями и пока игнорируйте предупреждения, если таковые имеются.
  6. Чтобы получить действительный токен для выполнения запроса API, приложение go через поток OAuth получит токен авторизации. (Так как требуется согласие)
  7. Во время потока OAuth пользователь будет перенаправлен на экран согласия OAuth, где ему будет предложено утвердить или запретить доступ к запрошенным областям вашего приложения.
  8. Если согласие дано, ваше приложение получит токен авторизации.
  9. Передайте токен в своем запросе авторизованным конечным точкам API. [ 2 ]
  10. Создание службы накопителя для выполнения запросов API (вам потребуется действительный токен) [ 1 ]

ПРИМЕЧАНИЕ:

Доступные методы для ресурса «Файлы» для Drive API v3: здесь .

При использовании Python клиента API Google, вы можете использовать export_media() или get_media() как для клиента API Google для Python документации


ВАЖНО:

Кроме того, убедитесь, что используемая область фактически позволяет вам делать то, что вы хочу (загрузка файлов с диска пользователя) и установить его соответствующим образом. В банкомате у вас неверная сфера для вашей цели. См. Области применения OAuth 2.0


Пример кода Ссылки:

  1. Создание службы накопителя:
import google_auth_oauthlib.flow
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build


class Auth:

    def __init__(self, client_secret_filename, scopes):
        self.client_secret = client_secret_filename
        self.scopes = scopes
        self.flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(self.client_secret, self.scopes)
        self.flow.redirect_uri = 'http://localhost:8080/'
        self.creds = None

    def get_credentials(self):
        flow = InstalledAppFlow.from_client_secrets_file(self.client_secret, self.scopes)
        self.creds = flow.run_local_server(port=8080)
        return self.creds


# The scope you app will use. 
# (NEEDS to be among the enabled in your OAuth consent screen)
SCOPES = "https://www.googleapis.com/auth/drive.readonly"
CLIENT_SECRET_FILE = "credentials.json"

credentials = Auth(client_secret_filename=CLIENT_SECRET_FILE, scopes=SCOPES).get_credentials()

drive_service = build('drive', 'v3', credentials=credentials)
Оформление запроса на экспорт или получение файла
request = drive_service.files().export(fileId=file_id, mimeType='application/pdf')

fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%" % int(status.progress() * 100))

# The file has been downloaded into RAM, now save it in a file
fh.seek(0)
with open('your_filename.pdf', 'wb') as f:
    shutil.copyfileobj(fh, f, length=131072)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...