Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Desktop клиент для Контакта, авторизация через HttpClient  
:(
    Опции темы
Atum
Дата 23.11.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Пытаюсь разобраться с API контакта и как с ним работать из java .

Но знаний и информации по этой теме недостаточно .

что хочется получить ?! 
есть задача - авторизоваться пользователем и дать доступ своему приложению .... 
После авторизации получать сообщения пользователя ... иметь возможность из добавлять , удалять и восстанавливать.

что есть ... и какие проблемы возникли ... 

первое - это вход в контакт ... в описании API предлагают создать Браузер  для авторизации 
 если брать простой JEditorPane  и ставить ему setPage(url); то он некорректно отображает содержимое . и непонятно как он будет работать и как ждать от него ответ ...

Я хочу пойти по другому пути ... пока у меня не будет клиентского GUI ...

все операции ходу делать из когда и консоли ... для начала 

взял за основу ... HttpClient от apache

1. Авторизация 

Код

package vkclient;

import java.io.IOException;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Source;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;


public class Main {

    /**
     * @param args the command line arguments
     *
     */

    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        System.out.println("!!!! begin !!!");
    
    HttpClient client = new HttpClient();
     
       // PROXY если есть прокси 
        //client.getHostConfiguration().setProxy(PROXY_HOST, PROXY_PORT);
        // Proxy login
       // Credentials defaultcreds = new UsernamePasswordCredentials("user", "user");
       // AuthScope authScope = new AuthScope(PROXY_HOST, PROXY_PORT);
        //client.getState().setProxyCredentials(authScope, defaultcreds);

        // Нужна ли эта строка
        // client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
        //

        // вопрос с чем работать с GET или POST
        // HttpMethod method = new GetMethod("http://vkontakte.ru/login.php");

        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");

 
            client.executeMethod(post);

              String response = post.getResponseBodyAsString();
              System.out.println(response);
 
 
            System.out.println("!!!! end !!!");
}
 
}


получаем в response страницу авторизации ... 

вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?


2. Авторизация Desktop приложения 

как описано в API для создания приложения надо получить id приложения , и дать ему доступ к сообщениям - выставить маску 4096



т.е. мое приложение должно авторизоваться по следующему URL 

    http://vkontakte.ru/login.php?

 app=11111&layout=popup&type=browser&settings=4096
 
у меня есть ID моего  приложения: 11111 , есть Защищенный ключ. 

Вызываю точно такой же код но с новой ссылкой - получаю в ответ страницу с требованием ввести логин пароль и кнопкой разрешить приложению доступ к моей информации...

Код


   PostMethod post = new PostMethod("http://vkontakte.ru/login.php?app=11111&layout=popup&type=browser&settings=4096");
   client.executeMethod(post);



в вопрос все тот же как теперь ввести логин пароль и отправить данные и разрешить доступ.

в Описании сказано  что в ответ я должен буду получить 

Цитата

то при успешной авторизации встроенный в приложении браузер будет перенаправлен на следующий URL-адрес: 

http://vkontakte.ru/api/login_success.html#session={"mid":66748,"sid":"ea56492j61334be88e2e8e1dccd21ef8d2f4606f26add88b2e1ee313e2","secret":"733mf8a8c5","expire":0,"sig":"f7afd3db2d3a8a08c849bb038fd52173"}


вот с этого Момента я уже ничего не понимаю что делать ... 
Цитата


После получения сессии взаимодействие с ВКонтакте API производится путем создания HTTP-запроса (POST или GET) к адресу API-сервиса http://api.vkontakte.ru/api.php



Какие параметры необходимо передавать при запросе?

подпись запроса создается сервером или руками?



sig = md5(midname1=value1name2=value2secret)


Самые для меня важные вопросы 


как вызывать функции 


messages.get 
 messages.send – посылает сообщение.
 messages.delete – удаляет сообщение.
 messages.restore – восстанавливает только что удаленное сообщение. 
 


Какой библиотекой пользоваться (Хочется примера и код)

Все кто можем помощь чем либо - буду очень признателен.



PM MAIL   Вверх
LSD
Дата 24.11.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(Atum @  23.11.2010,  13:39 Найти цитируемый пост)
вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?

На лицо явное непонимание того как работает браузер. Никаких полей заполнять не нужно, нужно послать GET или POST запрос с нужными полями.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Atum
Дата 24.11.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(LSD @ 24.11.2010,  13:14)
Цитата(Atum @  23.11.2010,  13:39 Найти цитируемый пост)
вопрос как автоматически заполнить поля адреса и пароля и нажать на кнопку вход?

На лицо явное непонимание того как работает браузер. Никаких полей заполнять не нужно, нужно послать GET или POST запрос с нужными полями.


