Cet article vous apporte une introduction à la méthode de simulation de connexion Python à Weibo (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. . Aide.
Aujourd'hui, je souhaite créer un outil permettant d'explorer des pages personnelles sur Weibo afin de satisfaire certains secrets ultérieurs. Alors faites d’abord cette chose incontournable ! Connexion simulée...
J'ai optimisé le code, l'ai reconstruit en version Python 3.6, et ajouté de nombreux commentaires pour faciliter l'apprentissage de chacun.
Lors de la connexion à Sina Weibo depuis un PC, le nom d'utilisateur et le mot de passe sont pré-chiffrés à l'aide de js sur le client, et un ensemble de paramètres sera GET avant POST, qui sera également utilisé comme partie de POST_DATA. De cette façon, vous ne pouvez pas utiliser la méthode simple habituelle pour simuler la connexion POST (comme Renren).
1. Avant de soumettre la requête POST, GET doit obtenir deux paramètres.
L'adresse est :
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
Dans les données obtenu Il y a des valeurs de temps de serveur et de nonce, qui sont aléatoires, et d'autres valeurs semblent inutiles.
def get_servertime(): url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939' # 返回出来的是一个Response对象,无法直接获取,text后,可以通过正则匹配到 # 大概长这样子的:sinaSSOController.preloginCallBack({"retcode":0,"servertime":1545606770, ...}) data = requests.request('GET', url).text p = re.compile('\((.*)\)') try: json_data = p.search(data).group(1) data = json.loads(json_data) servertime = str(data['servertime']) nonce = data['nonce'] return servertime, nonce except: print('获取 severtime 失败!') return None
2. Observez les données POST via httpfox Les paramètres sont plus complexes, où "su" est le nom d'utilisateur crypté et sp est le mot de passe crypté. l'heure du serveur et le nonce sont obtenus à partir de l'étape précédente. Les autres paramètres restent inchangés.
le nom d'utilisateur a été calculé par BASE64 :
username = base64.encodestring( urllib.quote(username) )[:-1]
le mot de passe a été crypté en SHA1 trois fois, et les valeurs de servertime et nonce ont été ajoutées pour interférer.
C'est-à-dire : après le cryptage SHA1 deux fois, ajoutez les valeurs servertime et nonce au résultat, puis calculez à nouveau SHA1.
def get_pwd(pwd, servertime, nonce): # 第一次计算,注意Python3 的加密需要encode,使用bytes pwd1 = hashlib.sha1(pwd.encode()).hexdigest() # 使用pwd1的结果在计算第二次 pwd2 = hashlib.sha1(pwd1.encode()).hexdigest() # 使用第二次的结果再加上之前计算好的servertime和nonce值,hash一次 pwd3_ = pwd2 + servertime + nonce pwd3 = hashlib.sha1(pwd3_.encode()).hexdigest() return pwd3 def get_user(username): # 将@符号转换成url中能够识别的字符 _username = urllib.request.quote(username) # Python3中的base64计算也是要字节 # base64出来后,最后有一个换行符,所以用了切片去了最后一个字符 username = base64.encodebytes(_username.encode())[:-1] return username
3. Organisez les paramètres et POSTez la demande. Depuis lors, aucune connexion n’a réussi.
Le contenu obtenu après le POST contient une phrase :
location.replace("http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4%ED%CE%F3")
Voici le résultat lorsque la connexion échoue. Le résultat une fois la connexion réussie est similaire, mais la valeur du retcode est 0. .
Ensuite, demandez cette URL et vous vous connecterez avec succès à Weibo.
N'oubliez pas de créer le cache à l'avance.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!