Som vi alle ved, brugte Tencent Activex til at implementere QQ fast login, ved at bruge det i en ukendt browser, og det første var at installere QuickLogin-kontrollen.
Lige når jeg ikke ved hvornår, behøver hurtiglogin pludselig ikke kontrollerne.
På det tidspunkt var jeg meget forvirret – hvilken mærkelig metode brugte Tencent til at interagere med lokale applikationer?
Uden plugins bør websider ikke kunne interagere direkte med lokale applikationer (medmindre en protokol er defineret, men kun kan kaldes frem og ikke de resultater, som programmet leverer).
Ved et tilfælde (eller bare keder mig over at kigge i joblisten og opdage den native httpd og finde Apache kørende), indså jeg pludselig en mulighed: hvis QQ åbner en lokal port, laver en webserver, altså en TCP-server, der følger HTTP-protokollen, og så laver websidens ajax en anmodning til den QQ (på nuværende tidspunkt som webserver), kan du så få resultatet?
Og det er virkelig resultatet.
Web JS initierer en GET-anmodning til http://localhost.ptlogin2.qq.com (porte fra 4300-4308, én efter én til succes).
Ping den vil finde ud af, at det er 127.0.0.1, og når du tjekker porten, er den faktisk QQ i brug.
Første anmodning: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk fra småkager, hvad det end er; r er et tilfældigt tal
Resultatet, der returneres, er et JSON-array:
var var_sso_uin_list=[{"account":"Logget ind QQ account","face_index":-1,"gender":0,"nickname":"Your QQ callname","uin":"Still your QQ account","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Brug derefter http://ptlogin2.qq.com/getface til at få QQ-avatarer, som ikke vil blive diskuteret her
På denne måde kan dine QQ-oplysninger vises på hjemmesiden.
Når du trykker på din avatar (når du vælger denne login)
Følgende anmodninger genereres:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Tilsvarende er r et tilfældigt tal, pt_local_tk kommer fra en cookie, local_token
Hvad gør denne anmodning?
Nå, Set-Cookie.
Så fortsæt med anmodningen
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 eneste U1 her er destinationsadressen
Denne anmodning returnerer alle de cookies, du har brug for, og du er logget ind.
Så efter at have lært protokollen blev der opdaget et alvorligt problem: hvad sker der, hvis et (sort-hjertet) program gør disse ting på brugerens vegne?
Kom i gang nu!
Jeg havde kun en Mac ved hånden, så jeg skrev det i Obj-C.
[selv 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网页上的数据
Bemærk: På grund af min tidligere erfaring med QQ-bots (baseret på WebQQ-protokollen): Referer-headeren er meget vigtig (det skal være et .qq.com-domænenavn), og hvis den er forkert, vil den helt sikkert fejle. Så der er ingen rundkørsler her
For resten, jeg var ny i Obj-C på det tidspunkt, og noget af koden kan virke lidt fjollet, så tilgiv mig.
//cookiedata是个NSDictionary
På denne måde er login fuldført, og du kan finde en QQ-pladsgrænseflade (ikke postet her), og indlægget er succesfuldt.
Hvad betyder det? Det betyder, at så længe det er et program, der kører lokalt, er der en chance for at gennemføre QQ-login i stedet for dig og udføre nogle snedige operationer på platforme som QQ Space, der ikke kræver sekundær autentificering
|