【问题标题】:GAE google books apiGAE 谷歌图书 api
【发布时间】:2016-04-22 20:53:20
【问题描述】:

我正在使用 Python 2.7.11 制作一个 GAE 应用程序。这是我第一个构建 GAE 应用程序的项目,我也是 Web 开发的新手。 Link here。我正在尝试访问 Google Book 的 API 以检索图书信息。在本地部署时,一切都完美无缺。我在搜索字段中输入一本书的名字,我的处理程序飞走,点击 2 个 Google API(搜索,然后是音量),解析结果并将其附加到页面。

当我将我的应用程序部署到 GAE 时,我收到以下错误(带有堆栈跟踪):

   Traceback (most recent call last):
     File         "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~my-life-app/1.392279800807967905/myapp.py", line 320, in post
    response_body = urlopen(request).read()
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden

这是我执行 API 调用的代码部分。 (很草率,抱歉。我在清理代码之前一直在尝试解决这个问题)。

  headers = {'Accept': 'application/json'}      
  book = Book(parent=books_key)
  book.name = self.request.get('name')
  googleBookSearch = "https://www.googleapis.com/books/v1/volumes?q="
  googleBookVol = "https://www.googleapis.com/books/v1/volumes/ID"
  escapedBookName = urllib.quote(book.name)
  apiCall = googleBookSearch + escapedBookName + "&" + api_key2
  request = Request(apiCall, headers=headers)
  response_body = urlopen(request).read()
  parsed_book = json.loads(response_body)
  if parsed_book['totalItems'] != 0:
    volumeID = parsed_book['items'][0]['id']
    googleBookVol = googleBookVol.replace("ID", volumeID)
    googleBookVol = googleBookVol + "?" + api_key2
    logging.info(googleBookVol)
    request = Request(googleBookVol, headers=headers)
    response_body = urlopen(request).read()
    response_body = json.loads(response_body)
    book.name = response_body['volumeInfo']['title']
    pageCount = response_body['volumeInfo']['pageCount']
    book.pages = int(pageCount)
    bookCover = response_body['volumeInfo']['imageLinks']['smallThumbnail']
    book.cover = str(bookCover)
    book.published = str(response_body['volumeInfo']['publishedDate'])
    book.author = str(response_body['volumeInfo']['authors'][0])
    book.put()
    self.redirect("/books")

根据 Google 的 API 文档,这些 API 仅用于访问公共数据,因此不需要 OAuth 或 API 密钥。不用说,那没有用。我添加了我的 API 密钥,但仍然无法正常工作。我已经从开发者控制台启用了 Google Books API。留给我的唯一东西是 Oauth,但我头晕目眩,试图阅读一页又一页的文档,其中一些文档彼此大不相同,所以我不知道要实现什么。 Web 应用程序不需要任何类型的登录,API 请求仅使用公共数据。谢谢。

有人可以帮忙吗?

编辑:这是我从 Cloud Console 日志中提取的从 Google 返回的日志部分。第一部分是确切的 URL,如 logging.info 所示。

https://www.googleapis.com/books/v1/volumes?q=Pale+Blue+Dot&key=AIzaSyD9o4jKfQvvCAr8glvom4llEAssu8ojmgk

{
metadata:
{
severity:
"ERROR"
projectId:
"598422355661"
serviceName:
"appengine.googleapis.com"
zone:
"us6"
labels:
{…}
timestamp:
"2016-04-23T17:40:38.988615Z"
projectNumber:
"598422355661"
}
protoPayload:
{
@type:
"type.googleapis.com/google.appengine.logging.v1.RequestLog"
appId:
"s~my-life-app"
versionId:
"1"
requestId:
"571bb39600ff0f15c71037dd9b0001737e6d792d6c6966652d617070000131000100"
ip:
"189.61.48.66"
startTime:
"2016-04-23T17:40:38.988615Z"
endTime:
"2016-04-23T17:40:39.020226Z"
latency:
"0.031611s"
megaCycles:
"20"
method:
"POST"
resource:
"/sign"
httpVersion:
"HTTP/1.1"
status:
500
responseSize:
"870"
referrer:
"http://my-life-app.appspot.com/books"
userAgent:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
urlMapEntry:
"myapp.app"
host:
"my-life-app.appspot.com"
cost:
1.29081e-7
instanceIndex:
-1
instanceId:
"00c61b117cb28d6a28da9eadf0f9ad4279a74be43a1ca345cb"
line:
[
0:
{
time:
"2016-04-23T17:40:38.991900Z"
severity:
"INFO"
logMessage:
"https://www.googleapis.com/books/v1/volumes?q=Pale+Blue+Dot&key=AIzaSyD9o4jKfQvvCAr8glvom4llEAssu8ojmgk"
}
1:
{
time:
"2016-04-23T17:40:39.011339Z"
severity:
"ERROR"
logMessage:
"HTTP Error 403: Forbidden
Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~my-life-app/1.392300489206286534/myapp.py", line 333, in post
    response_body = urlopen(request).read()
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden"
}
]
appEngineRelease:
"1.9.36"
}
insertId:
"2016-04-23|10:40:40.411640-07|10.106.197.137|1661671430"
log:
"appengine.googleapis.com/request_log"
httpRequest:
{
status:
500
}
operation:
{
id:
"571bb39600ff0f15c71037dd9b0001737e6d792d6c6966652d617070000131000100"
producer:
"appengine.googleapis.com/request_id"
}
}

【问题讨论】:

  • 您能否提供来自 Google Book API 的完整响应?
  • 谢谢,请尝试在您的查询字符串中添加&country=US(或您所在的国家/地区)。
  • 哇,成功了。好心疼!这几天一直困扰着我。我不记得在原籍国的文件中阅读需要在那里,但也许我错过了一些东西。非常感谢!

标签: python api google-app-engine google-books


【解决方案1】:

对于未来的奋斗者,请确保在您的请求中添加适当的国家/地区字符串

&国家=美国

Books API 使用客户端的 IP 地址来定位用户。由于我们必须遵守各个国家/地区的版权法,并拥有发布商针对特定国家/地区的权利,因此我们需要了解请求来自哪个国家/地区,以便提供适当的内容。

source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2016-11-24
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多