问题描述
我正在尝试将google-api-python-client 1.12.5与Python 3.8下的服务帐户auth一起使用。在我看来,当指定status参数时,Google会以404 HTTP代码进行响应。我不知道为什么。我也查看了文档,但无法将任何错误与此错误相关。
这是代码:
from google.oauth2 import service_account
from googleapiclient.discovery import build
ScopES = ['https://www.googleapis.com/auth/blogger']
SERVICE_ACCOUNT_FILE = 'new_service_account.json'
BLOG_ID = '<your_blog_id>'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,scopes=ScopES)
service = build('blogger','v3',credentials=credentials)
p = service.posts()
# FirsT
promise = p.list(blogId=BLOG_ID)
result = promise.execute()
# SECOND
promise = p.list(blogId=BLOG_ID,orderBy='UPDATED')
result = promise.execute()
#THIRD
promise = p.list(blogId=BLOG_ID,orderBy='UPDATED',status='DRAFT')
result = promise.execute() # <===== ERROR HAPPENS HERE!!!!
service.close()
这是回溯:
Traceback (most recent call last):
File "/home/madtyn/.local/share/JetBrains/ToolBox/apps/PyCharm-P/ch-0/202.7660.27/plugins/python/helpers/pydev/pydevd.py",line 1448,in _exec
pydev_imports.execfile(file,globals,locals) # execute the script
File "/home/madtyn/.local/share/JetBrains/ToolBox/apps/PyCharm-P/ch-0/202.7660.27/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py",line 18,in execfile
exec(compile(contents+"\n",file,'exec'),glob,loc)
File "/home/madtyn/PycharmProjects/blogger/main.py",line 24,in <module>
result = promise.execute()
File "/home/madtyn/venvs/blogger/lib/python3.8/site-packages/googleapiclient/_helpers.py",line 134,in positional_wrapper
return wrapped(*args,**kwargs)
File "/home/madtyn/venvs/blogger/lib/python3.8/site-packages/googleapiclient/http.py",line 915,in execute
raise HttpError(resp,content,uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 404 when requesting https://blogger.googleapis.com/v3/blogs/<blog_id>/posts?orderBy=UPDATED&status=DRAFT&alt=json returned "Not Found">
python-BaseException
解决方法
我可以重现此问题...添加status = DRAFT将返回404,但其他任何过滤器都可以正常工作...
-
尝试使用服务帐户和您的代码:404
-
已尝试使用API密钥,例如
result = requests.get('https://blogger.googleapis.com/v3/blogs/<blog_id>/posts?status=DRAFT&orderBy=UPDATED&alt=json&key=<api_key>')
:404 -
从服务帐户中提取“ access_token”(通话后{
credentials.token
):result = requests.get('https://blogger.googleapis.com/v3/blogs/<blog_id>/posts?status=DRAFT&orderBy=UPDATED&alt=json&access_token=<extracted_service_account_token>')
:404
但是非常奇怪的是,如果我在这里https://developers.google.com/blogger/docs/3.0/reference/posts/list?apix_params={"blogId"%3A"blog_id"%2C"orderBy"%3A"UPDATED"%2C"status"%3A["DRAFT"]%2C"alt"%3A"json"}使用“尝试此API”给出的access_token ,就可以了!
在请求中使用该令牌使我的博客帖子处于草稿状态...
只需在脚本中复制/粘贴原始Authorization
标头:
import requests
blog_id = '<blog_id>'
headers = {
'Authorization' : 'Bearer <replace_here>'
}
# Using only Authorization header
result = requests.get(
'https://blogger.googleapis.com/v3/blogs/%s/posts?status=DRAFT&orderBy=UPDATED&alt=json' % (blog_id),headers=headers
)
print(result)
# This should print DRAFT if you have at least one draft post
print(result.json()['items'][0]['status'])
# Using "access_token" param constructed with Authorization header splited to have only token
result = requests.get('https://blogger.googleapis.com/v3/blogs/%s/posts?status=DRAFT&orderBy=UPDATED&alt=json&access_token=%s' % (blog_id,headers['Authorization'][len('Bearer '):]))
print(result)
# This should print DRAFT if you have at least one draft post
print(result.json()['items'][0]['status'])
我目前的结果:
该错误似乎不是来自库,而是来自令牌权限...但是,我通常也使用控制台来生成像您这样的访问。
总而言之,我认为这是错误或者是Google自愿提供的...我不知道“尝试使用此API”令牌有效的时间长短,但这是我找到文章草稿的唯一途径。 ..也许您可以尝试打开一个故障单,但是我不知道具体在哪里可以做到。