解决百度地图{"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

猜你喜欢

转载自blog.csdn.net/wukai0909/article/details/86179303