Python中的Google Map API签名生成

时间:2013-11-01 15:04:00

标签: python google-maps

我基本上做了以下事情: https://developers.google.com/maps/documentation/business/webservices/auth

在我的MacBook上的Python 2.7.3和Windows 64位服务器环境中的2.7.5上,我无法重现正确的签名,而我完全按照原始示例。我做了这样的函数:

import sys
import hashlib
import urllib
import hmac
import base64
import urlparse

def process_url(input_url, private_key):
    print("URL To Sign: " + input_url)
    url = urlparse.urlparse(input_url)
    print("Private Key: " + private_key)
    url_to_sign = url.path + "?" + url.query
    print("Original Path + Query: " + url_to_sign)
    decoded_key = base64.urlsafe_b64decode(private_key)
    signature = hmac.new(decoded_key, url_to_sign, hashlib.sha1)
    encodedSignature = base64.urlsafe_b64encode(signature.digest())
    print("B64 Signature: " + encodedSignature)
    original_url = url.scheme + "://" + url.netloc + url.path + "?" + url.query
    full_url = original_url + "&signature=" + encodedSignature
    print "Full URL: " + full_url
    return full_url

现在根据谷歌提供以下内容:

但是,当我执行以下操作时:

process_url('http://maps.googleapis.com/maps/api/geocode/json?address=New+York&sensor=false&client={clientID}', 'vNIXE0xscrmjlyV-12Nj_BvUPaw=')

我明白了:

所以我得到“WlcBIkr9WMB9uPhXWmAGcjG_2M4 =”而不是“KrU1TzVQM7Ur0i8i7K3huiw3MsA =”。我发誓过去常常这样做,但我在不同的系统中始终如一地获得这个新的W值。

有没有人知道我做错了什么?页面是不正确还是我做了一些基本不正确的事情?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事,你正在签署不同的数据,从而获得不同的签名。

在Google示例中,如果您复制并粘贴,您会注意到剪贴板中省略了大括号;所以它签署了以下网址:

http://maps.googleapis.com/maps/api/geocode/json?address=New+York&sensor=false&client=clientID

但是当你尝试它时,你会逐字复制它,包括大括号:

http://maps.googleapis.com/maps/api/geocode/json?address=New+York&sensor=false&client={clientID}

所以高兴自己,你的代码是正确的,唯一的问题是样本数据!