Googlemaps用于PythonRequests的业务身份验证问题

2024-09-27 00:21:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在将新的业务凭证合并到Python请求模块时遇到了问题,我以前一直使用免费用户API键来创建请求。你知道吗

我一直遵循Google给出的身份验证指导-(1)将基本URL解析为其路径和查询部分(2)将私钥解码为二进制(3)使用此私钥和使用HMAC SHA1的URL编码字符串创建签名(4)使用base64编码二进制签名

我的代码如下-

import requests
import csv
import json
import urlparse
import hashlib
import base64
import hmac
from pprint import pprint

url_raw = 'https://maps.googleapis.com/maps/api/directions/json&client=REMOVED'
Private_Key = 'REMOVED'

with open('./Origins.csv', 'rU') as csvfile:
    reader = csv.DictReader(csvfile)
    origincoords = ['{Y},{X}'.format(**row) for row in reader]

with open('./Destinations.csv', 'rU') as csvfile:
    reader = csv.DictReader(csvfile)
    destinationcoords = ['{Y},{X}'.format(**row) for row in reader]

results=[] 

url = urlparse.urlparse('url_raw')

url_to_sign = url.path + '?' + url.query

decodedKey = base64.urlsafe_b64decode(Private_Key)

signature = hmac.new(decodedKey, url_to_sign, hashlib.sha1)

encodedSignature = base64.urlsafe_b64encode(signature.digest())

originalUrl = url.scheme + "://" + url.netloc + url.path + '?' + url.query

Full_URL = originalUrl + "&signature=" + encodedSignature

for i in range(0,(len(origincoords))):
    params ={'origin': origincoords[i],
          'destination': destinationcoords[i],
          'encodedSignature': encodedSignature}

    directions = requests.get(Full_URL, params=params).json()
    results.append(directions)

在这一点上,我解析了我的研究相关信息的结果。感谢@fredtantini之前的帮助。你知道吗

我当前收到的错误消息与请求.异常,说明我没有使用有效的架构。但是,在我的代码中,我包含了url.scheme方案在originalUrl变量中,该变量构成请求生成中使用的完整URL的一部分。你知道吗


Tags: csvcsvfileinimportjsonurlforreader
1条回答
网友
1楼 · 发布于 2024-09-27 00:21:43

您没有解析url_raw的值。您正在用内容'url_raw'分析字符串

url = urlparse.urlparse('url_raw')

删除url_raw周围的引号,您希望解析与变量关联的值,而不是一个恰好包含与变量名相等的文本的字符串。你知道吗

演示:

>>> import urlparse
>>> url_raw = 'https://maps.googleapis.com/maps/api/directions/json&client=REMOVED'
>>> urlparse.urlparse('url_raw')
ParseResult(scheme='', netloc='', path='url_raw', params='', query='', fragment='')
>>> urlparse.urlparse(url_raw)
ParseResult(scheme='https', netloc='maps.googleapis.com', path='/maps/api/directions/json&client=REMOVED', params='', query='', fragment='')

注意在第一种情况下scheme是一个空字符串,而在解析实际URL时,scheme被设置为'https'。你知道吗

接下来,您需要为查询字符串生成整个的签名,而不仅仅是路径加上客户机id

通过创建一个准备的请求,之后附加查询参数,您可以实现这一点:

session = requests.Session()

for origin, destination in zip(origincoords, destinationcoords):
    params ={'origin': origin, 'destination': destination}
    request = requests.Request('GET', Full_URL, params=params).prepare()
    parsed_url = urlparse.urlparse(request.url)
    signature = hmac.new(decodedKey, '{}?{}'.format(parsed_url.path, parsed_url.query),
                         hashlib.sha1).digest()
    request.prepare_url(request.url, {'signature': base64.urlsafe_b64encode(signature)})
    response = session.send(request)
    directions = response.json()

    results.append(directions)

这将使用^{} object为我们生成URL,因此我们可以再次解析它以便于签名。然后^{} method允许我们将签名添加到该对象的URL,之后我们可以轻松地将其与session对象一起发送。你知道吗

相关问题 更多 >

    热门问题