好搜的登录过程和搜狗,神马和百度是完全不一样的。因为他的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
#!/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
分享到: