lbs.client.baidu 源代码

# encoding: utf-8
from __future__ import absolute_import, unicode_literals

import hashlib
from six.moves.urllib.parse import urlencode, quote
from collections import OrderedDict

from lbs.client.base import BaseClient
from lbs.core.utils import to_binary


[文档]class BaiduMapClient(BaseClient): API_BASE_URL = "http://api.map.baidu.com/" def __init__(self, ak, sk=None, timeout=None): """ 百度地图服务 :param ak: 百度地图 ak :param sk: 百度地图 sk :param timeout: 请求过期时间 """ super(BaiduMapClient, self).__init__(timeout) self.ak = ak self.sk = sk def _calc_sn(self, data, uri): if isinstance(data, dict): data = urlencode(data) encode_str = "%s?%s%s" % (uri, data, self.sk) return hashlib.md5(to_binary(quote(encode_str))).hexdigest() def _handle_pre_request(self, method, uri, kwargs): if 'data' in kwargs and isinstance(kwargs['data'], dict): kwargs['data']['ak'] = self.ak if self.sk: kwargs['data'] = OrderedDict(sorted(kwargs['data'].items())) kwargs['data']['sn'] = self._calc_sn(uri, kwargs['data']) else: kwargs.setdefault("params", dict()) kwargs['params']['ak'] = self.ak if self.sk: params = kwargs.pop("params", dict()) query_string = urlencode(params) sn = self._calc_sn(uri, query_string) uri += '?' + urlencode(params) + '&sn=' + sn return method, uri, kwargs def _handle_result(self, res, method=None, url=None, **kwargs): result = super(BaiduMapClient, self)._handle_result(res, method=method, url=url, **kwargs) result = self._parse_error_code(url, kwargs, res, result, 'message', 'status', 0, code_type=int) return result