Pull to refresh

Автоматизируем работу с сайтом за 5 минут на примере Yandex.Почты с помощью NetExport

Reading time7 min
Views10K
Иногда, бывает нужно автоматизировать некоторые процессы на чужом сайте. Залогиниться на сайт, скачать какой нибудь файл, открыть страничку. Часто приходится разбираться в коде сайта, чтобы найти, как правильно написать запрос curl.

Предлагаю Вашему вниманию способ, которым я сам пользуюсь, чтобы значительно облегчить себе жизнь и автоматизировать все и вся, от проверки почты, до загрузки данных в телебанке. Я постараюсь, на примере Yandex.почты показать, как можно очень быстро и почти без программирования сгенерить curl php скрипт для захода на любой сайт и загрузки контента в автоматическом режиме.

Для начала, нам необходимо установить Firebug расширение для браузера Firefox. После чего, установить расширение для FireBug NetExport

Последние версии netExport позволяют автоматически собирать сетевые логи ваших действий в формате HTTP Archive

Теперь переходим на интересующий нас сайт, в данном случае это будет mail.yandex.ru. После чего, лучше очистить все кукисы и кеш браузера. Теперь включаем FireBug нажатием на значок жучка на статусной строке браузера. После чего включаем Сеть, отключаем на всякий случай кеш.

image

Если плагин NetExport установился, вы увидите кнопку «Export» в панели Firebug и желтый кружок рядом с ней. Для того, чтобы плагин записывал все ваши действия в автоматическом режиме необходимо установить директорию по умолчанию для записи логов и нажать на желтый кружок (он станет зеленым, как на картинке).

image

Теперь просто заходите под своим аккаунтом и делаете нужное вам действие. В моем случае мне нужно просто сделать логин и перейти на страницу с письмами. Сделали, останавливаем NetExport нажатием на зеленый кружок. В папке, которую мы выбрали по-умолчанию появилось несколько файлов. Их можно проанализировать с помощью онлайн вьюера и написать код для автоматизации.

Однако, я написал маленький сервис, который позволяет это сделать автоматически. Зайдя по ссылке har2php.sharecoder.com вы можете просто загрузить Ваш лог файл в сервис и он напишет для Вас код на PHP. В моем случае, мне нужно загрузить туда файл «passport-ckicheck.yandex.ru+2010-02-18+10-15-21.har» и вуаля :) Сервис сделал для себя, поэтому не очень хорошо переваривает большие лог файлы, но дело свое знает хорошо. Сервис не хранит отправленных данных и держит их только в текущей сессии. Однако, для пущей безопасности, рекомендуется предварительно, перед отправкой HAR файла на сервис, заменить настоящие логины и пароли какими-нибудь символами.

Copy Source | Copy HTML
  1. $cookie_file = 'cookie.txt';
  2.  
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, 'https://passport.yandex.ru/passport?mode=auth');
  5. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6');
  6. curl_setopt($ch, CURLOPT_REFERER, 'http://mail.yandex.ru/');
  7. curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
  8. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
  9. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
  10.  
  11. $header = array();
  12. $header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
  13. $header[] = 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7';
  14. $header[] = 'Accept-Language: ru,en-us;q=0.7,en;q=0.3';
  15. $header[] = 'Pragma: ';
  16. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  17. curl_setopt($ch, CURLOPT_POST, true);
  18.  
  19. $fields = array();
  20. $fields[] = 'login=xxxxx';
  21. $fields[] = 'passwd=xxxxx';
  22. $fields[] = 'retpath=xxxxx';
  23. $fields[] = 'twoweeks=yes';
  24.  
  25. curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $fields));
  26. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  27. curl_setopt($ch, CURLOPT_AUTOREFERER, true);
  28. curl_exec($ch);
  29. curl_close($ch);

Код, после нескольких косметических изменений можно использовать по назначению :)

P.S. для тех, кто все-таки опасается отправлять логи на сайт, открываю исходный код текущей версии сервиса:

