2017-04-01 106 views
3
import json 
import requests 
import urllib 

url = "https://developers.google.com/qpx-express/v1/trips/search?key=<API_key>" 
headers = {'content-type': 'application/json'} 

params = { 
    "request": { 
    "slice": [ 
     { 
     "kind": "qpxexpress#sliceInput", 
     "origin": "BOS", 
     "destination": "SFO", 
     "date": "2017-06-30" 
     } 
    ], 
    "passengers": { 
     "kind": "qpxexpress#passengerCounts", 
     "adultCount": 1, 
    }, 
    "refundable": "false", 
    "solutions": 20, 
    } 
} 

#jsonreq = json.dumps(params) 

data = urllib.parse.urlencode(params) 
binary_data = data.encode('utf-8') 
req = urllib.request.Request(url, binary_data) 
flight = urllib.request.urlopen(req) 
response = flight.read() 
print(response) 

我想检索机票价格,但谷歌API不断给我HTTP错误403:禁止。谷歌QPX Express API返回HTTP错误403:禁止 - Python

我检查了我的Developers控制台并启用了QPX Express API。另外,我生成了一个没有限制的API_key。

以下是错误:

HTTPError         Traceback (most recent call last) 
<ipython-input-189-cc6dee70b145> in <module>() 
    31 binary_data = data.encode('utf-8') 
    32 req = urllib.request.Request(url, binary_data) 
---> 33 flight = urllib.request.urlopen(req) 
    34 response = flight.read() 
    35 print(response) 

C:\Anaconda3\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context) 
    161  else: 
    162   opener = _opener 
--> 163  return opener.open(url, data, timeout) 
    164 
    165 def install_opener(opener): 

C:\Anaconda3\lib\urllib\request.py in open(self, fullurl, data, timeout) 
    470   for processor in self.process_response.get(protocol, []): 
    471    meth = getattr(processor, meth_name) 
--> 472    response = meth(req, response) 
    473 
    474   return response 

C:\Anaconda3\lib\urllib\request.py in http_response(self, request, response) 
    580   if not (200 <= code < 300): 
    581    response = self.parent.error(
--> 582     'http', request, response, code, msg, hdrs) 
    583 
    584   return response 

C:\Anaconda3\lib\urllib\request.py in error(self, proto, *args) 
    508   if http_err: 
    509    args = (dict, 'default', 'http_error_default') + orig_args 
--> 510    return self._call_chain(*args) 
    511 
    512 # XXX probably also want an abstract factory that knows when it makes 

C:\Anaconda3\lib\urllib\request.py in _call_chain(self, chain, kind, meth_name, *args) 
    442   for handler in handlers: 
    443    func = getattr(handler, meth_name) 
--> 444    result = func(*args) 
    445    if result is not None: 
    446     return result 

C:\Anaconda3\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs) 
    588 class HTTPDefaultErrorHandler(BaseHandler): 
    589  def http_error_default(self, req, fp, code, msg, hdrs): 
--> 590   raise HTTPError(req.full_url, code, msg, hdrs, fp) 
    591 
    592 class HTTPRedirectHandler(BaseHandler): 

HTTPError: HTTP Error 403: Forbidden 

回答

3

你确定你使用的是正确的网址是什么?我原本和你有同样的问题,但发现下面的代码有效。我也在使用请求,这使得传递JSON更直接。

import requests 
url='https://www.googleapis.com/qpxExpress/v1/trips/search?key=%s'%google_api_key 

params = {"request": { 
    "slice": [{"kind": "qpxexpress#sliceInput", 
       "origin": "BOS", 
       "destination": "SFO", 
       "date": "2017-06-30"}], 
    "passengers": {"kind": "qpxexpress#passengerCounts", 
       "adultCount": 1,}, 
    "refundable": "false", 
    "solutions": 20,} 
    } 

requests.post(url, json=params, headers = {'content-type': 'application/json'})