ブラウザコンポーネントなしのアプリケーションでのVKontakte認証

みなさんこんにちは! 電話用のVkontakte音楽プレーヤーを開発しています。

デスクトップおよびモバイルアプリケーション用に最近リリースされたAPIを使用する必要があることは明らかです。 すべてが非常に論理的ですが、1つあります。承認はブラウザコンポーネントのみで行われます。つまり、データを入力するhtmlコードをユーザーに表示する必要があります。



つまり、ログインとパスワードを送信する単純なAPIメソッドですが、セッションは取得しません!

そして、そのようなコンポーネントのないデバイスで何をすべきか?



どういうわけかhtmlをレンダリングできる場合、j2meのjavascriptについては沈黙しています...

Firefox + Firebug + Firecookieが助けになります。

苦しんでいたある日、私はIPAを使用するためのセッションを得るために何をどこに送るべきかを考えました。

必要なデータを取得するたびに、JSON形式でセッションの最後に3つの要求が判明しました。

次に、j2meプラットフォームの明確なコードを投稿します。 ご希望の方は簡単に他の言語やプラットフォームに翻訳できます。

コードはまだベータ版です。実装の一般的な理解のために、Vkontakte APIのすべての機能を操作するための便利なクラスを作成する予定です。

meapplicationdevelopers.dev.java.net/mobileajax.htmlが使用しますが 、HTMLのみをサポートするために私が編集しました。



upload.com.ua/link/901600681



次のように機能します-VkApi.instance.login( "login"、 "pass");

その後、セッションデータを取得する機会があります-getSid()、getUserId、getSecret()、getExpire()



さて、リクエストの生成と送信は別の記事のトピックです。

プログラミングで頑張ってください!

  1. import com.sun.me.web.request.Arg ;
  2. import com.sun.me.web.request.Request ;
  3. import com.sun.me.web.request.Response ;
  4. import org.json.me.JSONObject ;
  5. / **
  6. *
  7. * @author andryk
  8. * /
  9. パブリック クラス VkApi {
  10. public static VkApi instance = new VkApi ;
  11. public static final String URL = "api.vkontakte.ru/api.php" ;
  12. //アプリケーションデータを入力します
  13. public static final String APP_ID = "" ;
  14. / *
  15. アプリケーションのハッシュ。
  16. ブラウザで認証ページに移動し、コードで変数「var auth_hash」を探します
  17. このハッシュは認証に必要です。
  18. * /
  19. private static final String APP_HASH = "" ;
  20. private static final Arg FORM_HEADER = new Arg "Content-Type""application / x-www-form-urlencoded" ;
  21. 保護された 文字列 userId ;
  22. 保護された 文字列 sid ;
  23. 保護された 文字列の秘密
  24. 保護された 文字列の有効期限
  25. protected boolean isLogged = false ;
  26. protected boolean needCaptcha = false ;
  27. protected String captchaSid = "" 、captchaKey = "" ;
  28. public PopupBox captcha = null ;
  29. 保護された VkApi {
  30. }
  31. protected String findS String source throws Exception {
  32. システム アウトprintln ソース ;
  33. 文字列パターン= "id = 's' value = '" ;
  34. int start = source。 indexOf パターン ;
  35. 文字列 s =ソース。 substring start + pattern。length 、start + pattern。length + 56 ;
  36. if s。length != 56 {
  37. 新しい 例外を スロー 「フォームに見つかりません」 ;
  38. }
  39. return s ;
  40. }
  41. public boolean isLogged {
  42. return isLogged ;
  43. }
  44. public boolean isNeedCaptcha {
  45. needCaptchaを返します
  46. }
  47. public String getSecret {
  48. 秘密を返す
  49. }
  50. public String getUserId {
  51. return userId ;
  52. }
  53. public String getSid {
  54. return sid ;
  55. }
  56. クラス NeedCaptchaException Exceptionを 拡張し ます {
  57. 文字列 sid ;
  58. Public NeedCaptchaException String s {
  59. sid = s ;
  60. }
  61. public String getUrl {
  62. return "api.vk.com/captcha.php?sid=" + sid + "&s = 1" ;
  63. }
  64. public String getSid {
  65. return sid ;
  66. }
  67. }
  68. public void setCaptchaKey String captchaKey {
  69. これcaptchaKey = captchaKey ;
  70. }
  71. public void login String login、 String password {
  72. {
  73. 応答結果= 要求post "login.vk.com/"新しい Arg [ ] {
  74. new Arg "act""login" new Arg "app" 、APP_ID
  75. 新しい 引数 "app_hash" 、APP_HASH 新しい 引数 "captcha_key" 、captchaKey
  76. 新しい 引数 "captcha_sid" 、captchaSid
  77. new Arg "email" 、login new Arg "pass" 、password
  78. new Arg "permanent""1" new Arg "vk"""
  79. }新しい Arg [ ] { FORM_HEADER }nullnullnull ;
  80. //リダイレクトコードが何らかの問題を意味する場合。
  81. if result。getCode == 302 {
  82. 文字列 sid = null ;
  83. int start = -1 ;
  84. for int i = 0 ; i < result。getHeaders length ; i ++ {
  85. if result。getHeaders [ i ] 。getKey toLowerCase equals "location" {
  86. 文字列 l =結果。 getHeaders [ i ]getValue ;
  87. 開始= l。 indexOf "m = 1&cs =" ;
  88. int end = l。 indexOf "&" 、start + 7 ;
  89. sid = l。 部分文字列 開始+ 7 、終了 ;
  90. 休憩 ;
  91. }
  92. }
  93. //または、キャプチャ入力が必要
  94. if start > 0 0
  95. 新しい NeedCaptchaException sid )を スローし ます。
  96. //またはユーザー名/パスワードが間違っています
  97. 他に
  98. 新しい 例外を スロー 「間違ったログイン/パス」 ;
  99. }
  100. needCaptcha = false ;
  101. //前のCookieを使用して新しいリクエストを送信します
  102. 応答result2 = リクエストget "login.vk.com/?vk="nullnullnullresult。getCookies ;
  103. // SIDを見つけます
  104. //。getResult()。getRaw()-応答本文
  105. s = findS result2。getResult getRaw ;
  106. //必要なデータを見つける最後の3つのクエリ
  107. 応答result3 = リクエストget "vkontakte.ru/login.php?app=" + APP_ID + "&layout = popup&type = browser&settings = 1054"nullnullnullnew Arg [ ] { new Arg "remixsid" 、s } ;
  108. 文字列 r = result3。 getResult getRaw ;
  109. int start = r。 indexOf "{ \" mid \ " " ;
  110. //セッションデータを含むJSONオブジェクトを見つけました
  111. 文字列 sess = r。 substring start、 r。indexOf "}" 、start + 1 ;
  112. //読む必要があります
  113. JSONObjectセッション= 新しい JSONObject sess ;
  114. //データを記憶します
  115. userId =セッション。 getString "mid" ;
  116. sid =セッション。 getString "sid" ;
  117. シークレット=セッション。 getString "secret" ;
  118. 期限切れ=セッション。 getString "expire" ;
  119. isLogged = true ;
  120. } catch NeedCaptchaException e {
  121. //ユーザーにキャプチャを印刷します。画像アドレスはe.getUrl()です
  122. //その後、コードを設定しますsetCaptchaKey(String key)
  123. //そして再度ログインします
  124. } catch 例外 e {
  125. isLogged = false ;
  126. //ユーザー名/パスワードが間違っている場合のアクション
  127. }
  128. }
  129. }



All Articles