首页 » 开发 » python » python登录好搜360api接口遇到的坑

python登录好搜360api接口遇到的坑

 

好搜的登录过程和搜狗,神马和百度是完全不一样的。因为他的token是动态的。要10小时重新获取一次,这次的坑也就是卡在获取token的过程中。
主要是下面这个事情:

身份认证
申请通过后,调用api接口首先需要登录,登录分为客户登录和客服登录,请求相应接口,提供360账户名和加密后的密码,系统返回可用的AccessToken,密码加密方式如下:
1) 使用MD5对原始密码进行加密,加密结果为32位数字和小写字母;
2) 再用AES对称加密(AES模式为CBC,加密算法MCRYPT_RIJNDAEL_128)对MD5加密后的密码实现对称加密。秘钥是apiSecret 的前16位,向量是后16位,加密结果为64位数字和小写字母;

非常好理解,所以我已开始是直接找了在线aes加密的方式来使用。但是所有在线aes加密工具生成的结果都是提示错误。后来我才注意到因为他们的结果都是base64格式的,完全不符合只有数字和小写字母这样的要求。经查资料后,才知道是要用bin2hex 这样的方式来转换
然后参考了这两篇文章
https://blog.csdn.net/qq_34625397/article/details/97113019
https://blog.csdn.net/weixin_44336969/article/details/103491582

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hashlib
from Crypto.Cipher import AES
import base64
from binascii import b2a_hex

def create_md5_pwd(password):
    m = hashlib.md5()
    b = password.encode(encoding='utf-8')
    m.update(b)
    md5_pwd = m.hexdigest()
    return md5_pwd

class PrpCrypt(object):

    def __init__(self, API_SECRET):
        self.key = API_SECRET[:16].encode('gbk')  # 密匙
        self.iv = API_SECRET[16:].encode('gbk')  # 密匙向量

    def encrypt(self,text):
        # 加密
        mycipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        # 加密的明文长度必须为16的倍数,如果长度不为16的倍数,则需要补足为16的倍数
        # 将iv(密钥向量)加到加密的密文开头,一起传输
        ciphertext = self.iv + mycipher.encrypt(text.encode())
        return ciphertext  # 加密

    def decrypt(self,text):
        # 解密
        mydecrypt = AES.new(self.key, AES.MODE_CBC, text[:16])
        decrypttext = mydecrypt.decrypt(text[16:])
        decrypt_pwd = decrypttext.decode()  # 解密后数据
        return decrypt_pwd


if __name__ == '__main__':
    password = 'test'
    API_SECRET = "12345678912345678912345678912345"  # 点睛提供
    text = create_md5_pwd(password)
    pc = PrpCrypt(API_SECRET)  # 初始化密匙
    ciphertext = pc.encrypt(text)
    e = b2a_hex(ciphertext)[32:].decode()
    d = pc.decrypt(ciphertext)
    print('加密后:' + e)
    print('解密后:' + d)

————————————————
版权声明:本文为CSDN博主「'ゞBibo。」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44336969/article/details/103491582

原文链接:python登录好搜360api接口遇到的坑,转载请注明来源!

0