Heim >Backend-Entwicklung >Python-Tutorial >Einführung in die Methode der Python-Simulation der Weibo-Anmeldung (mit Code)
Dieser Artikel bietet Ihnen eine Einführung in die Methode zur Simulation der Weibo-Anmeldung (mit Code). Freunde in Not können sich darauf beziehen . Hilft.
Heute möchte ich ein Tool zum Crawlen persönlicher Seiten auf Weibo erstellen, um einige tiefere Geheimnisse zu lüften. Dann erledigen Sie zuerst das, was Sie unbedingt tun müssen! Simulierte Anmeldung...
Ich habe den Code optimiert, ihn in die Python 3.6-Version rekonstruiert und viele Kommentare hinzugefügt, um das Lernen für alle zu erleichtern.
Beim Anmelden bei Sina Weibo vom PC aus werden der Benutzername und das Passwort mit js auf dem Client vorverschlüsselt, und vor dem POST wird eine Reihe von Parametern abgerufen, die auch als verwendet werden Teil von POST_DATA. Auf diese Weise können Sie die übliche einfache Methode zur Simulation der POST-Anmeldung (z. B. Renren) nicht verwenden.
1. Vor dem Absenden der POST-Anfrage ist GET erforderlich, um zwei Parameter abzurufen.
Die Adresse lautet:
http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
In den Daten erhalten Die Werte von Servertime und Nonce sind zufällig, und andere Werte scheinen keinen Nutzen zu haben.
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. Beobachten Sie die POST-Daten über httpfox. Die Parameter sind komplexer, wobei „su“ der verschlüsselte Benutzername und sp das verschlüsselte Passwort ist. Serverzeit und Nonce werden aus dem vorherigen Schritt abgerufen. Andere Parameter bleiben unverändert.
Benutzername wurde von BASE64 berechnet:
username = base64.encodestring( urllib.quote(username) )[:-1]
Passwort wurde dreimal SHA1-verschlüsselt und die Werte Servertime und Nonce wurden hinzugefügt, um zu stören.
Das heißt: Fügen Sie nach der zweimaligen SHA1-Verschlüsselung die Serverzeit- und Nonce-Werte zum Ergebnis hinzu und berechnen Sie dann SHA1 erneut.
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. Organisieren Sie die Parameter und stellen Sie eine POST-Anfrage. Seitdem gab es keine erfolgreiche Anmeldung mehr.
Der nach dem POST erhaltene Inhalt enthält den Satz:
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")
Dies ist das Ergebnis, wenn die Anmeldung fehlschlägt. Das Ergebnis nach erfolgreicher Anmeldung ist ähnlich, aber der Wert von retcode ist 0.
Als nächstes fordern Sie diese URL an und Sie werden sich erfolgreich bei Weibo anmelden.
Denken Sie daran, den Cache im Voraus zu erstellen.
Das obige ist der detaillierte Inhalt vonEinführung in die Methode der Python-Simulation der Weibo-Anmeldung (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!