Bildiğimiz gibi, Tencent QQ hızlı giriş uygulamak için Activex kullandı, bunu tanımadığı bir tarayıcıda kullandı ve ilk yapılacak şey QuickLogin kontrolünü yüklemek oldu.
Tam ne zaman olacağını bilmediğim anda, hızlı giriş birden kontrollere ihtiyaç duymuyor.
O zamanlar çok şaşırdım, Tencent yerel uygulamalarla etkileşimde hangi tuhaf yöntemi kullanmıştı?
Eklentiler olmadan, web sayfaları yerel uygulamalarla doğrudan etkileşime giremez (bir protokol tanımlanmamışsa, ancak sadece çağrılabiliyor ve programın sağladığı sonuçlar çağrılamaz).
Tesadüfen (sadece görev yöneticisine bakıp yerel httpd'yi bulup Apache'nin çalıştığını görmek sıkıldım), aniden bir ihtimal fark ettim: QQ yerel bir port açarsa, HTTP protokolüne uyumlu bir web sunucusu yaparsa, yani bir TCP sunucusu yaparsa ve ardından web sayfası ajax o QQ'ya (şu anda web sunucusu olarak) bir talep yaparsa, sonucu alabilir misiniz?
Ve asıl sonuç da bu.
Web JS, http://localhost.ptlogin2.qq.com'ye (4300-4308 portları, başarıya doğru teker teker portlar) GET isteği başlatır.
Ping yaptığınızda 127.0.0.1 olduğunu göreceksiniz ve portu kontrol ettiğinizde gerçekten QQ kullanılıyor.
İlk istek: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk kurabiyelerden geliyor, neyse; r rastgele bir sayıdır
Sonuç, bir JSON dizisi olur:
var var_sso_uin_list=[{"account":"QQ hesabına giriş yaptı","face_index":-1,"gender":0,"nickname":"QQ lakabınız","uin":"Hala QQ hesabınız","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Sonra http://ptlogin2.qq.com/getface kullanarak QQ avatarları elde edin, bu burada tartışılmayacak
Bu şekilde QQ bilgileriniz web sayfasında görüntülenebilir.
Avatarınıza bastığınızda (bu girişi seçtiğinizde)
Aşağıdaki talepler oluşturulur:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Benzer şekilde, r rastgele bir sayıdır pt_local_tk bir kurabiyeden gelir, local_token
Bu talep ne işe yarıyor?
Şey, Set-Cookie.
Sonra talebe devam edin
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
Buradaki tek U1 varış adresi
Bu talep ihtiyacınız olan tüm çerezleri geri gönderecek ve giriş yapmış olacaksınız.
Protokolü öğrendikten sonra ciddi bir sorun ortaya çıktı: Eğer (karanlık) bir program kullanıcı adına bunları yaparsa ne olur?
Hemen başla!
Elimde sadece bir Mac vardı, bu yüzden Obj-C ile yazdım.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" başlığı:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Not: Önceki QQ botları deneyimim nedeniyle (WebQQ protokolüne dayanarak): Referer başlığı çok önemli (.qq.com alan adı olmalı), yanlış olduğunda kesinlikle başarısız olur. Yani burada kavşak yok
Bu arada, o zamanlar Obj-C'ye yeniydim ve bazı kodlar biraz saçma gelebilir, lütfen affedin.
//cookiedata是个NSDictionary
Bu şekilde, giriş tamamlanır ve burada paylaşılmayan bir QQ alan arayüzü bulursunuz, gönderi başarılı olur.
Bu ne anlama geliyor? Bu, yerel olarak çalışan bir program olduğu sürece, QQ girişini sizin yerine tamamlama şansınız olduğu ve ikincil kimlik doğrulama gerektirmeyen QQ alanı gibi platformlarda bazı gizli işlemler yapma şansı olduğu anlamına gelir
|