[Сценарий] Вытягивание данных с сайтов, закрытых формой логина

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

[Сценарий] Вытягивание данных с сайтов, закрытых формой логина

Сообщение sergejey » Чт мар 21, 2013 6:49 pm

Рассказываю рецепт приготовления информации для MajorDoMo с закрытых паролями сайтов. Обычную (plain) авторизацию вполне можно обойти имеющимся модулем Веб-переменных, но там, где авторизация через форму, такой фокус не проходит. Расскажу на своём примере взятия текущего баланса у моего сотового оператора.

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

Итак, имеем форму входа: https://issa.diallog.by/cgi-bin/cgi.exe ... =is_newlog

Смотрим исходник страницы и видем как устроена эта форма:
Изображение

После входа мы попадаем на страницу, где как раз есть нужная нам информация. Эту страницу мы обрабатываем шаблоном поиска, прямо как в модуле веб-переменные. В самом коде в виде комментариев я расскажу про некоторые особенности. Из кода делаем сценарий и через метод onNewHour запускаем его каждый час (если чаще, то через onNewMinute)

Итак код сценария:

Код: Выделить всё

$cookie_file=ROOT.'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN
   
  $url='https://issa.diallog.by/cgi-bin/cgi.exe?function=is_login'; // ссылка, по которой нам надо зайти

  // задаём поля, которые будут отправлены при логине     
  $fields = array(
   'Lang' => 2,
   'mobnum' => '0987654321', // номер телефона
   'Password' => '123'); // пароль

