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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обход сайта из Desktop приложения, запустить браузер с нужной страницы 
V
    Опции темы
tigerkvv
Дата 21.11.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте товарищи.

Ситуация: 
Есть GUI java приложение. Надо из него подключиться к сайту, пройти авторизацию, ответить еще на несколько вопросов (сайт не мой и гоняет по нескольким формам на разных страничках) и в конечном итоге запустить броузер с этой итоговой страничкой.

Проблемы: 
1. Сайт только с сессиями. Поэтому когда разбираю поток для получения кода сессии потом не могу послать новый запрос (используя полученный код) т.к. невозможно выполнить запрос если уже выполнено чтение буфера. При повторном коннекте другой код естественно.
2. Как потом (преодолев первую проблему) запустить броузер с этой же сессией?

Код

public static Properties openSite(String urlSite, String UID, String PWD, Long ID){

        try{
            URL url = new URL(urlSite);
            String str = new String(ID.toString());
            URLConnection connection = url.openConnection();
            connection.setDoOutput(true);
            
            BufferedReader in=null;
            String jsessionid="";
            boolean f=true;
            try {
             in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "cp1257"));
                String line;
                while (f&&((line = in.readLine()) != null)) {
                  //ищу присвоенный код сессии
                  if (line.indexOf("home.do;jsessionid=")>0){
                   jsessionid= line.substring(line.indexOf("home.do;jsessionid=")+19, 66);
                   f=false;
                  }
                }
              } finally {
                //if(in != null) in.close();
              }
              
              //url = new URL(urlSite);  - при повторном коннекте - новая сессия
              //connection = url.openConnection();   - без коннекта не знаю как перепрочитать
              //connection.setDoOutput(true);
              DataOutputStream dos=new DataOutputStream(connection.getOutputStream()); //без повторного коннекта говорит нельзя писать посте чтения
                      dos.writeBytes(";jsessionid="+jsessionid+"&username="+UID+"&password="+PWD);
              dos.writeBytes("\r\n");
// тут должен быть дальнейший разбор и получение итогового адреса сайта urlSite
              
        }catch (Exception i){
                  JOptionPane.showMessageDialog(K.C.mainFrame,"Error:"+i.getMessage());
              return null;
        }    
                // запуск броузера
        Runtime r = Runtime.getRuntime();
        try {
            Process proc=r.exec("C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE "+urlSite);
        } catch (Exception e) {
             JOptionPane.showMessageDialog(C.mainFrame,"Error: "+e.getMessage());
        }
    }



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


Опытный
**


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

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



А Вы уверены, что сайт использует URL rewriting, а не куки для отслеживания сессий? Может, ID сессии надо в куки пихать?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
tigerkvv
Дата 21.11.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(AlexeyVorotnikov @ 21.11.2007,  15:25)
А Вы уверены, что сайт использует URL rewriting, а не куки для отслеживания сессий? Может, ID сессии надо в куки пихать?

может и надо.
буду пробовать.
PM MAIL   Вверх
alex_nevolin
Дата 21.11.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Советую посмотреть эту библиотку:
Jakarta HttpClient
Она как раз позволяет работать с Http серварами эмулируя клиента.
PM MAIL   Вверх
tigerkvv
Дата 21.11.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как раз сижу изучаю.
Может и решу проблему

Может кто даст ссылку на русскую доку?

Это сообщение отредактировал(а) tigerkvv - 21.11.2007, 16:06
PM MAIL   Вверх
unkis
Дата 21.11.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



если решишь, не забудь запостить ответ


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Hidrag
Дата 22.11.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tigerkvv, русской доки не нужно, там и по примерам все ясно, потом, рекомендую поставить сниффер и пройтись через все формы сайта через браузер вручную, при этом смотря http запросы и ответы через сниффер, сразу увидишь все параметры и значения, затем юзая Jakarta HttpClient напишешь алгоритм всех запросов, которые приведут тебя к нужной странице, а вот как ответ на запрос переслать во внешнее приложение, в данном случае в браузер, даже не знаю, запустить то браузер на заданный линк не проблема, а вот передать при этом куки параметры запроса и т.д уже не так просто я думаю.


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


Опытный
**


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

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



Цитата(Hidrag @  21.11.2007,  23:03 Найти цитируемый пост)
атем юзая Jakarta HttpClient напишешь алгоритм всех запросов, которые приведут тебя к нужной странице, а вот как ответ на запрос переслать во внешнее приложение, в данном случае в браузер, даже не знаю, запустить то браузер на заданный линк не проблема, а вот передать при этом куки параметры запроса и т.д уже не так просто я думаю. 

