我正在尝试使用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
而失败)。
如何处理身份验证?这是一个服务器应用程序,所以理想情况下我可以生成一个我可以使用的令牌。
答案 0 :(得分:4)
这个问题很老,但它仍然适用,所以我将根据我最近的经验尝试更好的答案。
可以访问appengine之外的拉任务队列,但正如提问者所说,没有好的例子,所以这里有一个更深入的指南。在我的情况下,我有一个自定义python脚本,需要轮询队列以运行新的作业。
在采用此路线之前,您还可以选择滚动自己的安全性,并为appengine taskqueue调用创建一个简单的Web包装器。在处理完这个问题之后我很想走这条路,但是因为这个工作我现在正在使用它。
设置您的计算机
设置帐户
使用Google Cloud Console,创建一个已注册的应用程序(如果您还没有。点击您的AppEngine项目 - > API和auth - >已注册的应用程序。您可以输入名称和应用程序类型然后接受默认值。创建后,请记下客户端ID和客户端密钥以供日后使用。
同时更新您的同意屏幕(API和身份验证 - >同意屏幕)。请注意,您只需要此同意屏幕即可首次设置您的oauth凭据。您需要输入电子邮件地址和产品名称(我也输入了HomePage Url)。
生成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 Reference
2014年7月1日更新
因此实际上有一种更简单的方法来进行服务器到服务器的调用。这种方式不需要您使用“流”(登录谷歌)来获取访问密钥。
设置您的计算机
设置帐户
从上方替换凭证代码
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')
答案 1 :(得分:1)
这些APIS仅适用于GAE服务器,因为队列只能通过queue.yaml创建,而且infact API不会公开任何用于插入队列和任务或项目的API。
答案 2 :(得分:0)
pull队列页面有whole section个客户端库和示例代码。