def _get_params(self, endpoint, **kwargs): """构造请求参数""" params = dict(orderid=self.auth.orderId) params.update(kwargs) sign_type = kwargs.get('sign_type', None) if not sign_type: return params if not self.auth.apiKey: raise KdlNameError("api key is required for signature") if sign_type == "simple": params['signature'] = self.auth.apiKey elif sign_type == "hmacsha1": params['timestamp'] = int(time.time()) if endpoint == EndPoint.SetIpWhitelist.value: raw_str = self.auth.get_string_to_sign("POST", endpoint, params) else: raw_str = self.auth.get_string_to_sign("GET", endpoint, params) params["signature"] = self.auth.sign_str(raw_str) else: raise KdlNameError("unknown sign_type {}".format(sign_type)) return params
def get_proxy(self, num=None, order_level=OpsOrderLevel.NORMAL, sign_type="simple", **kwargs): """获取开放代理, 默认不需要鉴权 :param num: 提取数量, sign_type: 鉴权方式, order_level: 开放代理订单类型 :param kwargs: 其他关键字参数,具体有那些参数请查看帮助中心api说明 :return 若为json格式, 则返回data中proxy_list部分, 即proxy列表, 否则原样返回 """ if num is None: raise KdlNameError("miss param: num") if not isinstance(num, int): KdlTypeError("num should be a integer") endpoint = EndPoint.GetOpsProxyNormalOrVip.value if order_level == OpsOrderLevel.SVIP: endpoint = EndPoint.GetOpsProxySvip.value if order_level == OpsOrderLevel.PRO: endpoint = EndPoint.GetOpsProxyEnt.value params = self._get_params(endpoint, num=num, sign_type=sign_type, **kwargs) res = self._get_base_res("GET", endpoint, params) if isinstance(res, dict): return res['data']['proxy_list'] return res
def query_kps_city(self, serie, **kwargs): """查询独享代理有哪些城市可供开通。对于IP共享型还可查询到每个城市可开通的IP数量。 :return: """ if not serie: raise KdlNameError('miss params: serie') endpoint = EndPoint.QueryKpsCity.value params = self._get_params(endpoint, serie=serie, sign_type="hmacsha1", **kwargs) res = self._get_base_res("GET", endpoint, params) return res
def set_auto_renew(self, autorenew, **kwargs): """开启/关闭自动续费 :return: """ if not autorenew: raise KdlNameError('miss param: autorenew') endpoint = EndPoint.SetAutoRenew.value params = self._get_params(endpoint, autorenew=autorenew, sign_type="hmacsha1", **kwargs) res = self._get_base_res("GET", endpoint, params) return res
def create_order(self, product, pay_type, **kwargs): """创建订单,自动从账户余额里结算费用 :return: """ if not (product and pay_type): raise KdlNameError('miss param: product or pay_type') endpoint = EndPoint.CreateOrder.value params = self._get_params(endpoint, product=product, pay_type=pay_type, sign_type="hmacsha1", **kwargs) res = self._get_base_res("GET", endpoint, params) return res
def check_ops_valid(self, proxy=None, sign_type="simple", **kwargs): """检测开放代理有效性, 强制签名验证 :return 返回data部分, 格式为由'proxy: True/False'组成的列表 """ if not proxy: raise KdlNameError("miss param: proxy") if not (isinstance(proxy, list) or isinstance(proxy, tuple) or isinstance(proxy, str)): raise KdlTypeError("proxy should be a instance of list or tuple or str") if isinstance(proxy, list) or isinstance(proxy, tuple): proxy = ','.join(proxy) endpoint = EndPoint.CheckOpsValid.value params = self._get_params(endpoint, proxy=proxy, sign_type=sign_type) res = self._get_base_res("GET", endpoint, params) if isinstance(res, dict): return res['data'] return res
def get_kps(self, num=None, sign_type="simple", **kwargs): """获取独享代理, 默认"simple"鉴权 :param num: 提取数量, sign_type: 鉴权方式 :param kwargs: 其他关键字参数,具体有那些参数请查看帮助中心api说明 :return 若为json格式, 则返回data中proxy_list部分, 即proxy列表, 否则原样返回 """ if num is None: raise KdlNameError("miss param: num") if not isinstance(num, int): KdlTypeError("num should be a integer") endpoint = EndPoint.GetKpsProxy.value params = self._get_params(endpoint, num=num, sign_type=sign_type, **kwargs) res = self._get_base_res("GET", endpoint, params) if isinstance(res, dict): return res['data']['proxy_list'] return res
def set_ip_whitelist(self, iplist=None, sign_type="simple"): """ 设置订单的ip白名单, 强制签名验证 :param iplist参数类型为 str 或 list 或 tuple 如果为字符串则ip之间用逗号隔开 :return 成功则返回True, 否则抛出异常 """ if iplist is None: raise KdlNameError("miss param: iplist") if not (isinstance(iplist, list) or isinstance(iplist, tuple) or isinstance(iplist, str)): raise KdlTypeError("iplist type error, should be a instance of list or tuple or str") if isinstance(iplist, list) or isinstance(iplist, tuple): iplist = ','.join(iplist) endpoint = EndPoint.SetIpWhitelist.value params = self._get_params(endpoint, iplist=iplist, sign_type=sign_type) self._get_base_res("POST", endpoint, params) return True
def get_tps(self, num=None, sign_type="simple", **kwargs): """获取隧道代理IP, 默认"simple"鉴权 https://www.kuaidaili.com/doc/api/gettps/ :param num : 提取数量,int类型 :param kwargs: 其他关键字参数,具体有那些参数请查看帮助中心api说明 :return 若为json格式, 则返回data中proxy_list部分, 即proxy列表, 否则原样返回 """ if num is None: raise KdlNameError("miss param: num") if not isinstance(num, int): KdlTypeError("num should be a integer") endpoint = EndPoint.GetTps.value params = self._get_params(endpoint, num=num, sign_type=sign_type, **kwargs) res = self._get_base_res("GET", endpoint, params) if isinstance(res, dict): return res['data']['proxy_list'] return res
def get_dps_valid_time(self, proxy=None, sign_type="simple", **kwargs): """获取私密代理ip有效时间 :param proxy: 私密代理列表, 格式: IP:PORT, eg: 113.120.61.166:22989,122.4.44.132:21808 :param sign_type: 认证方式 :return: 返回data部分, 格式为由'proxy: seconds(剩余秒数)'组成的列表 """ if not proxy: raise KdlNameError("miss param: proxy") if not (isinstance(proxy, list) or isinstance(proxy, tuple) or isinstance(proxy, str)): raise KdlTypeError("proxy should be a instance of list or tuple or str") if isinstance(proxy, list) or isinstance(proxy, tuple): proxy = ','.join(proxy) endpoint = EndPoint.GetDpsValidTime.value params = self._get_params(endpoint, proxy=proxy, sign_type=sign_type) res = self._get_base_res("GET", endpoint, params) if isinstance(res, dict): return res['data'] return res
def wrapper(self, *args, **kwargs): if not self.auth.apiKey: raise KdlNameError("apiKey is required for signature") return func(self, *args, **kwargs)