но тут можно с генерировать html страницу с формой и открыть её.
Но может можно и как-то подругому



--------------------
www.unkis.com
PM MAIL WWW   Вверх
tigerkvv
Дата 22.11.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Обход сайта сделал.
HttpClient действительно упрощает многие процедуры.

Бьюсь над передачей параметров во внешний броузер.
Есть идеи?

Вся беда в том что при запуске браузера с указанным URL ему присваивается новая сессия.
Можно ли сформировать какой-то скрипт и заставить броузер его выполнить?
(походить по сайту)
Тогда HttpClient наверное и не нужен будет.
Или принудительно переходить на другую сессию?
Может какие еще варианты?
PM MAIL   Вверх
Hidrag
Дата 22.11.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну опять же, смотря как идентификатор сессии передается, если через куку, то не знаю, если он в урл дописывается, то это не проблема - сформируешь нужный урл и натравишь на него браузер, если параметры передаются методом пост/гет тоже не проблема - по последнему полученному ответу генеришь html ку в которой прописываешь этот метод, то есть в нем все параметры запроса + нужный урл. Затем делаешь запуск браузер, натравленного на этот файлик. Как я понимаю, если нет привязки к кукам то проблемы особой нет

Это сообщение отредактировал(а) Hidrag - 22.11.2007, 15:21


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


Новичок



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

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



Ура, народ, получается.

Еще чуть-чуть и будет релиз.
Выкину процедурку.
PM MAIL   Вверх
tigerkvv
  Дата 29.11.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Чуть не забыл выложить готовую процедуру.
Пользуйтесь кому надо.
Правда надо дать несколько пояснений:
1. Обход сайта я делал ручками (по совету Hidrak), чтобы в конце выйти на нужный скрипт с нужными параметрами. В конце все получилось довольно просто: регистрируемся, получаем номер сессии, подставляем в нужный параметр и запускаем броузер со строкой. Поэтому прежде чем пользоваться процедурой надо самому определить конечный адрес (хотя во многих случаях он и не меняется, мне наверное не повезло).
2. В коде процедуры использованы параметры которые нужны были мне. Соответствующие коментарии я оставил в теле.

Код

public static boolean setSite(String URL1, String URL2, String UID, String PWD){
        try{
            // Get initial state object
            HttpState initialState = new HttpState();
            // Зачем нужны все эти куки нет времени выяснять - оставил из примера, работает
            Cookie mycookie = new Cookie(".foobar.com", "mycookie", "stuff", "/", null, false);
            initialState.addCookie(mycookie);

            // Get HTTP client instance
            HttpClient httpclient = new HttpClient();
            httpclient.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
            httpclient.setState(initialState);

            // RFC 2101 cookie management spec is used per default
            // to parse, validate, format & match cookies
            httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);

            // Get HTTP GET method
                // !!! у вас могут быть другие переменные для имени и пароля (username,password)
            GetMethod httpget = new GetMethod(URL1+"?username="+UID+"&password="+PWD);
            httpclient.executeMethod(httpget);
            // Get all the cookies
            Cookie[] cookies = httpclient.getState().getCookies();
            // куки под номером 1 - номер сессии
                // !!! вам могут понадобиться другие куки
                // что бы выяснить какие номера нужных, можно вывести содержимое массива cookies
            String session = cookies[1].toString();
                // откусываем имя кука, т.к. скрипт сайта может не принять другой регистр
            session=session.substring(11, session.length());
            // запускаем броузер (с версии 1.6)
            Desktop desktop = Desktop.getDesktop();
                // jsessionid - имя переменной для номера сессии
                // <куча параметров> - если статические - можно писать прям сюда
                // если, как у меня, динамические - тогда добавлять во входящие параметры процедуры
            desktop.browse(new URI(URL2+";jsessionid="+session+"?<куча параметров>"));

            /* это запуск броузера для версий до 1.6
                // cmd естественно можно определять как хочешь (в смысле броузер)
                Runtime r = Runtime.getRuntime();
            try {
                String cmd="C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE ";
                                cmd=cmd+";jsessionid="+session+"?<куча параметров>";
                Process proc=r.exec(cmd);
            } catch (Exception e) {
                System.out.println("Error executing Browser: "+e);
            }*/

                // пришлось закоментировать во избежание закрытия сессии до открытия броузера
            //httpget.releaseConnection();
        }catch (Exception i){
            System.out.println(i.getMessage());
            return false;
        }
                return true;
    }



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

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

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


 




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


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

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