这可能需要一秒钟来解释所以请耐心等待:
我正在开展一项工作项目,要求我提供谷歌分析数据。我最初是在link之后执行此操作的,因此在安装API客户端pip install --upgrade google-api-python-client
并设置client_secrets.json
之后,它需要安装gflags才能执行run()
声明。 (即credentials = run(FLOW, storage)
)
现在,我收到错误消息以安装gflags或更好地使用run_flow()
(确切的错误消息是这样的):
NotImplementedError:必须安装gflags库才能使用tools.run()。请安装gflags或最好切换到使用tools.run_flow()。
我最初使用gflags(几个月前),但它与我们的框架(金字塔)不兼容,所以我们将其删除,直到我们弄清楚问题是什么。而且最好从gflags切换到run_flow()
的原因是因为gflags已被弃用,所以我不想像我一样使用它。我现在要做的是切换到使用run_flow()
问题是run_flow()
期望将命令行参数发送给它,而这不是命令行应用程序。我找到了一些有用的文档,但我仍然坚持为run_flow()
函数构建标志。
在显示代码之前,还有一件事需要解释。
run_flow()
有三个参数(documentation here)。它像run()
一样使用流和存储,但它也需要一个flags对象。 gflags库构建了ArgumentParser
执行方法中使用的标志oauth2client
对象。
其他一些有助于构建argumentParser
对象的链接:
第二个链接非常有助于查看它是如何执行的,所以现在当我尝试做类似的事情时,sys.argv
拉入我的虚拟环境的运行地点pserve
和还会提取我的.ini
文件(存储我的计算机的凭据以运行虚拟环境)。但这引发了一个错误,因为它期待别的东西,这就是我被困住的地方。
run_flow()
flags = parser.parse_args(argv[1:])
检索到正确的信息(我不知道应该是什么信息)代码:
CLIENT_SECRETS = client_file.uri
MISSING_CLIENT_SECRETS_MESSAGE = '%s is missing' % CLIENT_SECRETS
FLOW = flow_from_clientsecrets(
CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/analytics.readonly',
message=MISSING_CLIENT_SECRETS_MESSAGE
)
TOKEN_FILE_NAME = 'analytics.dat'
def prepare_credentials(self, argv):
storage = Storage(self.TOKEN_FILE_NAME)
credentials = storage.get()
if credentials is None or credentials.invalid:
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[tools.argparser])
flags = parser.parse_args(argv[1:]) # i could also do just argv, both error
credentials = run_flow(self.FLOW, storage, flags)
return credentials
def initialize_service(self, argv):
http = httplib2.Http()
credentials = self.prepare_credentials(self, argv)
http = credentials.authorize(http)
return build('analytics', 'v3', http=http)
我调用传递sys.argv
的主函数调用initialize_service
def main(self, argv):
service = self.initialize_service(self, argv)
try:
#do a query and stuff here
我知道这不起作用,因为我的应用程序不是命令行应用程序,而是完全集成的服务,但我认为值得一试。有关如何正确构建标志对象的任何想法吗?
答案 0 :(得分:16)
from oauth2client import tools
flags = tools.argparser.parse_args(args=[])
credentials = tools.run_flow(flow, storage, flags)
采取了一些措施,但我爬出了两条陷阱,让我陷入其中:
答案 1 :(得分:0)
这段代码适用于我的gmail api。
(此链接也有帮助。Command-line tools)
import argparse
import httplib2
from oauth2client.tools import run_flow
from oauth2client.tools import argparser
from oauth2client.file import Storage
CLIENT_SECRETS_FILE = "your_file.json"
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.readonly'
STORAGE = Storage("storage")
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=OAUTH_SCOPE)
http = httplib2.Http()
credentials = STORAGE.get()
if credentials is None or credentials.invalid:
#magic
parser = argparse.ArgumentParser(parents=[argparser])
flags = parser.parse_args()
credentials = run_flow(flow, STORAGE, flags, http=http)
http = credentials.authorize(http)
gmApi = build('gmail', 'v1', http=http)
# ...
答案 2 :(得分:-2)
可以找到可以传递的标志here并且是:
--auth_host_name: Host name to use when running a local web server
to handle redirects during OAuth authorization.
(default: 'localhost')
--auth_host_port: Port to use when running a local web server to handle
redirects during OAuth authorization.;
repeat this option to specify a list of values
(default: '[8080, 8090]')
(an integer)
--[no]auth_local_webserver: Run a local web server to handle redirects
during OAuth authorization.
(default: 'true')
我还没有弄清楚如何解析它们,我已经尝试为这三个标志中的每一个传递各种不同的值,但对我来说没有任何作用。我有一个有问题的问题here,在回答时可能对您有用。