2

我正在尝试使用 GAE TaskQueue 的 REST API 将任务从队列拉到外部服务器(不在 GAE 上的服务器)。

  • 有没有为我做这个的图书馆?

  • API 很简单,所以我只需要弄清楚身份验证。gtaskqueue_sample我检查了google-api-python-client使用发送的请求--dump_request并找到了authorization: OAuth XXX标头。将该令牌添加到我自己请求的工作中,但该令牌似乎会定期(可能每天)过期,我不知道如何重新生成它。就此而言, gtaskqueue_sample 本身不再有效(调用https://accounts.google.com/o/oauth2/token失败并显示No JSON object could be decoded)。

如何处理身份验证?这是一个服务器应用程序,因此理想情况下我可以生成一个可以从那时起使用的令牌。

4

3 回答 3

4

这个问题很老,但它仍然适用,所以我将根据我最近的经验尝试一个更好的答案。

可以在 appengine 之外访问拉取任务队列,但正如提问者所说,没有很好的例子,所以这里有一个更深入的指南。就我而言,我有一个自定义 python 脚本,需要轮询队列以运行新作业。

在采取这条路线之前,您还可以选择滚动自己的安全性并为 appengine 任务队列调用制作一个简单的 Web 包装器。处理完这个问题后,我很想走那条路,但由于这行得通,我现在正在使用它。

设置您的机器

设置您的帐户

  • 使用Google Cloud Console,创建一个注册应用程序(如果您还没有。单击您的 AppEngine 项目 -> API 和 auth -> 注册应用程序。您可以输入名称和应用程序类型,然后接受默认值。一旦它已创建,请记下 Client Id 和 Client Secret 以备后用。

  • 同时更新您的同意屏幕(API 和 auth -> 同意屏幕)。请注意,首次设置您的 oauth 凭据时,您只需要此同意屏幕。您需要输入电子邮件地址和产品名称(我也输入了主页网址)。

生成 OAuth 凭据

  • 您只需要生成一次凭证文件,然后它将用于您的 python 脚本中的未来调用。运行这个打开浏览器并生成凭证文件的 python 代码。此代码的参考是here

    from oauth2client.tools import run
    from oauth2client.client import OAuth2WebServerFlow
    from oauth2client.file import Storage
    import gflags
    FLAGS = gflags.FLAGS
    
    storage = Storage('credentials.json')
    
    flow = OAuth2WebServerFlow(client_id='<your_client_id>',
                           client_secret='<your_client_secret>',
                           scope='https://www.googleapis.com/auth/taskqueue',
                           redirect_uri='urn:ietf:wg:oauth:2.0:oob')
    
    credentials = run(flow, storage )
    

进行任务队列调用

  • 确保您已在 AppEngine queue.yaml中添加了一个拉取队列,其中包含您在上述 oauth 步骤中使用的电子邮件地址。

    from oauth2client.tools import run
    from oauth2client.client import OAuth2WebServerFlow
    from oauth2client.file import Storage
    from apiclient.discovery import build
    import httplib2
    
    storage = Storage('credentials.json')
    credentials = storage.get()
    http = httplib2.Http()
    http = credentials.authorize(http)
    task_api = build('taskqueue', 'v1beta2')
    tasks = task_api.tasks().lease(project='<your appengine project>',taskqueue='<pull queue name>', numTasks=1, leaseSecs=600).execute(http=http)
    task = tasks['items'][0]
    payload = task['payloadBase64']
    payload = base64.b64decode(payload)
    
    #then do your work and delete the task when done
    
    task_api.tasks().delete(project='s~<your appengine project>',taskqueue='<pull queue name>', task=task['id']).execute(http=http)
    
  • 任务队列API 参考

  • 请注意删除调用中项目名称前面的前缀“s~”。只有当我添加它并且我相信它是一个错误时它才会起作用。

2014 年 7 月 1 日更新

所以实际上有一种更简单的方法来进行服务器到服务器的调用。这种方式不需要您使用“流程”(登录到谷歌)来获取访问密钥。

设置您的机器

设置您的帐户

  • 使用Google Cloud Console创建一个已注册的应用程序(如果您还没有的话。点击您的 AppEngine 项目 -> API's & Auth -> 凭据。点击创建新客户端 ID,指定服务帐户,然后点击创建客户端 ID。A会弹出下载框下载你的私钥,保存到你的代码目录(或任何地方,我保存为client_key.p12)。在Web界面上,记下客户端ID和电子邮件。

从上面替换凭据代码

from oauth2client.client import SignedJwtAssertionCredentials

email = '<***>.gserviceaccount.com'
f = file('client_key.p12', 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(email,
                                            key,
                                            scope='https://www.googleapis.com/auth/taskqueue')
于 2013-10-22T19:46:23.787 回答
1

这些 APIS 仅适用于 GAE 服务器,因为队列只能通过 queue.yaml 创建,而事实上 API 不公开任何用于插入队列和任务或项目的 API。

于 2011-12-30T15:37:11.610 回答
0

拉队列页面有一个关于客户端库和示例代码的完整部分。

于 2011-08-08T04:22:16.600 回答