Copy Source | Copy HTML
  1. <?php
  2.  
  3. $data = implode('',file($uploadfile));
  4. $data = json_decode($data);
  5.  
  6. unlink($uploadfile);
  7.  
  8. $lines = parseData($data);
  9.  
  10.  
  11. function parseData($data)
  12. {
  13.   $lines = array();
  14.  
  15.   foreach ($data->{'log'}->{'pages'} as $page) {
  16.     $exclude_url = array();
  17.     foreach ($data->{'log'}->{'entries'} as $entrie) {
  18.       if ($entrie->{'pageref'} != $page->{'id'}) continue;
  19.       if (!empty($exclude_url[$entrie->{'request'}->{'url'}])) continue;
  20.  
  21.       if (false and preg_match('/\d+-\d+-\d+T\d+:\d+:\d+\.(\d+)/', $entrie->{'startedDateTime'}, $m)) {
  22.         $id = strftime('%Y%m%d%H%M%S', strtotime($entrie->{'startedDateTime'})) . $m[1];
  23.       } else {
  24.         $id = $entrie->{'startedDateTime'};
  25.       }
  26.       $lines[$id][] = '$cookie_file = \'cookie.txt\';';
  27.       $lines[$id][] = '';
  28.  
  29.       $headers = array();
  30.  
  31.       foreach ($entrie->{'request'}->{'headers'} as $header) {
  32.         $headers[$header->{'name'}] = $header->{'value'};
  33.       }
  34.  
  35.       $lines[$id][] = '$ch = curl_init();';
  36.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_URL, \'' . $entrie->{'request'}->{'url'} . '\');';
  37.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_USERAGENT, \'' . $headers['User-Agent'] . '\');';
  38.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_REFERER, \'' . $headers['Referer'] . '\');';
  39.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_ENCODING, \'' . $headers['Accept-Encoding'] . '\');';
  40.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);';
  41.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);';
  42.       $lines[$id][] = '';
  43.       $lines[$id][] = '$header = array();';
  44.       $lines[$id][] = '$header[] = \'Accept: ' . $headers['Accept'] . '\';';
  45.       $lines[$id][] = '$header[] = \'Accept-Charset: ' . $headers['Accept-Charset'] . '\';';
  46.       $lines[$id][] = '$header[] = \'Accept-Language: ' . $headers['Accept-Language'] . '\';';
  47.       $lines[$id][] = '$header[] = \'Pragma: \';';
  48.       $lines[$id][] = 'curl_setopt($ch, CURLOPT_HTTPHEADER, $header);';
  49.  
  50.       switch ($entrie->{'request'}->{'method'}) {
  51.         case 'GET':
  52.           $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, false);';
  53.           break;
  54.         case 'POST':
  55.           if ($entrie->{'request'}->{'postData'}->{'mimeType'} == 'application/x-www-form-urlencoded') {
  56.             $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, true);';
  57.           } else {
  58.             $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, false);';
  59.           }
  60.           $lines[$id][] = '';
  61.           $lines[$id][] = '$fields = array();';
  62.           foreach ($entrie->{'request'}->{'postData'}->{'params'} as $param) {
  63.             $lines[$id][] = '$fields[] = \'' . $param->{'name'} . '='. $param->{'value'} . '\';';
  64.           }
  65.           $lines[$id][] = '';
  66.           $lines[$id][] = 'curl_setopt($ch, CURLOPT_POSTFIELDS, implode(\'&\', $fields));';
  67.           break;
  68.         default:
  69.           die(print_r($entrie));
  70.       }
  71.  
  72.       if ($entrie->{'response'}->{'status'} == '302') {
  73.         $lines[$id][] = 'curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);';
  74.         $lines[$id][] = 'curl_setopt($ch, CURLOPT_AUTOREFERER, true);';
  75.         $exclude_url[$entrie->{'response'}->{'redirectURL'}] = true;
  76.       } else {
  77.         $lines[$id][] = 'curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);';
  78.         $lines[$id][] = 'curl_setopt($ch, CURLOPT_AUTOREFERER, false);';
  79.       }
  80.  
  81.       $lines[$id][] = 'curl_exec($ch);';
  82.       $lines[$id][] = 'curl_close($ch);';
  83.       $lines[$id][] = '';
  84.     }
  85.   }
  86.  
  87.   return $lines;
  88. }
  89.  
  90. ?>
  91.  
Tags:
Hubs:
Total votes 42: ↑40 and ↓2+38
Comments21

Articles