ご存知の通り、TencentはActivexを使ってQQの高速ログインを実装し、見慣れないブラウザで使用し、まずQuickLoginコントロールをインストールしました。
いつかわからない時に、クイックログインが突然操作を不要にするようになりました。
当時、私はとても困惑しました。Tencentはローカルアプリケーションと連携するためにどんな奇妙な方法を使っていたのでしょうか?
プラグインがなければ、ウェブページはローカルアプリケーションと直接やり取りできないはずです(プロトコルが定義されている場合を除き、呼び出しは可能でプログラムが提供する結果は得られません)。
偶然(まあ、タスクマネージャーを見てネイティブのhttpdを見つけてApacheが動いているのを見て退屈だっただけですが)、ある可能性に気づきました。QQがローカルポートを開き、HTTPプロトコルに準拠したウェブサーバー、つまりTCPサーバーを作成し、そのウェブページAJAXがそのQQ(現時点でウェブサーバー)にリクエストを送った場合、結果は得られますか?
それが本当に結果です。
Web JSは http://localhost.ptlogin2.qq.com(4300-4308のポートを順に成功させる)にGETリクエストを開始します。
pingをすると127.0.0.1であることがわかり、ポートを確認すると確かにQQが使われています。
最初のリクエスト: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
クッキーからpt_local_tk、何であれ; r は乱数です
結果として返されるのはJSON配列です:
var var_sso_uin_list=[{"account":"QQアカウントにログインしました","face_index":-1,"gender":0,"nickname":"Your QQ nickname","uin":"Still your QQ account","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
そして http://ptlogin2.qq.com/getface を使ってQQアバターを手に入れますが、ここでは触れません
こうすることで、QQ情報がウェブページに表示されます。
アバターを押すとき(このログインを選択するとき)
以下のリクエストが生成されます:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
同様に、rは乱数、pt_local_tkはクッキーからのものlocal_token
このリクエストは何をするのでしょうか?
さて、セットクッキー。
その後、依頼を進めてください
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
ここでのU1は宛先アドレスだけです
このリクエストで必要なクッキーはすべて返され、ログイン状態になります。
プロトコルを学んだ後、深刻な問題が明らかになりました。もし(黒い心を持つ)プログラムがユーザーの代わりにこれらのことを行ったらどうなるのか?
今すぐ始めましょう!
手元にMacしかなかったので、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网页上的数据
注:私の以前のQQボット(WebQQプロトコルベース)の経験から、Refererヘッダーは非常に重要で(.qq.com ドメイン名でなければなりません)、間違えれば確実に失敗します。 つまり、ここにラウンドアバウトはありません
ちなみに、当時私はObj-Cを初心者で、コードの一部が少し変に思えるかもしれませんが、どうかご容赦ください。
//cookiedata是个NSDictionary
こうしてログインが完了し、QQスペースのインターフェース(ここには掲載されていません)を見つけられ、投稿は成功します。
これはどういう意味でしょうか? つまり、ローカルで実行されているプログラムであれば、あなたの代わりにQQログインを完成させたり、QQ空間のような二次認証を必要としないプラットフォームでこそこ操作を行う可能性があるということです
|