google API 的重复错误,但在 Pycharm 中有效
Replit error with google API but works in Pycharm
我正在学习本教程:https://developers.google.com/drive/api/v3/quickstart/python#trouble
我遵循了每一步(在创建凭据时遇到了一些麻烦,但它可以正常工作)但在最后一步,它给了我一个错误。在第 3.2 步,它说“a. 单击接受。该应用已获得访问您的数据的授权。”如果我通过 pycharm 运行 相同的脚本(python 的 IDE),一切正常,当我登录时,我在 chrome 上收到一条消息说“一切正常您可以关闭此网页”。但是,如果我在登录后在 replit 中执行此操作,则会出现此错误:
如果有人可以帮助我,那将很有帮助! (我是 api 的初学者所以请耐心等待)
所以问题出在登录后重定向回来。从错误消息中可以看出,localhost
(see wiki) 拒绝了连接。这是非常符合预期的行为,因为它不是本地机器 运行 宁代码,而是你在使用 replit 时 运行 在云中宁它。
您正在使用的代码示例不能直接使用 replit。你可以做的是运行本地代码一次创建令牌文件并将其上传到replit。请注意,不建议使用此解决方案,但我将其包括在内以供您理解。
我说的具体代码段是:
# Save the credentials for the next run
with open('token.json', 'w') as token:
token.write(creds.to_json())
这部分在登录流程后创建一个 token.json
文件。如果此文件存在,则不使用登录流程,根据这部分代码:
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
实际解决方案
更好的解决方案是替换下面的代码:
creds = flow.run_local_server(port=0)
使用以下代码:
creds = flow.run_console()
如库 here 的文档中所述。
它的作用是打印出一个link,你需要在另一个浏览器window中访问它。它或多或少与 flow.run_local_server(port=0)
具有相同的登录流程,但它不会重定向到 localhost
,而是生成一个代码,您需要将其粘贴到 replit 中。它应该是相当明显的,并且适用于您遇到的问题。
例如,当您远程进入只有命令行的云计算机时,可以使用此方法。 (fe. headless computer)
我正在学习本教程:https://developers.google.com/drive/api/v3/quickstart/python#trouble
我遵循了每一步(在创建凭据时遇到了一些麻烦,但它可以正常工作)但在最后一步,它给了我一个错误。在第 3.2 步,它说“a. 单击接受。该应用已获得访问您的数据的授权。”如果我通过 pycharm 运行 相同的脚本(python 的 IDE),一切正常,当我登录时,我在 chrome 上收到一条消息说“一切正常您可以关闭此网页”。但是,如果我在登录后在 replit 中执行此操作,则会出现此错误:
如果有人可以帮助我,那将很有帮助! (我是 api 的初学者所以请耐心等待)
所以问题出在登录后重定向回来。从错误消息中可以看出,localhost
(see wiki) 拒绝了连接。这是非常符合预期的行为,因为它不是本地机器 运行 宁代码,而是你在使用 replit 时 运行 在云中宁它。
您正在使用的代码示例不能直接使用 replit。你可以做的是运行本地代码一次创建令牌文件并将其上传到replit。请注意,不建议使用此解决方案,但我将其包括在内以供您理解。
我说的具体代码段是:
# Save the credentials for the next run
with open('token.json', 'w') as token:
token.write(creds.to_json())
这部分在登录流程后创建一个 token.json
文件。如果此文件存在,则不使用登录流程,根据这部分代码:
# The file token.json stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
实际解决方案
更好的解决方案是替换下面的代码:
creds = flow.run_local_server(port=0)
使用以下代码:
creds = flow.run_console()
如库 here 的文档中所述。
它的作用是打印出一个link,你需要在另一个浏览器window中访问它。它或多或少与 flow.run_local_server(port=0)
具有相同的登录流程,但它不会重定向到 localhost
,而是生成一个代码,您需要将其粘贴到 replit 中。它应该是相当明显的,并且适用于您遇到的问题。
例如,当您远程进入只有命令行的云计算机时,可以使用此方法。 (fe. headless computer)