foreach($fields as $key=>$value) { $fields_string .= $key.'='.urlencode($value).'&'; }
rtrim($fields_string, '&');

   $ch = curl_init();   
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_POST, count($fields));   
   curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
   $result = curl_exec($ch);
   curl_close($ch);
   
  
 // STEP 2 -- GET DATA

   $url='https://issa.diallog.by/cgi-bin/cgi.exe?function=is_account';  // это собственно страница, на которую нам надо заходить уже залогинившись
   $ch = curl_init();   
   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
   $result = curl_exec($ch);
   curl_close($ch);
   
   SaveFile(ROOT.'cached/dialog_result.txt',$result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри
   
@unlink($cookie_file);   

$result=win2utf($result); // эта строчка нужна только в том случае, если кодировка страницы не UTF, а Windows-1251. иначе просто удаляем эту строчку

if (preg_match('/Актуальный баланс:<\/td>.+?([\.\d]+)&nbsp;р/is',$result,$m)) { // здесь как раз ищем нужную нам информацию
 $balance=$m[1];
 setGlobal('MyCell.balance',$balance); // сохраняем найденный баланс в нужный нам объект
}
За это сообщение автора sergejey поблагодарил:
NewComerDS (Пт июн 02, 2023 8:14 am)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение anemcov » Чт мар 21, 2013 6:58 pm

Использую у себя в системе скрипт pbal, который позволяет получать данные о балансах мобильных телефонов с сайтов операторов. Сам дописаывал его для получения остатка средств у провайдера. В итоге имею напоминалку о балансах и график расходования средств
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение dimitrystd » Вс апр 07, 2013 1:22 am

Кто может поделиться скриптами для проверки балансов украинских мобильных операторов. Ато у мтс и life формы логина капчей закрыты. Может есть какието сервисы? Погуглил легонько, но не нашёл.
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение dimitrystd » Вс апр 07, 2013 6:53 pm

Попробовал ваш скрипт для своего интернет провайдера, завелось без всяких вопросов. Но вот с телевиденьем не пошло. Там сайт на асп.нет, наверное кроме отправки логина\пароля нужно ещё тонну скрытых полей заполнить. Иначе при запросе странички всёравно отдаёт
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/LoginPage.aspx">here</a>.</h2>
</body></html>
Можете ли с этим помочь? Могу дать креденшелы. Форма вот здесь https://triolan.name/
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение ser009 » Вс окт 13, 2013 6:51 am

нужна помощь:
Последний раз редактировалось ser009 Вс окт 13, 2013 9:35 am, всего редактировалось 3 раза.
Аватара пользователя
ser009
Сообщения: 595
Зарегистрирован: Сб окт 13, 2012 9:55 am
Благодарил (а): 4 раза
Поблагодарили: 43 раза

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение ser009 » Вс окт 13, 2013 9:32 am

Ха.
Все оказалось не так просто.

Код: Выделить всё

<form action="/Selfcarepda/" method="post"><input name="__RequestVerificationToken" type="hidden" value="k43SgBWzKYhPSTfN0rUGoARF7hxmYz4JqK2WMZka3rIPlvX4bQ68fsyQ1KSof9pLf4cZiMr_0aJVXVL789cEvICX61uMZQ-Oqmlw8WSuQwIN6vmlbDQt2KgO7rQfND076Ui0YA2" />
		<table class="form">
значение value постоянно меняется:(
Есть варианты?
anemcov
Сообщения: 211
Зарегистрирован: Вт янв 08, 2013 11:50 pm
Откуда: Санкт-Петербург
Благодарил (а): 0
Поблагодарили: 6 раз

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение anemcov » Пн окт 21, 2013 7:40 pm

ser009 писал(а):Ха.
Все оказалось не так просто.

Код: Выделить всё

<form action="/Selfcarepda/" method="post"><input name="__RequestVerificationToken" type="hidden" value="k43SgBWzKYhPSTfN0rUGoARF7hxmYz4JqK2WMZka3rIPlvX4bQ68fsyQ1KSof9pLf4cZiMr_0aJVXVL789cEvICX61uMZQ-Oqmlw8WSuQwIN6vmlbDQt2KgO7rQfND076Ui0YA2" />
		<table class="form">
значение value постоянно меняется:(
Есть варианты?
Получать ответ сайта в файлик, из файлика парсить токен, дальше юзать.
У меня так с сайтов МТС, Мегафона и Билайна балансы забираются (правда на Линухе)
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение directman66 » Вт дек 12, 2017 9:55 pm

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

Код: Выделить всё

$cookie_file = ROOT . 'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
//$cookie_file = 'dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN

$url = 'https://starline-online.ru/user/login'; // ссылка, по которой нам надо зайти
// задаём поля, которые будут отправлены при логине     
$fields = array(
    'LoginForm[login]' => gg('balance.StarlineLogin'), // номер телефона
    'LoginForm[rememberMe]' => 'on', 
 'LoginForm[pass]' =>  gg('balance.StarlinePass')

);

print_r($fields);
echo "<br>";
$fields_string = '';
foreach ($fields as $key => $value) {
    $fields_string .= urlencode($key) . '=' . urlencode($value) . '&';
}
rtrim($fields_string, '&');
echo $fields_string;

echo "<br>";
echo $data;
echo "<br>";
echo "<br>";
$ch = curl_init();
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
//curl_setopt($ch, CURLOPT_POST, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0',
'Accept: application/json, text/javascript, */*; q=0.01',
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With: XMLHttpRequest'
));


$result = curl_exec($ch);
curl_close($ch);
echo $result;
echo "<br>";
echo "-------------------------";
echo "<br>";

 //STEP 2 -- GET DATA

$url = 'https://starline-online.ru/device?tz=300&_=1512134458324'; 
// это собственно страница, на которую нам надо заходить уже залогинившись
   $ch = curl_init();   
//   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
//curl_setopt($ch, CURLOPT_POST, count($fields));
//curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);


   $result = curl_exec($ch);
   curl_close($ch);
//SaveFile(ROOT . 'cached/dialog_result.txt', $result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри

@unlink($cookie_file);


echo $result;
 
*** Сообщение запрещено. Сообщение похоже на спам. ***
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение directman66 » Вт дек 12, 2017 9:55 pm

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

Код: Выделить всё

$cookie_file = ROOT . 'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
//$cookie_file = 'dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN

$url = 'https://starline-online.ru/user/login'; // ссылка, по которой нам надо зайти
// задаём поля, которые будут отправлены при логине     
$fields = array(
    'LoginForm[login]' => gg('balance.StarlineLogin'), // номер телефона
    'LoginForm[rememberMe]' => 'on', 
 'LoginForm[pass]' =>  gg('balance.StarlinePass')

);

print_r($fields);
echo "<br>";
$fields_string = '';
foreach ($fields as $key => $value) {
    $fields_string .= urlencode($key) . '=' . urlencode($value) . '&';
}
rtrim($fields_string, '&');
echo $fields_string;

echo "<br>";
echo $data;
echo "<br>";
echo "<br>";
$ch = curl_init();
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
//curl_setopt($ch, CURLOPT_POST, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0',
'Accept: application/json, text/javascript, */*; q=0.01',
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With: XMLHttpRequest'
));


