快手sig签名,python版,可用于快手关键字搜索结果采集

很多大佬分享了快手sig参数逆向破解的过程,我只是在大佬的基础上把sig加密部分代码转成python。
sig生成原理:把url问号后面的参数转成dict,同时把form_data参数放在同一个dict,然后对dict进行排序,排序后转成字符串并且加salt,最后进行md5加密就可以了。

  1. 把url参数转为dict
def get_map_from_string(str):
    """
    把url的参数转为dict
    :param str:
    :return:
    """
    map = {
     }
    str_list = str.split('&')
    for data in str_list:
        item = data.split('=')
        map[item[0]] = item[1]
    return map
  1. 把url参数dict和form_data合并为一个dict并排序,转为字符串,然后加盐
def get_url_str(map1,map2,salt = '382700b563f4'):
    """
    把url参数和formdata参数排序,加盐,返回字符串
    :param map1:url参数dict
    :param map2:formdata参数dict
    :param salt:盐,默认382700b563f4,也有可能会变动
    :return:
    """
    map = dict(map1,**map2)
    aps = sorted(map.items(), key = lambda d: d[0])
    data = {
     }
    for i in aps:
        if i[0] == 'sig' or i[0] == '__NS_sig3' or i[0] == '__NStokensig':
            pass
        else:
            data.update(dict({
     i[0]:i[1]}))
    url_str = ""
    for key,value in data.items():
        str = key + '=' + unquote(value)
        url_str += str
    return url_str + salt

3 md5加密

def data_md5(content):
    m = hashlib.md5()
    m.update(content.encode("utf-8"))
    return m.hexdigest()

def create_sig(query_str,post_arr):
    url_arr = get_map_from_string(query_str)
    str = get_url_str(url_arr, post_arr)
    return data_md5(str)

url的部分参数是会变的,所以sig也会失效,有效期不超过两天。

你可能感兴趣的:(python爬虫)