Как парсить интернет приложение?

233
16 февраля 2018, 18:43

Вот сайт http://sd.366.ru/ . Как такое парсить? Подскажите на чем это написано и в какую сторону смотреть. К тому же вход по логину.
Я так понимаю такая штука имеет собственное api , ответы на запросы и надо парсить, только как мне узнать какие запросы мне делать.

UPD Следуя вашим подсказкам я пришел к тому, что используя Jsoup смог авторизоваться на http://my.id-soft.ru (это такой же софт работающий на сервере как и Интрасервис).

public static void main(String[] ars) throws IOException {
        String userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36";
        // Получаю токен
        Connection.Response resp1 = Jsoup.connect("http://my.id-soft.ru/auth/login").method(Connection.Method.GET).execute();
        String token = resp1.parse().getElementsByTag("input").first().val().trim();
        System.out.println(token);
        // Упаковываю все в пост и отправляю
        Connection.Response resp2 = Jsoup.connect("http://my.id-soft.ru/auth/login").referrer("http://my.id-soft.ru/auth/login").userAgent(userAgent)
                .data("_token", token, "login","Mylogin", "password", "qwerty").cookies(resp1.cookies())
                .method(Connection.Method.POST).timeout(10000).execute();
        Map<String, String> cookies = resp2.cookies();
        Document doc = resp2.parse();

Теперь мне не ясно вот что: При каждом ли новом запросе я должен отправлять токен, пароль, логин? Или могу только куки дальше использовать. Или токен? Немного запутался в том как правильно строить следующий запрос. Но это ладно, основное что мне нужно это понять как в таких приложениях находящихся на стороне сервера нажимать на кнопки. Вот у меня имеются фильтр. Я хочу обновить с учетом нажатого фильтра. Включаю Fiddler жму кнопку фильтра и уже идет запрос. Только ради того чтобы показать мне поле выбора фильтра. Ну ладно, оно подгружается. Запрос такой.

 POST http://my.id-soft.ru/tickets/getPopupFilterData HTTP/1.1
Host: my.id-soft.ru
Connection: keep-alive
Content-Length: 12
Accept: */*
Origin: http://my.id-soft.ru
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://my.id-soft.ru/tickets
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: laravel_session=eyJpdiI6IlBIMFUxNG5NQVкукикуки
field=status

Как я вижу новое здесь только field=status

После того как я выбираю один из статусов вижу отправляется такой запрос:

POST http://my.id-soft.ru/tickets/popupFilterDo HTTP/1.1
Host: my.id-soft.ru
Connection: keep-alive
Content-Length: 8
Accept: */*
Origin: http://my.id-soft.ru
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://my.id-soft.ru/tickets
Accept-Encoding: gzip, deflate
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: laravel_session=eyJpdiI6Ill2WVRUbFVLd1lXeXpxQlVкукикуки
status=2

Новое тут только status=2 Ну и дальше после выбора фильтр сам срабатывает. Так вот вопрос, обязательно ли сперва мне надо сделать запрос с field=status , а потом с status=2 или сразу последний запрос? Если бы это был сайт меня бы интересовал конечный результат, тут это может не прокатить. Конечно не проблема поэкспериментировать, но что-то у меня не получается в запрос добавить этот статус. Я бы приложил ответ парсера при авторизации, но он огромен. Хотя нужная часть может есть в этом

<ul class="tabs_content"> 
 <li name="tabs11" class="tabs_content_active"> 
  <div id="filterStatusContainer" style="display: none;"> 
   <input type="button" id="filterStatusCancel" value="" onClick="location.href='http://my.id-soft.ru/tickets/clearFilter'" style="margin-right: 5px;"> 
   <input type="checkbox" id="filterStatusCheckbox" onClick="changeFilterStatus($(this))" style="display: none;"> 
   <span> </span> 
   <input type="button" id="filterStatusProperties" value="Настроить" style="display: none;"> 
  </div> 
  <div id="scroll_table35" class="scrollTable" style="border-top: 1px solid #a9a9a9; background-color: #fafafa;"> 
   <div class="content"> 
    <table border="0" cellspacing="0" cellpadding="0" class="sort_table_header"> 
     <tbody>
      <tr class="top_tr_border"> 
       <th name="col00" width="74"><input type="button" class="tableFilterBtn" name="tableFilterId" value=""></th> 
       <th name="col05" width="130">Приоритет<input type="button" class="tableFilterBtn" name="priority" value=""></th> 
       <th name="col02" width="126">Дата создания<input type="button" class="tableFilterBtn" name="tableFilterDateCreate" value=""></th> 
       <th name="col04" width="586">Адрес размещения<input type="button" class="tableFilterBtn" name="tableFilterLocName" value=""></th> 
       <th name="col03" width="98">Код 1С<input type="button" class="tableFilterBtn" name="tableFilterLocId" value=""></th> 
       <th name="col02" width="600">Тема<input type="button" class="tableFilterBtn" name="tableFilterSubjectName" value=""></th> 
       <th name="col03" width="150">Статус<input type="button" class="tableFilterBtn" name="status" value=""></th> 
       <th name="col04" width="300">Рабочая группа<input type="button" class="tableFilterBtn" name="tableFilterWrkGrpName" value=""></th> 
       <th name="col04" width="200">Исполнитель<input type="button" class="tableFilterBtn" name="tableFilterSpecialist" value=""></th> 
       <th name="col06" width="130">Срок<input type="button" class="tableFilterBtnOrderDesc orderBtn" name="date_target" value=""></th> 
      </tr> 
     </tbody>
    </table> 
    <div id="scroll_table" class="scrollTable"> 
     <div class="content"> 
      <table border="0" cellspacing="0" cellpadding="0" class="sort_table_body"> 
       <tbody>
        <tr class="" priority="5" name="946560" specialist="93791" status="2" subject="562" initiator="64507" location="4422" workgroup="82" onclick="get_ticket_data($(this));" ondblclick="get_ticket_data_dblclick($(this));"> 

Как видите есть такая строчка

<th name="col03" width="150">Статус<input type="button" class="tableFilterBtn" name="status" value=""></th> 

В которую я никак не могу value="2" влепить. Ну вопросы в том как правильно выставлять фильтр и вообще нажимать на кнопки, достаточно ли отправить запрос или придется использовать Силениум (что такое не знаю, понял что помогает на кнопки нажимать). Ну и помогите выставить фильтр, если это возможно через запрос без всяких Силениум.

И кстати сам я пробовал добавить data("status","2") в запрос, но ответ не похож на реальный.

READ ALSO
Как наложить текстуру на полигон в OpenGL?

Как наложить текстуру на полигон в OpenGL?

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

147
Тест с выбором одного ответа на андроид java

Тест с выбором одного ответа на андроид java

Посоветуйте как можно сделать тест в андроид приложении, в котором можно выбрать один ответ из 4(допустим) и в итоге выводить заключение (вывод)...

156
Плохой стиль программирования

Плохой стиль программирования

Является ли данный пример, плохим стилем написания кода? Лучше ли использовать другие имена переменных в конструкторе?

140
Unrecognized VM option &#39;HeadDumpOnOutOfMemoryError&#39;

Unrecognized VM option 'HeadDumpOnOutOfMemoryError'

Всем привет, все работало отлично в Android Studio на Linux, как вдруг я решил залезть в VM Options и вбил куда-то в studio64vmoptions строчку с настройкой

102