$result = curl_exec($ch);
curl_close($ch);
echo $result;
echo "<br>";
echo "-------------------------";
echo "<br>";

 //STEP 2 -- GET DATA

$url = 'https://starline-online.ru/device?tz=300&_=1512134458324'; 
// это собственно страница, на которую нам надо заходить уже залогинившись
   $ch = curl_init();   
//   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
//curl_setopt($ch, CURLOPT_POST, count($fields));
//curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);


   $result = curl_exec($ch);
   curl_close($ch);
//SaveFile(ROOT . 'cached/dialog_result.txt', $result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри

@unlink($cookie_file);


echo $result;
 
*** Сообщение запрещено. Сообщение похоже на спам. ***
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 693 раза
Контактная информация:

Re: вытягивание данных с сайтов, закрытых формой логина

Сообщение directman66 » Вт дек 12, 2017 9:57 pm

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

Код: Выделить всё

$cookie_file = ROOT . 'cached/dialog_cookie.txt'; //в этом файле будет храниться сессия
//$cookie_file = 'dialog_cookie.txt'; //в этом файле будет храниться сессия
// STEP 1 -- LOGIN

$url = 'https://starline-online.ru/user/login'; // ссылка, по которой нам надо зайти
// задаём поля, которые будут отправлены при логине     
$fields = array(
    'LoginForm[login]' => gg('balance.StarlineLogin'), // номер телефона
    'LoginForm[rememberMe]' => 'on', 
 'LoginForm[pass]' =>  gg('balance.StarlinePass')

);

print_r($fields);
echo "<br>";
$fields_string = '';
foreach ($fields as $key => $value) {
    $fields_string .= urlencode($key) . '=' . urlencode($value) . '&';
}
rtrim($fields_string, '&');
echo $fields_string;

echo "<br>";
echo $data;
echo "<br>";
echo "<br>";
$ch = curl_init();
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
//curl_setopt($ch, CURLOPT_POST, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0',
'Accept: application/json, text/javascript, */*; q=0.01',
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With: XMLHttpRequest'
));


$result = curl_exec($ch);
curl_close($ch);
echo $result;
echo "<br>";
echo "-------------------------";
echo "<br>";

 //STEP 2 -- GET DATA

$url = 'https://starline-online.ru/device?tz=300&_=1512134458324'; 
// это собственно страница, на которую нам надо заходить уже залогинившись
   $ch = curl_init();   
//   curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
   curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
//curl_setopt($ch, CURLOPT_POST, count($fields));
//curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);


   $result = curl_exec($ch);
   curl_close($ch);
//SaveFile(ROOT . 'cached/dialog_result.txt', $result); // сохранять в файл не обязательно, это я делаю просто для того чтобы посмотреть что внутри

@unlink($cookie_file);


echo $result;
*** Сообщение запрещено. Сообщение похоже на спам. ***
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Ответить