Kot vsi vemo, je Tencent uporabil Activex za implementacijo QQ hitre prijave, in to v neznanem brskalniku, prva stvar pa je bila namestitev kontrole QuickLogin.
Ravno ko ne vem kdaj, hitra prijava nenadoma ne potrebuje več kontrol.
Takrat sem bil zelo zmeden, kakšno nenavadno metodo je Tencent uporabljal za interakcijo z lokalnimi aplikacijami?
Brez vtičnikov spletne strani ne bi smele neposredno komunicirati z lokalnimi aplikacijami (razen če je določen protokol, vendar ga je mogoče le poklicati, ne pa tudi rezultatov, ki jih zagotavlja program).
Po naključju (no, preprosto sem se dolgočasil, ko sem gledal upravitelja opravil in odkril izvorni httpd ter ugotovil, da teče Apache), sem nenadoma spoznal možnost: če QQ odpre lokalni port, ustvari spletni strežnik, torej TCP strežnik, ki ustreza HTTP protokolu, in nato spletna stran ajax pošlje zahtevo temu QQ (trenutno kot spletni strežnik), ali lahko dobiš rezultat?
In to je pravzaprav rezultat.
Web JS sproži GET zahtevo za http://localhost.ptlogin2.qq.com (porti od 4300 do 4308, eden za drugim do uspeha).
Pingaj bo ugotovil, da je 127.0.0.1, in ko preveriš port, je res QQ v uporabi.
Prva zahteva: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk od piškotov, karkoli že je; r je naključno število
Rezultat, ki ga vrnemo, je JSON polje:
var var_sso_uin_list=[{"account":"Prijavljen v QQ račun","face_index":-1,"spol":0,"vzdevek":"Tvoj QQ vzdevek","uin":"Še vedno tvoj QQ račun","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Nato uporabite http://ptlogin2.qq.com/getface za pridobitev QQ avatarjev, o katerih tukaj ne bomo govorili
Na ta način se lahko vaše QQ informacije prikažejo na spletni strani.
Ko pritisnete svoj avatar (ko izberete to prijavo)
Generirane so naslednje zahteve:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Podobno je r naključno število, pt_local_tk je iz piškotka, local_token
Kaj ta prošnja naredi?
No, Set-Cookie.
Nato nadaljuj z zahtevo
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
Edini U1 tukaj je naslov cilja
Ta zahteva vam bo vrnila vse potrebne piškotke in prijavljeni ste.
Po učenju protokola je bil odkrit resen problem: kaj se zgodi, če program (brezsrčni) naredi te stvari v imenu uporabnika?
Začnite zdaj!
Imel sem pri roki samo Mac, zato sem ga napisal v 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网页上的数据
Opomba: Zaradi mojih prejšnjih izkušenj s QQ boti (na osnovi protokola WebQQ): glava Referer je zelo pomembna (mora biti domena .qq.com), ko je napačna, bo zagotovo odpovedala. Torej tukaj ni krožišč
Mimogrede, takrat sem bil nov v Obj-C in morda se mi zdi nekaj kode nekoliko smešno, prosim, oprostite mi.
//cookiedata是个NSDictionary
Na ta način je prijava opravljena, najdete QQ space vmesnik (tukaj ni objavljen), in objava je uspešna.
Kaj to pomeni? To pomeni, da dokler program teče lokalno, obstaja možnost, da se QQ prijavi namesto vas in izvede nekaj prikritih operacij na platformah, kot je QQ space, ki ne zahtevajo sekundarne avtentikacije
|