Иногда, бывает нужно автоматизировать некоторые процессы на чужом сайте. Залогиниться на сайт, скачать какой нибудь файл, открыть страничку. Часто приходится разбираться в коде сайта, чтобы найти, как правильно написать запрос curl.
Предлагаю Вашему вниманию способ, которым я сам пользуюсь, чтобы значительно облегчить себе жизнь и автоматизировать все и вся, от проверки почты, до загрузки данных в телебанке. Я постараюсь, на примере Yandex.почты показать, как можно очень быстро и почти без программирования сгенерить curl php скрипт для захода на любой сайт и загрузки контента в автоматическом режиме.
Для начала, нам необходимо установить Firebug расширение для браузера Firefox. После чего, установить расширение для FireBug NetExport
Последние версии netExport позволяют автоматически собирать сетевые логи ваших действий в формате HTTP Archive
Теперь переходим на интересующий нас сайт, в данном случае это будет mail.yandex.ru. После чего, лучше очистить все кукисы и кеш браузера. Теперь включаем FireBug нажатием на значок жучка на статусной строке браузера. После чего включаем Сеть, отключаем на всякий случай кеш.
Если плагин NetExport установился, вы увидите кнопку «Export» в панели Firebug и желтый кружок рядом с ней. Для того, чтобы плагин записывал все ваши действия в автоматическом режиме необходимо установить директорию по умолчанию для записи логов и нажать на желтый кружок (он станет зеленым, как на картинке).
Теперь просто заходите под своим аккаунтом и делаете нужное вам действие. В моем случае мне нужно просто сделать логин и перейти на страницу с письмами. Сделали, останавливаем NetExport нажатием на зеленый кружок. В папке, которую мы выбрали по-умолчанию появилось несколько файлов. Их можно проанализировать с помощью онлайн вьюера и написать код для автоматизации.
Однако, я написал маленький сервис, который позволяет это сделать автоматически. Зайдя по ссылке har2php.sharecoder.com вы можете просто загрузить Ваш лог файл в сервис и он напишет для Вас код на PHP. В моем случае, мне нужно загрузить туда файл «passport-ckicheck.yandex.ru+2010-02-18+10-15-21.har» и вуаля :) Сервис сделал для себя, поэтому не очень хорошо переваривает большие лог файлы, но дело свое знает хорошо. Сервис не хранит отправленных данных и держит их только в текущей сессии. Однако, для пущей безопасности, рекомендуется предварительно, перед отправкой HAR файла на сервис, заменить настоящие логины и пароли какими-нибудь символами.
Код, после нескольких косметических изменений можно использовать по назначению :)
P.S. для тех, кто все-таки опасается отправлять логи на сайт, открываю исходный код текущей версии сервиса:
Предлагаю Вашему вниманию способ, которым я сам пользуюсь, чтобы значительно облегчить себе жизнь и автоматизировать все и вся, от проверки почты, до загрузки данных в телебанке. Я постараюсь, на примере Yandex.почты показать, как можно очень быстро и почти без программирования сгенерить curl php скрипт для захода на любой сайт и загрузки контента в автоматическом режиме.
Для начала, нам необходимо установить Firebug расширение для браузера Firefox. После чего, установить расширение для FireBug NetExport
Последние версии netExport позволяют автоматически собирать сетевые логи ваших действий в формате HTTP Archive
Теперь переходим на интересующий нас сайт, в данном случае это будет mail.yandex.ru. После чего, лучше очистить все кукисы и кеш браузера. Теперь включаем FireBug нажатием на значок жучка на статусной строке браузера. После чего включаем Сеть, отключаем на всякий случай кеш.
Если плагин NetExport установился, вы увидите кнопку «Export» в панели Firebug и желтый кружок рядом с ней. Для того, чтобы плагин записывал все ваши действия в автоматическом режиме необходимо установить директорию по умолчанию для записи логов и нажать на желтый кружок (он станет зеленым, как на картинке).
Теперь просто заходите под своим аккаунтом и делаете нужное вам действие. В моем случае мне нужно просто сделать логин и перейти на страницу с письмами. Сделали, останавливаем NetExport нажатием на зеленый кружок. В папке, которую мы выбрали по-умолчанию появилось несколько файлов. Их можно проанализировать с помощью онлайн вьюера и написать код для автоматизации.
Однако, я написал маленький сервис, который позволяет это сделать автоматически. Зайдя по ссылке har2php.sharecoder.com вы можете просто загрузить Ваш лог файл в сервис и он напишет для Вас код на PHP. В моем случае, мне нужно загрузить туда файл «passport-ckicheck.yandex.ru+2010-02-18+10-15-21.har» и вуаля :) Сервис сделал для себя, поэтому не очень хорошо переваривает большие лог файлы, но дело свое знает хорошо. Сервис не хранит отправленных данных и держит их только в текущей сессии. Однако, для пущей безопасности, рекомендуется предварительно, перед отправкой HAR файла на сервис, заменить настоящие логины и пароли какими-нибудь символами.
Copy Source | Copy HTML
- $cookie_file = 'cookie.txt';
-
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://passport.yandex.ru/passport?mode=auth');
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6');
- curl_setopt($ch, CURLOPT_REFERER, 'http://mail.yandex.ru/');
- curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
- curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
- curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
-
- $header = array();
- $header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
- $header[] = 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7';
- $header[] = 'Accept-Language: ru,en-us;q=0.7,en;q=0.3';
- $header[] = 'Pragma: ';
- curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
- curl_setopt($ch, CURLOPT_POST, true);
-
- $fields = array();
- $fields[] = 'login=xxxxx';
- $fields[] = 'passwd=xxxxx';
- $fields[] = 'retpath=xxxxx';
- $fields[] = 'twoweeks=yes';
-
- curl_setopt($ch, CURLOPT_POSTFIELDS, implode('&', $fields));
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($ch, CURLOPT_AUTOREFERER, true);
- curl_exec($ch);
- curl_close($ch);
Код, после нескольких косметических изменений можно использовать по назначению :)
P.S. для тех, кто все-таки опасается отправлять логи на сайт, открываю исходный код текущей версии сервиса:
Copy Source | Copy HTML
- <?php
-
- $data = implode('',file($uploadfile));
- $data = json_decode($data);
-
- unlink($uploadfile);
-
- $lines = parseData($data);
-
-
- function parseData($data)
- {
- $lines = array();
-
- foreach ($data->{'log'}->{'pages'} as $page) {
- $exclude_url = array();
- foreach ($data->{'log'}->{'entries'} as $entrie) {
- if ($entrie->{'pageref'} != $page->{'id'}) continue;
- if (!empty($exclude_url[$entrie->{'request'}->{'url'}])) continue;
-
- if (false and preg_match('/\d+-\d+-\d+T\d+:\d+:\d+\.(\d+)/', $entrie->{'startedDateTime'}, $m)) {
- $id = strftime('%Y%m%d%H%M%S', strtotime($entrie->{'startedDateTime'})) . $m[1];
- } else {
- $id = $entrie->{'startedDateTime'};
- }
- $lines[$id][] = '$cookie_file = \'cookie.txt\';';
- $lines[$id][] = '';
-
- $headers = array();
-
- foreach ($entrie->{'request'}->{'headers'} as $header) {
- $headers[$header->{'name'}] = $header->{'value'};
- }
-
- $lines[$id][] = '$ch = curl_init();';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_URL, \'' . $entrie->{'request'}->{'url'} . '\');';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_USERAGENT, \'' . $headers['User-Agent'] . '\');';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_REFERER, \'' . $headers['Referer'] . '\');';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_ENCODING, \'' . $headers['Accept-Encoding'] . '\');';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);';
- $lines[$id][] = '';
- $lines[$id][] = '$header = array();';
- $lines[$id][] = '$header[] = \'Accept: ' . $headers['Accept'] . '\';';
- $lines[$id][] = '$header[] = \'Accept-Charset: ' . $headers['Accept-Charset'] . '\';';
- $lines[$id][] = '$header[] = \'Accept-Language: ' . $headers['Accept-Language'] . '\';';
- $lines[$id][] = '$header[] = \'Pragma: \';';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_HTTPHEADER, $header);';
-
- switch ($entrie->{'request'}->{'method'}) {
- case 'GET':
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, false);';
- break;
- case 'POST':
- if ($entrie->{'request'}->{'postData'}->{'mimeType'} == 'application/x-www-form-urlencoded') {
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, true);';
- } else {
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_POST, false);';
- }
- $lines[$id][] = '';
- $lines[$id][] = '$fields = array();';
- foreach ($entrie->{'request'}->{'postData'}->{'params'} as $param) {
- $lines[$id][] = '$fields[] = \'' . $param->{'name'} . '='. $param->{'value'} . '\';';
- }
- $lines[$id][] = '';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_POSTFIELDS, implode(\'&\', $fields));';
- break;
- default:
- die(print_r($entrie));
- }
-
- if ($entrie->{'response'}->{'status'} == '302') {
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_AUTOREFERER, true);';
- $exclude_url[$entrie->{'response'}->{'redirectURL'}] = true;
- } else {
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);';
- $lines[$id][] = 'curl_setopt($ch, CURLOPT_AUTOREFERER, false);';
- }
-
- $lines[$id][] = 'curl_exec($ch);';
- $lines[$id][] = 'curl_close($ch);';
- $lines[$id][] = '';
- }
- }
-
- return $lines;
- }
-
- ?>
-