Всем привет! Я разрабатываю Вконтакте плеер музыки для телефонов.
Понятно, что нужно использовать недавно вышедшее АПИ для десктоп и мобильных приложений. Все вполне логично, но есть одно но — авторизация производится только через компонент браузера, а именно мы должны юзеру показать html код, куда он введет свои данные.
То есть, простого метода апи в который отсылаем логин и пароль, а получаем сессию просто нет!
И что делать на устройствах без такого компонента?
Если html еще как-то можем отрендерить, то насчет javascript на j2me я молчу…
Тут на помощь приходит Firefox + Firebug + Firecookie.
Помучившись, за один день я разобрался, что и куда посылать, что бы получить сессию для использования АПИ.
Получилось 3 запроса, в каждом мы получаем нужные данные, и в конце сессию в формате JSON.
Далее я выкладываю понятный код для платформы j2me. Желающие без проблем переведут его на другие языки и платформы.
Код пока в бете, для общего понимания реализации, планирую сделать удобный класс для работы со всеми функциями АПИ Вконтакте.
Используется meapplicationdevelopers.dev.java.net/mobileajax.html, но правленый мной для поддержки просто html.
upload.com.ua/link/901600681
Работает так — VkApi.instance.login(«login», «pass»);
После этого у нас есть возможность получить данные сессии — getSid(), getUserId, getSecret(), getExpire()
Ну а генерация и посылание запросов — тема другой статьи.
Удачи в программировании!
Понятно, что нужно использовать недавно вышедшее АПИ для десктоп и мобильных приложений. Все вполне логично, но есть одно но — авторизация производится только через компонент браузера, а именно мы должны юзеру показать html код, куда он введет свои данные.
То есть, простого метода апи в который отсылаем логин и пароль, а получаем сессию просто нет!
И что делать на устройствах без такого компонента?
Если html еще как-то можем отрендерить, то насчет javascript на j2me я молчу…
Тут на помощь приходит Firefox + Firebug + Firecookie.
Помучившись, за один день я разобрался, что и куда посылать, что бы получить сессию для использования АПИ.
Получилось 3 запроса, в каждом мы получаем нужные данные, и в конце сессию в формате JSON.
Далее я выкладываю понятный код для платформы j2me. Желающие без проблем переведут его на другие языки и платформы.
Код пока в бете, для общего понимания реализации, планирую сделать удобный класс для работы со всеми функциями АПИ Вконтакте.
Используется meapplicationdevelopers.dev.java.net/mobileajax.html, но правленый мной для поддержки просто html.
upload.com.ua/link/901600681
Работает так — VkApi.instance.login(«login», «pass»);
После этого у нас есть возможность получить данные сессии — getSid(), getUserId, getSecret(), getExpire()
Ну а генерация и посылание запросов — тема другой статьи.
Удачи в программировании!
- import com.sun.me.web.request.Arg;
- import com.sun.me.web.request.Request;
- import com.sun.me.web.request.Response;
- import org.json.me.JSONObject;
- /**
- *
- * @author andryk
- */
- public class VkApi {
- public static VkApi instance = new VkApi();
- public static final String URL = "api.vkontakte.ru/api.php";
- //Заполните данными своего приложения
- public static final String APP_ID = "";
- /*
- Хеш приложения.
- Заходим браузером на страничку авторизации и ищем в коде переменную 'var auth_hash'
- Этот хеш нужен для авторизации.
- */
- private static final String APP_HASH = "";
- private static final Arg FORM_HEADER = new Arg("Content-Type", "application/x-www-form-urlencoded");
- protected String userId;
- protected String sid;
- protected String secret;
- protected String expire;
- protected boolean isLogged = false;
- protected boolean needCaptcha = false;
- protected String captchaSid="", captchaKey="";
- public PopupBox captcha = null;
- protected VkApi() {
- }
- protected String findS(String source) throws Exception {
- System.out.println(source);
- String pattern = "id='s' value='";
- int start = source.indexOf(pattern);
- String s = source.substring(start + pattern.length(), start + pattern.length() + 56);
- if (s.length() != 56) {
- throw new Exception("s not finded in form");
- }
- return s;
- }
- public boolean isLogged() {
- return isLogged;
- }
- public boolean isNeedCaptcha() {
- return needCaptcha;
- }
- public String getSecret() {
- return secret;
- }
- public String getUserId() {
- return userId;
- }
- public String getSid() {
- return sid;
- }
- class NeedCaptchaException extends Exception {
- String sid;
- public NeedCaptchaException(String s) {
- sid = s;
- }
- public String getUrl() {
- return "api.vk.com/captcha.php?sid=" + sid + "&s=1";
- }
- public String getSid() {
- return sid;
- }
- }
- public void setCaptchaKey(String captchaKey) {
- this.captchaKey = captchaKey;
- }
- public void login(String login, String password) {
- try {
- Response result = Request.post("login.vk.com/", new Arg[]{
- new Arg("act", "login"), new Arg("app", APP_ID),
- new Arg("app_hash", APP_HASH), new Arg("captcha_key", captchaKey),
- new Arg("captcha_sid", captchaSid),
- new Arg("email", login), new Arg("pass", password),
- new Arg("permanent", "1"), new Arg("vk", "")
- }, new Arg[]{FORM_HEADER}, null, null, null);
- //Если код редиректа - значит что то не так.
- if (result.getCode() == 302) {
- String sid = null;
- int start = -1;
- for (int i = 0 ; i < result.getHeaders().length; i++) {
- if (result.getHeaders()[i].getKey().toLowerCase().equals("location")) {
- String l = result.getHeaders()[i].getValue();
- start = l.indexOf("m=1&cs=");
- int end = l.indexOf("&", start + 7);
- sid = l.substring(start + 7, end);
- break;
- }
- }
- //Или нужен ввод капчи
- if(start > 0 0)
- throw new NeedCaptchaException(sid);
- //Или неправильный логин/пароль
- else
- throw new Exception("Wrong login/pass");
- }
- needCaptcha = false;
- //Посылаем новый запрос с куками от предыдущего
- Response result2 = Request.get("login.vk.com/?vk=", null, null, null, result.getCookies());
- //Находим SID
- //.getResult().getRaw() - тело ответа
- s = findS(result2.getResult().getRaw());
- //Последний 3 запрос, в котором мы найдем искомые данные
- Response result3 = Request.get("vkontakte.ru/login.php?app="+APP_ID+"&layout=popup&type=browser&settings=1054", null, null, null, new Arg[]{new Arg("remixsid", s)});
- String r = result3.getResult().getRaw();
- int start = r.indexOf("{\"mid\"");
- //Нашли наш JSON обьект с данными сессии
- String sess = r.substring(start, r.indexOf("}", start) + 1);
- //Нужно считать его
- JSONObject session = new JSONObject(sess);
- //Запоминаем данные
- userId = session.getString("mid");
- sid = session.getString("sid");
- secret = session.getString("secret");
- expire = session.getString("expire");
- isLogged = true;
- } catch (NeedCaptchaException e) {
- //Выводим юзеру капчу, адрес картинки - e.getUrl()
- //После этого устанавливаем код setCaptchaKey(String key)
- //И делаем логин заново
- } catch (Exception e) {
- isLogged = false;
- //Действия если логин/пароль неправильные
- }
- }
- }