Python 解決百度地圖{"status":211,"message":"APP SN校驗失敗"},如何計算SN值

 

 

狀態碼定義

狀態碼 定義 註釋
0 正常  
1 服務器內部錯誤 該服務響應超時或系統內部錯誤,請留下聯繫方式
10 上傳內容超過8M Post上傳數據不能超過8M
101 AK參數不存在 請求消息沒有攜帶AK參數
102 MCODE參數不存在,mobile類型mcode參數必需 對於Mobile類型的應用請求需要攜帶mcode參數,該錯誤碼代表服務器沒有解析到mcode
200 APP不存在,AK有誤請檢查再重試 根據請求的ak,找不到對應的APP
201 APP被用戶自己禁用,請在控制檯解禁  
202 APP被管理員刪除 惡意APP被管理員刪除
203 APP類型錯誤 當前API控制檯支持Server(類型1), Mobile(類型2, 新版控制檯區分爲Mobile_Android(類型21)及Mobile_IPhone(類型22))及Browser(類型3),除此之外其他類型認爲是APP類型錯誤
210 APP IP校驗失敗 在申請SERVER類型應用的時候選擇IP校驗,需要填寫IP白名單,如果當前請求的IP地址不在IP白名單或者不是0.0.0.0/0就認爲IP校驗失敗

211

APP SN校驗失敗

SERVER類型APP有兩種校驗方式IP校驗和SN校驗,當用戶請求的SN和服務端計算出來的SN不相等的時候提示SN校驗失敗

220 APP Referer校驗失敗 瀏覽器類型的APP會校驗referer字段是否存且切在referer白名單裏面,否則返回該錯誤碼
230 APP Mcode碼校驗失敗 服務器能解析到mcode,但和數據庫中不一致,請攜帶正確的mcode
240 APP 服務被禁用 用戶在API控制檯中創建或設置某APP的時候禁用了某項服務,若需開通權限,可進入API控制檯爲AK勾選對應服務
250 用戶不存在 根據請求的user_id, 數據庫中找不到該用戶的信息,請攜帶正確的user_id
251 用戶被自己刪除 該用戶處於未激活狀態
252 用戶被管理員刪除 惡意用戶被加入黑名單
260 服務不存在 服務器解析不到用戶請求的服務名稱
261 服務被禁用 該服務已下線
301 永久配額超限,限制訪問 配額超限,如果想增加配額請聯繫我們
302 天配額超限,限制訪問 配額超限,如果想增加配額請聯繫我們
401 當前併發量已經超過約定併發配額,限制訪問 併發控制超限,請控制併發量或聯繫我們
402 當前併發量已經超過約定併發配額,並且服務總併發量也已經超過設定的總併發配額,限制訪問 併發控制超限,請控制併發量或聯繫我們

網址:http://lbsyun.baidu.com/apiconsole/key,如下

點擊:設置,如下圖

sn計算算法,網址:http://lbsyun.baidu.com/index.php?title=webapi/appendix

javascript中一般採用encodeURIComponent函數對特殊字符進行編碼。

Java中可以使用函數URLEncoder.encode對特殊字符進行編碼。

C#中可以使用函數HttpUtility.UrlEncode對特殊字符進行編碼。

php中可以使用函數urlencode對特殊字符進行編碼。

 

Python計算SN算法如下,python 2.7參考代碼:

填入自己的AK和SK,計算出自己的SN

# -*- coding: utf-8 -*- 
# 第一行必須有,否則報中文字符非ascii碼錯誤
import urllib
import hashlib

# 以get請求爲例http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak
queryStr = '/geocoder/v2/?address=百度大廈&output=json&ak=yourak'

# 對queryStr進行轉碼,safe內的保留字符不轉換
encodedStr = urllib.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")

# 在最後直接追加上yoursk
rawStr = encodedStr + 'yoursk'

# md5計算出的sn值7de5a22212ffaa9e326444c75a58f9a0
# 最終合法請求url是http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
print hashlib.md5(urllib.quote_plus(rawStr)).hexdigest()

 

http://api.map.baidu.com/geocoder/v2/?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=你的AK&sn=你的SN



得到結果:
{"status":0,"result":{"location":{"lng":116.30788068028267,"lat":40.05705856845244},"precise":1,"confidence":80,"comprehension":100,"level":"商務大廈"}}

由於 SN的計算結果與要查詢的字符串相關,SN不是固定的,每次都是變動的。

所以每次都得重新計算SN的值。

如下代碼是計算SN值,並得到URL的程序:

# -*- coding: utf-8 -*-
import urllib
import hashlib
import json
def get_urt(address):
    # 以get請求爲例http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=你的ak
    queryStr = '/geocoder/v2/?address=%s&output=json&ak=mAiGweYSlAt0pGYDOetmyOByRUEzpiSG' % address
    # 對queryStr進行轉碼,safe內的保留字符不轉換
    encodedStr = urllib.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
    # 在最後直接追加上yoursk
    rawStr = encodedStr + 'Rx2n282wzMACr4Iu1tNvPxmWFjC9VTOL'
    # 計算sn
    sn = (hashlib.md5(urllib.quote_plus(rawStr).encode("utf8")).hexdigest())
    # 由於URL裏面含有中文,所以需要用parse.quote進行處理,然後返回最終可調用的url
    url = urllib.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    return url

url = get_urt('高新興創聯科技有限公司')
print url
data = urllib.urlopen(url);
print data
hjson = json.loads(data.read());
print 'hjson=  ',hjson
print 'hjson[result]=  ',hjson['result']
if hjson['status'] == 0:
        result = hjson['result'];
        # for m in range(1,len(result)):# 提取返回的結果
        #     print result[m];
        print result['level']
        print result['location']

 

得到的結果:

http://api.map.baidu.com/geocoder/v2/?address=%E9%AB%98%E6%96%B0%E5%85%B4%E5%88%9B%E8%81%94%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&output=json&ak=mAiGweYSlAt0pGYDOetmyOByRUEzpiSG&sn=60f61bc1d6573cdf01618f6530a5b1bd
<addinfourl at 124534456 whose fp = <socket._fileobject object at 0x03495C30>>
hjson=   {u'status': 0, u'result': {u'precise': 0, u'confidence': 16, u'level': u'\u533a\u53bf', u'location': {u'lat': 45.81349359029997, u'lng': 130.89318834855956}, u'comprehension': 65}}
hjson[result]=   {u'precise': 0, u'confidence': 16, u'level': u'\u533a\u53bf', u'location': {u'lat': 45.81349359029997, u'lng': 130.89318834855956}, u'comprehension': 65}
區縣
{u'lat': 45.81349359029997, u'lng': 130.89318834855956}

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章