Som vi alla vet använde Tencent Activex för att implementera QQ snabb inloggning, med hjälp i en okänd webbläsare, och det första man gjorde var att installera QuickLogin-kontrollen.
Precis när jag inte vet när, behöver snabbinloggningen plutsligt inte kontrollerna.
Vid den tiden var jag mycket förbryllad, vilken märklig metod använde Tencent för att interagera med lokala applikationer?
Utan plugins bör webbsidor inte kunna interagera direkt med lokala applikationer (om inte ett protokoll är definierat, men det kan bara anropas och inte resultaten som tillhandahålls av programmet).
Av en slump (eller ja, bara uttråkad av att titta i aktivitetshanteraren och upptäcka den inbyggda httpd:n, och hitta Apache igång), insåg jag plötsligt en möjlighet: om QQ öppnar en lokal port, skapar en webbserver, det vill säga en TCP-server som följer HTTP-protokollet, och sedan gör webbsidans ajax en förfrågan till den QQ (just nu som webbserver), kan du då få resultatet?
Och det är verkligen resultatet.
Web JS initierar en GET-förfrågan till http://localhost.ptlogin2.qq.com (portar från 4300-4308, en efter en till framgång).
Ping den visar att det är 127.0.0.1, och när du kollar porten är det faktiskt QQ i bruk.
Första förfrågan: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk från kakor, vad det nu är; r är ett slumptal
Resultatet som returneras är en JSON-array:
var var_sso_uin_list=[{"account":"Loggad 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);
Använd sedan http://ptlogin2.qq.com/getface för att få QQ-avatarer, vilket inte kommer att diskuteras här
På så sätt kan din QQ-information visas på webbsidan.
När du trycker på din avatar (när du väljer denna inloggning)
Följande förfrågningar genereras:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
På liknande sätt är r ett slumpmässigt tal, pt_local_tk kommer från en cookie, local_token
Vad gör denna begäran?
Nåväl, Set-Cookie.
Sedan fortsätter du med förfrågan
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
Den enda U1 här är destinationsadressen
Denna begäran returnerar alla cookies du behöver, och du är inloggad.
Så efter att ha lärt sig protokollet upptäcktes ett allvarligt problem: vad händer om ett (svarthjärtat) program gör dessa saker för användarens räkning?
Sätt igång nu!
Jag hade bara en Mac till hands, så jag skrev det i 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网页上的数据
Notera: På grund av min tidigare erfarenhet av QQ-botar (baserat på WebQQ-protokollet): Referer-headern är mycket viktig (det måste vara ett .qq.com-domännamn), och om den är fel kommer den definitivt att misslyckas. Så det finns inga rondeller här
Förresten, jag var ny på Obj-C då, och en del av koden kan verka lite fånig, förlåt mig.
//cookiedata是个NSDictionary
På så sätt är inloggningen slutförd, och du kan hitta ett QQ-utrymmesgränssnitt (ej publicerat här), och inlägget är framgångsrikt.
Vad betyder detta? Detta innebär att så länge det är ett program som körs lokalt finns det en chans att slutföra QQ-inloggningen istället för dig, och göra några listiga operationer på plattformar som QQ Space som inte kräver sekundär autentisering
|