Wie wir alle wissen, nutzte Tencent Activex, um QQ-Schnellanmeldung in einem unbekannten Browser zu implementieren, und das Erste, was getan wurde, war, die QuickLogin-Steuerung zu installieren.
Gerade wenn ich nicht weiß, wann, braucht der Schnell-Login plötzlich keine Steuerung mehr.
Damals war ich sehr verwirrt: Welche seltsame Methode nutzte Tencent, um mit lokalen Anwendungen zu interagieren?
Ohne Plugins sollten Webseiten nicht direkt mit lokalen Anwendungen interagieren können (es sei denn, ein Protokoll ist definiert, aber es kann nur aufgerufen werden und nicht die vom Programm bereitgestellten Ergebnisse).
Zufällig (naja, ich war einfach gelangweilt, im Task-Manager zu schauen, das native httpd zu entdecken und Apache laufen zu sehen), wurde mir plötzlich eine Möglichkeit klar: Wenn QQ einen lokalen Port öffnet, einen Webserver erstellt, also einen TCP-Server, der dem HTTP-Protokoll entspricht, und dann der Webseiten-Ajax eine Anfrage an diesen QQ stellt (zu diesem Zeitpunkt als Webserver), kannst du das Ergebnis bekommen?
Und das ist wirklich das Ergebnis.
Web JS initiiert eine GET-Anfrage an http://localhost.ptlogin2.qq.com (Ports von 4300-4308, nacheinander zum Erfolg).
Wenn man pingt, findet man, dass es 127.0.0.1 ist, und wenn man den Port überprüft, ist tatsächlich QQ im Einsatz.
Erste Anfrage: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk von Keksen, was auch immer es ist; r ist eine Zufallszahl
Das zurückgegebene Ergebnis ist ein JSON-Array:
var var_sso_uin_list=[{"account":"Logged in QQ account","face_index":-1,"gender":0,"nickname":"Your QQ spitzname","uin":"Still your QQ account","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Dann nutze http://ptlogin2.qq.com/getface, um QQ-Avatare zu erhalten, die hier nicht besprochen werden
So können Ihre QQ-Informationen auf der Webseite angezeigt werden.
Wenn du deinen Avatar drückst (wenn du diesen Login auswählst)
Die folgenden Anfragen werden generiert:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Ähnlich ist r eine Zufallszahl, pt_local_tk stammt von einem Keks, local_token
Was bewirkt diese Anfrage?
Na dann, Set-Cookie.
Dann fahren Sie mit der Anfrage fort
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
Die einzige U1 hier ist die Zieladresse
Diese Anfrage bringt alle benötigten Cookies zurück, und du bist eingeloggt.
Nachdem ich das Protokoll gelernt hatte, wurde ein ernstes Problem entdeckt: Was passiert, wenn ein (schwarzherziges) Programm diese Dinge im Namen des Nutzers tut?
Fang jetzt an!
Ich hatte nur einen Mac zur Hand, also schrieb ich es in Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" Header:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Hinweis: Aufgrund meiner bisherigen Erfahrung mit QQ-Bots (basierend auf dem WebQQ-Protokoll): Der Referer-Header ist sehr wichtig (es muss ein .qq.com-Domainname sein), und wenn er falsch ist, wird er definitiv scheitern. Hier gibt es also keine Kreisverkehre
Übrigens war ich damals neu bei Obj-C, und mancher Code mag etwas albern wirken, bitte verzeihen Sie mir.
//cookiedata是个NSDictionary
So ist der Login abgeschlossen, und du findest eine QQ-Space-Oberfläche (hier nicht veröffentlicht), und der Beitrag ist erfolgreich.
Was bedeutet das? Das bedeutet, solange es sich um ein lokal laufendes Programm handelt, besteht die Möglichkeit, den QQ-Login statt dir selbst durchzuführen und einige hinterhältige Operationen auf Plattformen wie QQ Space durchzuführen, die keine sekundäre Authentifizierung erfordern
|