Модераторы: 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   Вверх
LSD
Дата 7.12.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Для начала надо разобраться, почему ты не получаешь редирект на login_success.html.

1. Проверь какой код возвращает executeMethod() он должен быть 3ХХ
2. Попробуй получить редирект от какого нибудь сокращателя ссылок.


--------------------
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   Вверх
Halavshik
Дата 9.12.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, можно просьбу, как для идиота объясните по шагам как все это реализовать начиная со слов открываем новый проект в eclipse smile 

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


Leprechaun Software Developer
****


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

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



Цитата(Atum @  3.12.2010,  20:13 Найти цитируемый пост)
locationHeader  null 

Для того чтобы он был не null надо надо отключить переход по редиректам:
Код

HttpClient httpClient = new HttpClient();
GetMethod method = new GetMethod("http://goo.gl/m4wUv");
method.setFollowRedirects(false);
int code = httpClient.executeMethod(method);
if (code >= 300 && code <= 399) {
    String redirectLocation;
    Header locationHeader = method.getResponseHeader("location");
    if (locationHeader != null) {
        redirectLocation = locationHeader.getValue();
        logger.info(redirectLocation);
    } else {
        logger.info("LocationHeader is null");
    }
}



--------------------
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   Вверх
SaloS
Дата 27.1.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет, у меня также проблема с десктоп клиентом (хоть и на .NET). Я все получил, но при попытке отправить запрос к апи всегда выдается ответ Invalid signature. Я уже все перепроверил. Я смотрю флешевского клиента, на котором все работает стянул параметры, подставил, все совпадает. А с десктопа ни в какую. Прикол в том, что если не посылать sid такой же ответ. Проверил через снифер, сид отправляется.
Если у кого-то работает авторизация, можете проверить, что я не так делаю.
mid = 3943076
secret = e4d924d097
сигнатура считается для строки
3943076api_id=1890159fields=uid,first_name,last_name,nickname,sex,bdate,photo,photo_medium,photo_bigmethod=getProfilestest_mode=1uids=3943076v=3.0e4d924d097

Ответ с сервера
Код

<?xml version="1.0" encoding="utf-8"?>
<error>
 <error_code>4</error_code>
 <error_msg>Incorrect signature</error_msg>
 <request_params list="true">
  <param>
   <key>api_id</key>
   <value>1890159</value>
  </param>
  <param>
   <key>fields</key>
   <value>uid,first_name,last_name,nickname,sex,bdate,photo,photo_medium,photo_big</value>
  </param>
  <param>
   <key>method</key>
   <value>getProfiles</value>
  </param>
  <param>
   <key>test_mode</key>
   <value>1</value>
  </param>
  <param>
   <key>uids</key>
   <value>3943076</value>
  </param>
  <param>
   <key>v</key>
   <value>3.0</value>
  </param>
  <param>
   <key>sig</key>
   <value>0ffb823d4551260f32d501c188d09bed</value>
  </param>
  <param>
   <key>sid</key>
   <value>71b252ea47d3262667b3e4b45f4341bf1099bf9044e07e44b78038dc11</value>
  </param>
 </request_params>
</error>



Что я неправильно делаю я не пойму. Остается только возможность что я неправильно получаю secret и sid. Но как это проверить. Вроде сверялся, все правильно.

Добавлено через 5 минут и 40 секунд
Оказалось, надо было создать именно desktop приложение. Если использовать флеш - оно не хотело
PM MAIL   Вверх
kkorsakoff
Дата 31.1.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня получалось так: sid не шлю, sig шлю, mid не вставляю в подпись. Начинаю сразу с api_id.
MD5 беру от строки
Код

api_id=XXXXXXXfields=uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big,has_mobile,rate,contacts,educationformat=JSONmethod=getProfilesuids=XXXXXXXv=3.0XXXXXXXXXXX

где XXX, понятно дело - реальные значения.
Запрос выполняю такой 
Код

http://api.vkontakte.ru/api.php?api_id=XXXXXXX&fields=uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big,has_mobile,rate,contacts,education&format=JSON&method=getProfiles&sig=XXXXXXXXXXXXXX&uids=XXXXXX&v=3.0


Это сообщение отредактировал(а) kkorsakoff - 31.1.2011, 16:00
PM MAIL WWW ICQ   Вверх
gektor333
Дата 2.2.2011, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сталкнулся с проблемой из этой области:
Использую httpClient для парсинга страниц с целью поиска интересующей информации. Сайты, с которыми предстоит работать предоставляют сервис аналогично www.sciencedirect.com. На запрос каждой страницы генерируется мд5, который передается в качестве параметра запроса. Есть ли какая-то возможность програмно послать запрос на сервер для генерации мд5 нужной страницы? Думал, что можно запустить паука, который с главной страницы начнет ползти по всем ссылкам и записывать их в локальную базу данных... Как в таких случаях обработку проводят?
PM MAIL   Вверх
Atum
Дата 14.2.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



