Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

История о парсинге одного aspx сайта

Anna | 29.05.2014 | нет комментариев

Предыстория

Существует одна онлайн-система работы с заявками заказчиков, с которой моему молодому человеку доводится трудиться. Система, возможно, функциональная, классна для менеджеров, результативная в управлении и прочая, но насколько же неудобна она в ежедневном применении!

  1. Не запоминает логин, пароль и город — в итоге позже входа необходимо дождаться загрузки всех заявок из дефолтного города, а потом переходить на свой.
  2. Не каждая нужная информация доступна из всеобщего списка заявок. За частью ее доводится заглядывать вовнутрь заявки, а всякая из них открывается в новом окне (там джаваскрипт и нет даже типичного признака href, представляете?).
  3. Сделана эта прелесть на asp, и следственно при всяком переходе гоняет по сети свои viewstate.
  4. Ну и минимальная ширина сайта в полторы с чем-то тысячи точек не доставляет удовольствия.

Особенность же работы принуждает изредка заходить в систему с мобильного телефона и с мобильного же интернета.
И если бы я работала с ней сама, то ничего не случилось бы — привыкла бы, адаптировалась, да и вообще, руководство же жаждет… Но близкого человека ничтожно, и появилась идея написать парсер заявок.

История

Вообще-то я верстальщик. И веб-разрабочик, но в этой стороне скилл не столь высок, каждого лишь делаю сносные сайты на wordpress’е. Со любыми грозными curl запросами до этого не сталкивалась. И с aspx сайтами — тоже.
Но чай увлекательно же!
(вылилось это в месяц вечеров с php и несколько бессонных ночей. И море удовольствия, безусловно же)

Вначале были попытки кроссдоменных запросов с поддержкой javascript, но в этой стороне ничего не вышло.
Потом несмелые раскопки в стороне phantomjs и прочей эмуляции поведения пользователя. Но, оказалось, что навыков js у меня все же не хватает.
В итоге все работает на curl запросах, идущих от php страницы.

Приобретение информации

Авторизация получилась довольно стремительно, и заработала больше либо менее без задач.
Самой отвратной задачей оказалось лимитация по числу неправильных вводов пароля: два раза — и звони админу, восстанавливай доступ…

А вот с переходом на необходимый город настойчиво не получалось. Переход производился, но куда-то не туда, правда POST запрос был исполнен по каждому правилам.
Оказалось, что preg_match некорректно работает с дюже огромными числами символов.
От этого выручает указание директивы

ini_set("pcre.backtrack_limit", 10000000);

Вначале получаем исходное состояние страницы (так как мы еще не залогинены, то попадаем на страницу логина), и выдираем оттуда viewstate:

	$url = 'http://***/Default.aspx';
	$content = curlFunction($url);
	preg_match_all("/id="__VIEWSTATE" value="(.*?)"/", $content, $arr_viewstate);
	$viewstate = urlencode($arr_viewstate[1][0]);

Сейчас, теснее имея на руках востребованный слепок состояния страницы, вводим логин и пароль.
(postdata — это параметра POST запроса к странице, подсмотреть дозволено в том же firebug).

	$url = 'http://***/Default.aspx?ReturnUrl=%2fHome%2fRoutes.aspx';
	$postdataArr = array(
		'__LASTFOCUS=',
		'__EVENTTARGET=',
		'__EVENTARGUMENT=',
		'__VIEWSTATE='.$viewstate,
		'ctl00$cphMainContent$loginBox$loginBox$UserName='.$login,
		'ctl00$cphMainContent$loginBox$loginBox$Password='.$password,
		'ctl00$cphMainContent$loginBox$loginBox$LoginButton=Войти',
		);
	$postdata = implode('&',$postdataArr);
	$content = curlFunction($url, $postdata);
	preg_match_all("/id="__VIEWSTATE" value="(.*?)"/iu", $content, $arr_viewstate);
 	$viewstate = urlencode($arr_viewstate[1][0]);

Из-за того, что исходная ссылка выдана с редиректом, а у curl стоит настройка

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);	// переходит по редиректам

мы получаем мы получаем в итоге viewstate требуемой нам страницы.

Именно на этом моменте и появлялась задача с неработающим preg_replace, но решение — спасибо прогру — нашлось.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB