Kuten kaikki tiedämme, Tencent käytti Activex:ää QQ-nopean kirjautumisen toteuttamiseen, käyttäen sitä tuntemattomalla selaimella, ja ensimmäinen askel oli asentaa QuickLogin-ohjaus.
Juuri kun en tiedä milloin, nopea kirjautuminen ei yhtäkkiä tarvitse ohjaimia.
Tuolloin olin hyvin hämmentynyt, mitä outoa menetelmää Tencent käytti paikallisten sovellusten käsittelyyn?
Ilman lisäosia verkkosivujen ei pitäisi pystyä suoraan vuorovaikuttamaan paikallisten sovellusten kanssa (ellei protokolla ole määritelty, mutta se voidaan kutsua vain esiin eikä ohjelman antamia tuloksia).
Sattumalta (no, kyllästyin katsomaan tehtävienhallintaa ja löytämään natiivi httpd:n ja löytämään Apache käynnissä) tajusin yhtäkkiä mahdollisuuden: jos QQ avaa paikallisen portin, tekee web-palvelimen, eli TCP-palvelimen, joka noudattaa HTTP-protokollaa, ja sitten verkkosivu ajax tekee pyynnön kyseiselle QQ:lle (tällä hetkellä web-palvelimena), voiko tuloksen saada?
Ja se on oikeastaan lopputulos.
Web JS käynnistää GET-pyynnön http://localhost.ptlogin2.qq.com:lle (portit 4300–4308, yksi kerrallaan onnistumiseen).
Pingauksella se huomaa, että se on 127.0.0.1, ja kun tarkistat portin, se on todellakin käytössä oleva QQ.
Ensimmäinen pyyntö: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk kekseistä, mitä ikinä se onkaan; r on satunnaisluku
Palautettu tulos on JSON-taulukko:
var var_sso_uin_list=[{"account":"Kirjautunut QQ-tilille","face_index":-1,"gender":0,"nickname":"Your QQ chkname","uin":"Still your QQ -tili","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Käytä sitten http://ptlogin2.qq.com/getface saadaksesi QQ-avatareja, joita ei tässä käsitellä
Näin QQ-tietosi voidaan näyttää verkkosivulla.
Kun painat avatariasi (kun valitset tämän kirjautumisen)
Seuraavat pyynnöt generoidaan:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Samoin r on satunnaisluku, pt_local_tk tulee evästeestä, local_token
Mitä tämä pyyntö tekee?
No, Set-Cookie.
Sitten jatka pyyntöä
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
Ainoa U1 täällä on kohdeosoite
Tämä pyyntö palauttaa kaikki tarvitsemasi evästeet, ja olet kirjautunut sisään.
Kun protokolla opittiin, havaittiin vakava ongelma: mitä tapahtuu, jos (mustasydäminen) ohjelma tekee nämä asiat käyttäjän puolesta?
Aloita nyt!
Minulla oli vain Mac käsillä, joten kirjoitin sen Obj-C:llä.
[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网页上的数据
Huomautus: Aiemman kokemukseni perusteella QQ-bottien parissa (perustuen WebQQ-protokollaan): Referer-otsikko on erittäin tärkeä (sen täytyy olla .qq.com-verkkotunnus), kun se on väärässä, se varmasti epäonnistuu. Joten täällä ei ole liikenneympyröitä
Muuten, olin tuolloin uusi Obj-C:ssä, ja osa koodista saattaa tuntua vähän hassulta, pyydän anteeksi.
//cookiedata是个NSDictionary
Näin kirjautuminen on valmis, ja löydät QQ-tilan käyttöliittymän (ei täällä julkaistu), ja julkaisu onnistuu.
Mitä tämä tarkoittaa? Tämä tarkoittaa, että kunhan ohjelma toimii paikallisesti, on mahdollisuus suorittaa QQ-kirjautuminen sinun sijastasi ja tehdä ovelia operaatioita alustoilla, kuten QQ space, jotka eivät vaadi toissijaista todennustodistusta
|