За этот год все немного изменилось ! 

поэтому кто интересуется как создать клиента который бы постил новости на ленту группы отвечаю : 

(я использовал apache  HttpClient  и org.scribe)


Самое ценное - это получение Code -  функция которая работает в несколько этапов и ее нужно корректировать 
в зависимости от количества редиректов которые создает контакт
(если приложение не установлено - то в первый вызов надо добавить в код согласие на то что приложение получит права на доступ к вашим данным)


стандартная цепочка редиректов такая : (после того как ввели  https://api.vkontakte.ru/oauth/authorize)

Request URL:https://login.vk.com/?act=login&soft=1

Request URL:http://oauth.vkontakte.ru/oauth/authorize

Request URL:https://oauth.vkontakte.ru/grant_access

http://api.vkontakte.ru/blank.html#code=12a242bbf6de2285ce


В данном примере проблема с капчей не решается.

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vkclient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.scribe.builder.*;
import org.scribe.builder.api.*;
import org.scribe.model.*;
import org.scribe.oauth.*;
/**
 *
 * @author Atum
 */
public class NewMain {
  private static final String NETWORK_NAME = "Vkontakte.ru";
  private static final String PROTECTED_RESOURCE_URL = "https://api.vkontakte.ru/method/wall.post"; //wall.post //notes.add
  private static final String clientId = "";
  private static final String apiSecret = "";
  
  
  private static final Token EMPTY_TOKEN = null;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
     OAuthService service = new ServiceBuilder()
                                  .provider(VkontakteApi.class)
                                  .apiKey(clientId)
                                  .apiSecret(apiSecret)
                                  .scope("wall,offline,friends") // replace with desired scope notify,friends,wall,audio,notes,messages,offline
                                  .callback("http://api.vkontakte.ru/blank.html") //для приложения
                                  .build();
 
 
 
    String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
    String code = getCode(authorizationUrl);
    Verifier verifier = new Verifier(code);
    
    Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier);
    OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL);
  
    request.addBodyParameter("owner_id", "-clubID");
    request.addBodyParameter("from_group", "1");
    //attachments 
    request.addBodyParameter("attachments", "http://forum.vingrad.ru/");
    
    
    
    service.signRequest(accessToken, request);
    Response response = request.send();
      
    System.out.println(response.getCode());
    System.out.println(response.getBody());
    
  
    
    }
    
       public final static String getCode(String authorizationUrl) throws IOException{
           String code = null;
           
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(authorizationUrl);

            
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpget, responseHandler);

          String str_to = findKey(responseBody,"name=\"to\" value=\"","\"");
         
          HttpPost httppost = new HttpPost("https://login.vk.com/?act=login&soft=1");
         
                 List <NameValuePair> postform = new ArrayList<NameValuePair>(); 
         postform.add(new BasicNameValuePair("q", "1"));
         postform.add(new BasicNameValuePair("ip_h", "IP"));
         postform.add(new BasicNameValuePair("from_host", "api.vkontakte.ru"));
         postform.add(new BasicNameValuePair("to", str_to));
         postform.add(new BasicNameValuePair("expire", "0"));    
         postform.add(new BasicNameValuePair("email", "login")); 
         postform.add(new BasicNameValuePair("pass", "password")); 

         httppost.setEntity(new UrlEncodedFormEntity(postform, HTTP.UTF_8));
                 HttpResponse response = httpclient.execute(httppost);
         httppost.abort();
                 String HeaderLocation = response.getFirstHeader("location").getValue();
                 
                 httppost = new HttpPost(HeaderLocation);
         response = httpclient.execute(httppost);
         httppost.abort();
                 
                 HeaderLocation = response.getFirstHeader("location").getValue();
                 
                 
                 httppost = new HttpPost(HeaderLocation);
         response = httpclient.execute(httppost);
         httppost.abort();
                 
                HeaderLocation = response.getFirstHeader("location").getValue();
                
                code = HeaderLocation.split("=")[1];
            
         return code;
       }
    
  
    private static  final String findKey( String source, String patternbegin, String patternend )
    {
        int startkey = source.indexOf(patternbegin);
        if( startkey > -1 )
        {
            int stopkey = source.indexOf(patternend,startkey+patternbegin.length());
            if( stopkey > -1 )
            {
                String key = source.substring(startkey+patternbegin.length(), stopkey);
                return key;
            }
        }
        return null;
    }
    
}

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

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

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


 




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


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

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