Kaip visi žinome, "Tencent" naudojo "Activex", kad įdiegtų QQ greitą prisijungimą, naudodama jį nepažįstamoje naršyklėje, ir pirmas dalykas, kurį reikėjo padaryti, buvo įdiegti "QuickLogin" valdiklį.
Tik tada, kai nežinau, kada, greitam prisijungimui staiga nereikia valdiklių.
Tuo metu buvau labai suglumęs, kokį keistą metodą "Tencent" naudojo sąveikaudamas su vietinėmis programomis?
Be papildinių tinklalapiai neturėtų galėti tiesiogiai sąveikauti su vietinėmis programomis (nebent yra apibrėžtas protokolas, bet jį galima iškviesti, o ne programos pateiktus rezultatus).
Atsitiktinai (gerai, tiesiog nuobodu žiūrėti į užduočių tvarkyklę ir atrasti vietinį httpd ir rasti "Apache" veikia), staiga supratau galimybę: jei QQ atidaro vietinį prievadą, sukuria žiniatinklio serverį, tai yra TCP serverį, atitinkantį HTTP protokolą, o tada tinklalapis ajax pateikia užklausą tam QQ (šiuo metu kaip žiniatinklio serveriui), ar galite gauti rezultatą?
Ir tai iš tikrųjų yra rezultatas.
Web JS inicijuoja GET užklausą http://localhost.ptlogin2.qq.com (uostai nuo 4300 iki 4308, vienas po kito iki sėkmės).
Ping jis pamatys, kad jis yra 127.0.0.1, o kai patikrinsite prievadą, jis iš tikrųjų yra QQ naudojamas.
Pirmoji užklausa: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk nuo sausainių, kad ir kas tai būtų; r yra atsitiktinis skaičius
Grąžintas rezultatas yra JSON masyvas:
var var_sso_uin_list=[{"account":"Prisijungė prie QQ paskyros","face_index":-1,"gender":0,"nickname":"Jūsų QQ slapyvardis","uin":"Vis dar jūsų QQ paskyra","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB (var_sso_uin_list);
Tada naudokite http://ptlogin2.qq.com/getface, kad gautumėte QQ avatarus, kurie čia nebus aptarti
Tokiu būdu jūsų QQ informacija gali būti rodoma tinklalapyje.
Kai paspaudžiate savo avatarą (kai pasirenkate šį prisijungimą)
Sugeneruojamos šios užklausos:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Panašiai r yra atsitiktinis skaičius, pt_local_tk yra iš slapuko, local_token
Ką reiškia šis prašymas?
Na, nustatykite slapuką.
Tada tęskite užklausą
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
Vienintelis U1 čia yra paskirties adresas
Ši užklausa grąžins visus jums reikalingus slapukus ir esate prisijungę.
Taigi, išmokus protokolą, buvo atrasta rimta problema: kas atsitiks, jei (juodaširdė) programa atliks šiuos dalykus vartotojo vardu?
Pradėkite dabar!
Turėjau tik "Mac" po ranka, todėl parašiau jį Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" antraštė:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Pastaba: Dėl mano ankstesnės patirties QQ robotuose (remiantis WebQQ protokolu): Referer antraštė yra labai svarbi (tai turi būti .qq.com domeno vardas), kai ji bus neteisinga, ji tikrai nepavyks. Taigi čia nėra žiedinių sankryžų
Beje, tuo metu buvau naujokas Obj-C, o kai kurie kodai gali atrodyti šiek tiek kvaili, atleiskite.
//cookiedata是个NSDictionary
Tokiu būdu prisijungimas baigtas, galite rasti QQ erdvės sąsają (čia nepaskelbta), o įrašas sėkmingas.
Ką tai reiškia? Tai reiškia, kad tol, kol tai yra vietoje veikianti programa, yra galimybė užbaigti QQ prisijungimą vietoj jūsų ir atlikti keletą klastingų operacijų tokiose platformose kaip QQ erdvė, kurioms nereikia antrinio autentifikavimo
|