Come tutti sappiamo, Tencent ha usato Activex per implementare il login rapido di QQ, usandolo su un browser sconosciuto, e la prima cosa da fare è stata installare il controllo QuickLogin.
Proprio quando non so quando, il login rapido improvvisamente non ha più bisogno dei controlli.
All'epoca ero molto perplesso, quale metodo strano usava Tencent per interagire con le applicazioni locali?
Senza plugin, le pagine web non dovrebbero poter interagire direttamente con le applicazioni locali (a meno che non sia definito un protocollo, ma può essere chiamato solo e non i risultati forniti dal programma).
Per caso (beh, mi sono solo annoiato a guardare il task manager e scoprire l'httpd nativo, e trovare Apache in esecuzione), ho improvvisamente realizzato una possibilità: se QQ apre una porta locale, crea un server web, cioè un server TCP che rispetta il protocollo HTTP, e poi la pagina web ajax fa una richiesta a quel QQ (attualmente come server web), puoi ottenere il risultato?
E questo è davvero il risultato.
Web JS avvia una richiesta GET per http://localhost.ptlogin2.qq.com (porting da 4300-4308, una per una verso il successo).
Ping scoprirà che è 127.0.0.1, e quando controlli la porta, è effettivamente QQ in uso.
Prima richiesta: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk dai biscotti, qualunque cosa sia; r è un numero casuale
Il risultato restituito è un array JSON:
var var_sso_uin_list=[{"account":"Logged in QQ account","face_index":-1,"gender":0,"nickname":"Your QQ nickname,"uin":"Still your QQ account","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Poi usa http://ptlogin2.qq.com/getface per ottenere avatar QQ, cosa che qui non verrà discussa
In questo modo le tue informazioni QQ possono essere visualizzate sulla pagina web.
Quando premi il tuo avatar (quando selezioni questo login)
Vengono generate le seguenti richieste:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Allo stesso modo, r è un numero casuale, pt_local_tk proviene da un cookie, local_token
A cosa serve questa richiesta?
Beh, Set-Cookie.
Poi procedi con la richiesta
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
L'unico U1 qui è l'indirizzo di destinazione
Questa richiesta restituirà tutti i cookie di cui hai bisogno e sarai loggato.
Quindi, dopo aver imparato il protocollo, è stato scoperto un problema serio: cosa succede se un programma (dal cuore nero) fa queste cose per conto dell'utente?
Inizia ora!
Avevo solo un Mac a portata di mano, quindi l'ho scritto 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网页上的数据
Nota: A causa della mia esperienza precedente con bot QQ (basato sul protocollo WebQQ): l'intestazione Referer è molto importante (deve essere un nome di dominio .qq.com), se sbaglia, sicuramente fallirà. Quindi qui non ci sono rotatorie
A proposito, ero nuovo all'Obj-C in quel periodo, e alcuni del codice possono sembrarti un po' sciocchi, vi prego di perdonarmi.
//cookiedata是个NSDictionary
In questo modo, il login viene completato e puoi trovare un'interfaccia per QQ Space (non pubblicata qui), e il post ha successo.
Cosa significa? Questo significa che, finché è un programma in esecuzione locale, c'è la possibilità di completare il login di QQ al posto tuo, e di effettuare alcune operazioni subdette su piattaforme come QQ Space che non richiedono un'autenticazione secondaria
|