ブラウザコンポーネントなしのアプリケーションでの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 } 、 null 、 null 、 null ) ;
  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=" 、 null 、 null 、 null 、 result。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" 、 null 、 null 、 null 、 new 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. }

Source: https://habr.com/ru/post/J92693/


All Articles