pydrive: попытка загрузить файлы на Google Диск с удаленного сервера

Я пытаюсь автоматически загружать файлы на диск Google с помощью скрипта Python, работающего удаленно с сервера (Ubuntu).

В моем коде у меня есть следующие простые строки из Pydrive:

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

file = drive.CreateFile({"parents": [{"kind": "<directory_name>","id": "<directory_id>"}]})
file.SetContentFile('<file_name>')
file.Upload()

У меня есть файл settings.yaml в моем каталоге python, чтобы скрипт мог автоматически аутентифицироваться после первой ручной аутентификации, и файл client_secrets.json. Я в основном выполнил все шаги в https://pythonhosted.org/PyDrive/oauth.html. .

Однако, когда я активирую свой скрипт на удаленном сервере Ubuntu, я подключаюсь к странице Google в среде терминала, запрашивая мой адрес электронной почты и пароль. Когда я ввожу их, Google запрашивает вторую аутентификацию: либо посмотрите на изображение с кодом (и ничего не появляется на терминале), либо «послушайте и введите номер, который вы слышите». Когда я набираю эту команду, терминал отвечает «не найден», и я ничего не слышу (см. рисунок ниже).

введите здесь описание изображения

Я застрял, и я не знаю, как обойти эту проблему. К сожалению, мне нужно аутентифицироваться хотя бы один раз, тогда скрипт будет аутентифицировать себя автоматически. Я действительно не вижу, как пропустить этот шаг.

Любая идея/комментарий/понимание будет принята с благодарностью

Большое спасибо Берти


person Berti1989    schedule 28.10.2019    source источник


Ответы (1)


Как указано в документах:

Вы также можете использовать CommandLineAuth(), который вручную берет код от пользователя в командной строке.

LocalWebserverAuth() вызовет прослушивание локального веб-сервера (по умолчанию) на localhost:8080 и попытается открыть URL-адрес аутентификации в веб-браузере пользователя. Открытая страница после аутентификации передаст коды аутентификации на локальный сервер, работающий на локальном хосте.

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

Использование CommandLineAuth() вместо этого распечатает URL-адрес на терминале удаленного сервера, который вы можете открыть в своем локальном браузере. Затем вы проходите аутентификацию в своем браузере, который дает вам коды аутентификации, которые вам нужно скопировать из вашего локального браузера и вставить в приглашение в терминале.

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.CommandLineAuth()  # <--
drive = GoogleDrive(gauth)

file = drive.CreateFile({"parents": [{"kind": "<directory_name>","id": "<directory_id>"}]})
file.SetContentFile('<file_name>')
file.Upload()

Если вы хотите автоматически различать локальные и удаленные компьютеры для выбора метода аутентификации, я бы рекомендовал проверить эти вопросы:

person ROpdebee    schedule 28.10.2019
comment
Большое спасибо за ваш ответ. Я изменил код точно в соответствии с тем, что вы сказали, и это сработало. Вы сделали мой день :) И спасибо за ссылки, которые вы предоставили. Они будут весьма полезны. - person Berti1989; 28.10.2019
comment
Когда я пытаюсь выполнить аутентификацию из командной строки, у меня возникает проблема с redirect_uri, который установлен как localhost://8080. Как вы обошли это? - person Neil; 24.09.2020