Нераспознанные аргументы с использованием oauth2 и Google API
Я использую сервисы API Google в некоторых скриптах и у меня возникают проблемы. Эта ошибка что-то странное, но здесь мы идем. У меня есть скрипт, который перечисляет мои файлы на Google Диске.
from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
SCOPES = 'https://www.googleapis.com/auth/drive.readonly.metadata'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, store)
DRIVE = discovery.build('drive', 'v3', http=creds.authorize(Http()))
files = DRIVE.files().list().execute().get('files', [])
for f in files:
print(f['name'], f['mimeType'],f['id'])
Работает отлично, скачиваю client_secret.json
из Google API и сохраните его в той же папке, затем я запускаю скрипт, чтобы проверить все в порядке.
Затем я начинаю редактировать свой файл, чтобы изменить способ его выполнения и не читать файл. Вместо этого я вызываю скрипт и отправляю в него строки client_id и client_secret, и окончательная версия такова:
import sys
from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
# ID and SECRET arguments
client_id = sys.argv[1]
client_secret = sys.argv[2]
SCOPES = 'https://www.googleapis.com/auth/drive.readonly.metadata'
def listFiles(drive):
"""Receive the service and list the files"""
files = drive.files().list().execute().get('files', [])
for f in files:
print(f['name'], f['mimeType'],f['id'])
def main():
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
flow = client.OAuth2WebServerFlow(client_id, client_secret, SCOPES)
creds = tools.run_flow(flow, store, tools.argparser.parse_args())
DRIVE = discovery.build('drive', 'v3', http=creds.authorize(Http()))
listFiles(DRIVE)
if __name__ == "__main__":
main()
Когда я запускаю эту новую версию скрипта в первый раз, он работает, потому что скрипт в старой версии создал storage.json
файл. Затем я перемещаю скрипт новой версии в другую папку или компьютер (где storage.json
файл не существует), чтобы проверить, работает ли он, а затем я получаю это:
$ python3 drive_list.py asdasdasdsa jijfkljflksdjflksdj
/usr/local/lib/python3.4/dist-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access storage.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
usage: drive_list.py [--auth_host_name AUTH_HOST_NAME]
[--noauth_local_webserver]
[--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
[--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
drive_list.py: error: unrecognized arguments: asdasdasdsa jijfkljflksdjflksdj
Предупреждение о файле storage.json является нормальным и появляется в обеих версиях скрипта, является частью oauth2client.
Это часть курьезов, почему аргументы признаются, когда storage.json
файл существует (ТОЛЬКО создан с чтением client_secret.json
)? если при первом запуске сценария он создает файл. Действительно странно эта ошибка, и я просто пытаюсь выяснить, что именно происходит. Если кто-то может мне помочь, я буду очень благодарен.
1 ответ
Это происходит потому, что вы импортируете модуль oauth2client.tools.
Для правильной работы этого модуля используется стандартный модуль argparse. Если вы не знаете, этот стандартный модуль используется для написания дружественных интерфейсов командной строки с простым управлением аргументами командной строки. Это не ладит с вашим использованием sys.argv[1]
а также sys.argv[2]
аргументы.
Чтобы обойти это, вы можете добавить новые аргументы в командную строку, как в примере ниже. С этой модификацией вы затем запустите инструмент следующим образом
python3 drive_list.py -ci "your_client_id" -cs "your_client_secret"
Вот ваш код, слегка измененный для добавления новых аргументов командной строки:
import argparse
from apiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
# ID and SECRET arguments as new command line parameters
# Here is where you extend the oauth2client.tools startnd arguments
tools.argparser.add_argument('-ci', '--client-id', type=str, required=True, help='The client ID of your GCP project')
tools.argparser.add_argument('-cs', '--client-secret', type=str, required=True,
help='The client Secret of your GCP project')
SCOPES = 'https://www.googleapis.com/auth/drive.readonly.metadata'
def list_files(drive):
"""Receive the service and list the files"""
files = drive.files().list().execute().get('files', [])
for f in files:
print(f['name'], f['mimeType'], f['id'])
def main():
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
# You want to be sure to parse the args to take in consideration the new parameters
args = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
flow = client.OAuth2WebServerFlow(args.client_id, args.client_secret, SCOPES)
creds = tools.run_flow(flow, store, tools.argparser.parse_args())
drive_sdk = discovery.build('drive', 'v3', http=creds.authorize(Http()))
list_files(drive_sdk)
if __name__ == "__main__":
main()