Хорошо , я уточняю ... пытаюсь заполнить поля таким образом ....
Код


        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");

        post.getParams().setContentCharset(SITE_CHARSET);

        post.addParameter("act", "login");
        post.addParameter("try_to_login", "1");
        post.addParameter("email", "******");
        post.addParameter("pass", "*****");
        post.addParameter("app", "1111111");
        post.addParameter("layout", "popup");
        post.addParameter("type", "browser");
        post.addParameter("settings", "4096");



но чего то явно не хватает ?...

и к примеру  как нажать на кнопку разрешить? 

что мы должны получить в ответ ?! - пишут что ссылку с редиректом ... и параметрами сессии  как их вытащить? и пользоваться... 

Очень хочется увидеть ПРИМЕР ! 
хотя бы два запроса - один на авторизацию - второй на получение сообщений чтобы понять как это организовать .





PM MAIL   Вверх
Hidrag
Дата 24.11.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 1
Всего: 25



Делается это так, ставится снифер, например HttpWatch.
Заходишь на сайт, и смотришь в  снифире какие данные к каким полям формы отправляются, соответственно прописываешь их в апликухе. Далее смотришь что возвращается (куки там, идентификатор сессии, еще что-нибудь) и прописываешь их у себя. По сути программа имитирует пользователя, отправляет запросы - получает ответы, если заполнишь правильно все http header'ы то для сайта это будет выглядеть как пользователь с указанного в хедерах браузера.


--------------------
user posted image
PM WWW ICQ   Вверх
Hidrag
Дата 24.11.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: 1
Всего: 25





--------------------
user posted image
PM WWW ICQ   Вверх
LSD
Дата 24.11.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Hidrag, все верно описал, для случая когда ты пытаешься имитировать пользователя. Ну разве что кроме того, что возможно еще потребуется UserAgent поставить.

Но ты вроде писал, что пытаешься использовать API контакта, а там уже все может быть по другому. Надо смотреть документацию.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Atum
Дата 25.11.2010, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



смотрю документацию и ничего не могу понять ... потому что опыта работы с сетью и браузерами практически нет (совсем нет). 

Поэтому и хочется увидеть один пример - с двумя запросами - авторизацией - получением ответа ... анализом ответа ... и посылкой следующего запроса ... итд... странно что тема социальных сетей очень популярная .... но вот красивых и прозрачных примеров нигде нет... ибо те люди которые в этом хорошо разбираются понимают это все очень хорошо, и им такие документы ненужны... а что делать таким кто только начинает разбираться в премудростях работы сетей ?! 
PM MAIL   Вверх
LSD
Дата 25.11.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Может стоит начать с ответа на вопрос какой из двух вариантов работы с вконтегом ты выбрал? smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Atum
Дата 25.11.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



смотрю документацию и ничего не могу понять ... потому что опыта работы с сетью и браузерами практически нет (совсем нет). 

Поэтому и хочется увидеть один пример - с двумя запросами - авторизацией - получением ответа ... анализом ответа ... и посылкой следующего запроса ... итд... странно что тема социальных сетей очень популярная .... но вот красивых и прозрачных примеров нигде нет... ибо те люди которые в этом хорошо разбираются понимают это все очень хорошо, и им такие документы ненужны... а что делать таким кто только начинает разбираться в премудростях работы сетей ?!

Добавлено через 51 секунду
Думаю я определился -  будет POST.
PM MAIL   Вверх
LSD
Дата 25.11.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Еще раз: ты будешь имитировать пользователя или использовать API вконтега для внешних приложений (в этом случае не помешала бы ссылка на документацию)? 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Atum
Дата 25.11.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Хочу использовать API 

вот линк

http://vkontakte.ru/developers.php?id=-1_21239305&s=1

Это сообщение отредактировал(а) Atum - 25.11.2010, 15:44
PM MAIL   Вверх
COVD
Дата 28.11.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

Пытаюсь разобраться с API контакта и как с ним работать из java 

Atum, а зачем?
Мне вообще удивительно, что они предоставляют такое API. Все эти сети живут с рекламы, очевидно, которую они добавляют в свой интерфейс. Предоставление возможности использования другого интерфейса, неконтролируемого владельцем сети, снижает, по идее, их доходы. Кроме того, расширяет возможности нелегитимного использования сети. Рассылка спама, например.  
PM MAIL   Вверх
Atum
Дата 29.11.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата

Atum, а зачем?

 занимаюсь самообразованием.
PM MAIL   Вверх
LSD
Дата 29.11.2010, 19:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



1. Авторизуешься:
Код

        HttpClient client = new HttpClient();

        PostMethod post = new PostMethod("http://vkontakte.ru/login.php");
        post.setParameter("app", "1862639");
        post.setParameter("layout", "popup");
        post.setParameter("type", "browser");
        post.setParameter("settings", "130");

        int code = client.executeMethod(post);

        String redirectLocation;
        Header locationHeader = post.getResponseHeader("location");
        if (locationHeader != null) {
            redirectLocation = locationHeader.getValue();
        } else {
            // The response is invalid and did not provide the new location for
            // the resource.  Report an error or possibly handle the response
            // like a 404 Not Found error.
        }

Handling redirects manually

2.  Из locationHeader получаешь значение параметра session и распарсиваешь его как JSON.

3. Формируешь необходимые параметры. Они перечислены в Какие параметры необходимо передавать при запросе? и плюс параметры необходимые для вызываемого метода (в примере это были uids и fields. И засовываешь их в SortedMap, затем вычисляешь sig
Код

package com.db.gpf.gpfs.test;

import org.apache.commons.codec.binary.Hex;
import org.apache.log4j.Logger;

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class App {
    private static final Logger logger = Logger.getLogger(App.class);
    private static final Set<String> IGNORING_PARAMS;
    private static final Charset CHARSET = Charset.forName("UTF-8");

    static {
        ConfigurableToStringStyle.init("to-string-builder.properties");

        HashSet<String> set = new HashSet<String>();
        set.add("sid");
        IGNORING_PARAMS = Collections.unmodifiableSet(set);
    }

    private MessageDigest md5;
    private String userId;
    private String secret;

    public App(String userId, String secret) throws NoSuchAlgorithmException {
        md5 = MessageDigest.getInstance("MD5");
        this.userId = userId;
        this.secret = secret;
    }

    public String getChecksum(SortedMap<String, String> arguments) {
        StringBuilder buffer = new StringBuilder(512);
        buffer.append(userId);
        for (Map.Entry<String, String> entry : arguments.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (IGNORING_PARAMS.contains(key)) {
                continue;
            }
            buffer.append(key).append('=').append(value);
        }
        buffer.append(secret);
        byte[] bytes = buffer.toString().getBytes(CHARSET);
        byte[] md5 = this.md5.digest(bytes);
        return Hex.encodeHexString(md5);
    }

    public static void main(String[] args) throws Exception {
        App app = new App("100172", "655df68ded");

        SortedMap<String, String> params = new TreeMap<String, String>();
        params.put("api_id", "1854119");
        params.put("fields", "photo,sex");
        params.put("format", "JSON");
        params.put("method", "getProfiles");
        params.put("sid", "25094e01b4fa6824a6d84a65b5b3a09998e17d18d91ba7d9059689da");
        params.put("uids", "100172");
        params.put("v", "3.0");

        String sig = app.getChecksum(params);

        logger.info(sig);

        params.put("sig", sig);
    }
}


После чего можешь посылать POST или GET на http://api.vkontakte.ru/api.php с этими параметрами.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Atum
Дата 3.12.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



LSD, огромное  спасибо за пример .

Первая трудность с которой пришлось столкнуться - 

locationHeader  null 

Цитата

Код

  Header locationHeader = post.getResponseHeader("location");



Делаю первый запрос с помощью GET как описано в api  но не получаю никаких параметров 

Код


      GetMethod  get = new GetMethod("http://vkontakte.ru/login.php?app=2021521&layout=popup&type=browser&settings=4096");

      client.executeMethod(get);
    



как я понимаю тут должно быть три основных шага ... первый 

пусть будет по get и два по пост :

Первый авторизация  нашего приложения : 

Код


      GetMethod  get = new GetMethod("http://vkontakte.ru/login.php?app=2021521&layout=popup&type=browser&settings=4096");

      client.executeMethod(get);
    



в ответе мы должны получить app_hash  параметр 
второе 

отправить POST запрос на страницу http://login.vk.com/ после чего получить новое значение app_hash 

(авторизация пользователя его маил и логин )
Код

act=login
app=2021521;
app_hash= полученный хэш
email=email
pass=****
permanent=1

http://login.vk.com/




отправить POST запрос на страницу vkontakte.ru/login.php, где мы уже будем получать данные сессии путем парсинга.

Код


s=...
act=auth_result
m=4
parmanent=1
expire=""'
app=2021521
app_hash=...

// выполнить POST
   'http://vkontakte.ru/login.php'

//получить 
mid
sid
secret



где 

    expire – Время истечения сессии в формате UNIX
     mid – ID пользователя в ВКонтакте
     secret – Специально сгенерированный секрет сессии
     sid – Идентификатор сессии



Это сообщение отредактировал(а) Atum - 3.12.2010, 19:38
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.