Curl — Авторизация в wi-fi через curl php


Содержание

Авторизация через cURL – как?

Доброго времени суток!

В наличии php 5.4, apache 2.4, мой личный аккаунт на hh.ru.

Задача: получить доступ к страницам hh.ru из-под авторизованного пользователя. Никакого взлома или чужих аккаунтов не нужны – авторизация под своим собственным аккаунтом.

Пробовал решить так:

Однако, вижу страницу для авторизации.
Доступ к кукам есть:
$ sudo chmod 1777 cookie.txt
В них есть несколько токенов и строка с «hhrole anonymous», что не ест гут.

В какую сторону копать? Почему cURL не может авторизоваться и как это исправить?

27.03.2014, 14:08

Авторизация через CURL
Всем привет. Пишу парсер и нужно авторизовываться на сайте, авторизация вроде проходит но.

Авторизация через curl
Здравствуйте. Есть проблема, нужна помощь в ее решении. В общем нужно перейти по ссылке.

Авторизация через cURL QIWI
Код не работает, выдает ошибку. 4 27.03.2014, 14:20 2 27.03.2014, 14:37 [ТС] 3

MVS76, спасибо, посмотрел и опробовал оба. Различаются только настройками SSL. Оба не работают для хедхантера.
Страшный чем? Мне лень писать вызов curl_setopt() для каждой настройки по отдельности. Но можно и переформатировать, если бы мог отредактировать свой же пост.

Посмотрите во вкладку network в инкогнито-хроме – первая печенька с записью htoken ставится при любом заходе на сайт, затем этот hhtoken посылается вместе с постом авторизации на /login.do
И вот на этом месте у меня затык – там происходит один непонятный редирект и несколько обменов хэшами клиента с сервером по разным урлам. cURL вроде как по ним ходит, но, наверное, отправляет невалидные данные?
Хотеось бы понять как это сделать чуть более высокоуровнево, чем ручное формирование header() и их отправка.

Просто копипаст печенек не прокатит в случае с конкретно хедхантером.

Команда curl. Синтаксис. Примеры использования

Сurl – утилита командной строки для скачивания и загрузки данных. Она выросла из проекта шведского программиста Даниэля Стенберга. Изначально в середине 90-х, на заре развития Интернета, он разрабатывал бота, который должен был загружать с веб-страницы курсы валют и сообщать пользователям IRC эквивалент шведских крон в долларах США. Со временем проект развивался, появлялась поддержка различных протоколов и новые функции. Теперь curl используется для передачи любых данных и ряда других полезных задач. Рассмотрим основные моменты работы с этим инструментом.

Синтаксис и опции curl

Синтаксис команды следующий:

В качестве аргумента задается, как правило, URL скачиваемого файла. Основные опции перечислены ниже

-# — отображать простой прогресс-бар во время загрузки;
-0 — использовать протокол http 1.0;
-1 — использовать протокол шифрования tlsv1;
-2 — использовать sslv2;
-3 — использовать sslv3;
-4 — использовать ipv4;
-6 — использовать ipv6;
-A — указать свой USER_AGENT;
-b — сохранить Cookie в файл;
-c — отправить Cookie на сервер из файла;
-C — продолжить загрузку файла с места разрыва или указанного смещения;
-m — максимальное время ожидания ответа от сервера;
-d — отправить данные методом POST;
-D — сохранить заголовки, возвращенные сервером в файл;
-e — задать поле Referer-uri, указывает с какого сайта пришел пользователь;
-E — использовать внешний сертификат SSL;
-f — не выводить сообщения об ошибках;
-F — отправить данные в виде формы;
-G — если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
-H — передать заголовки на сервер;
-I — получать только HTTP заголовок, а все содержимое страницы игнорировать;
-j — прочитать и отправить cookie из файла;
-J — удалить заголовок из запроса;
-L — принимать и обрабатывать перенаправления;
-s — максимальное количество перенаправлений с помощью Location;
-o — выводить контент страницы в файл;
-O — сохранять контент в файл с именем страницы или файла на сервере;
-p — использовать прокси;
—proto — указать протокол, который нужно использовать;
-R — сохранять время последнего изменения удаленного файла;
-s — выводить минимум информации об ошибках;
-S — выводить сообщения об ошибках;
-T — загрузить файл на сервер;
-v — максимально подробный вывод;
-y — минимальная скорость загрузки;
-Y — максимальная скорость загрузки;
-z — скачать файл, только если он был модифицирован позже указанного времени;
-V — вывести версию.

Основные опции мы рассмотрим на простых примерах.

Просмотр версии curl

Опция -V или —version выводит не только версию curl, но и краткую информацию о поддерживаемых протоколах и функциях:

Скачивание файла

Если вам требуется скачать файл, запустите curl с опцией –O или –o. Первая из них сохраняет файл в текущей рабочей директории под тем же именем, что и в удаленном месторасположении. Вторая опция позволяет вам указать другое имя и/или место для скачивания.

Cохранение файла под исходным именем (yourfile) в текущей рабочей директории.

Cохранение файла под именем newfile в директории /tmp/examplе/.

Возобновление прерванной загрузки

Если скачивание по какой-то причине было прервано (например, пользователь нажал Ctrl+C), вы легко можете возобновить его с момента остановки при помощи опции -C – (дефис, С, тире):

Скачивание нескольких файлов

Следующая команда позволит вам скачать info.html с http://yoursite.com и about.html c http://mysite.com в один прием:

Если использовать curl вместе с командой xargs, можно скачивать файлы в соответствии со списком URL, заданном в файле (в данном примере listurls.txt):

Использование прокси-сервера

Если вы подключены через прокси-сервер, нужно указать его команде curl при помощи следующих опций (в данном примере имя сервера proxy.yourdomain.com, порт 8080, имя пользователя user, пароль qwerty1234):

Если ваш прокси-сервер не требует аутентификации, опцию -U user:qwerty1234 указывать не нужно.

Запрос HTTP-заголовков

HTTP-заголовки позволяют удаленному веб-серверу помимо ответа на сам запрос отправлять дополнительную информацию. Она предоставляет клиенту данные о том, как обрабатывать ответ:

Для запроса HTTP-заголовков веб-сайта выполните команду с опцией -I:

$ curl -I https://itproffi.ru

Также эту информацию можно получить, воспользовавшись функциями браузера для разработчиков.

cURL POST-запросы с параметрами

Следующая команда отправит на https://yourdomain.com/info.php параметры firstName и lastName с соответствующими значениями:

Этим приемом можно пользоваться для симуляции работы обычных веб-форм.

Следующая команда скачивает в текущую рабочую директорию файл yourfile с удаленного FTP-сервера ftp://yourftpserver (имя пользователя user, пароль qwerty1234):

Если FTP-сервер поддерживает анонимный вход, параметр –u с именем пользователя и пароля указывать не нужно.

Загрузка файлов на FTP-сервер

Для загрузки локального файла mylocalfile.tar.gz воспользуйтесь следующей командой:

Указание агента пользователя

Агент пользователя – часть информации HTTP-запроса. Она показывает, каким браузером пользуется клиент. Можно посмотреть, что имеющаяся версия curl передает по умолчанию и установить новое значение:

Хотите посмотреть, какие файлы cookie скачиваются на ваш компьютер, когда вы заходите на определенный сайт? Опция —cookie-jar сохраняет их список в файл, который в дальнейшем можно просмотреть при помощи команды cat.

Полученные в предыдущем примере файлы cookie можно использовать в дальнейших запросах к тому же самому сайту:

Цукерберг рекомендует:  C# баг - C# консоль. Ввод пароля.

Изменение разрешения имен

Если вы веб-разработчик и хотите протестировать локальную версию сайта, прежде чем загружать его на сервер, при помощи опции —resolve можно указать curl выполнять разрешение имени вашего сайта на адрес локального узла, например:

Таким образом, при запросе на http://www.yourdomain.com curl будет запрашивать сайт с локального узла, а не использовать DNS или файл /etc/hosts.

Ограничение скорости скачивания

Чтобы curl не занимал всю пропускную способность канала, можно ограничить скорость скачивания при помощи опции —limit-rate:

Заключение

Мы рассмотрели краткую историю появления curl и наиболее характерные примеры применения этой команды. Для более подробной информации можно обратиться к соответствующей man-странице.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Примеры использования cURL в PHP


GET запрос

POST запрос

file_get_contents() так же умеет отправлять POST запросы:

PUT запрос

DELETE запрос

HTTP-метод DELETE используется в REST API для удаления объектов.

Отправка файлов на другой сервер

Отправка файлов осуществляется методом POST :

С PHP 5.5 такой метод загрузки файлов вызывает ошибку, поэтому следует применять CURLFile.

Также через curl можно отправить сразу несколько файлов:

Еще файлы можно отправить методом PUT , например так загружаются файлы в REST API Яндекс Диска.

Скачивание файлов

Curl позволяет сохранить результат сразу в файл, указав указатель на открытый файл в параметре CURLOPT_FILE .

Чтобы CURL сохранял куки в файле достаточно прописать его путь в параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR .

Передать значение кук можно принудительно через параметр CURLOPT_COOKIE .

Имитация браузера

На многих сайтах есть защита от парсинга. Она основана на том что браузер передает серверу user agent , referer , cookie . Сервер проверяет эти данные и возвращает нормальную страницу. При подключение через curl эти данные не передаются и сервер отдает ошибку 404 или 500. Чтобы имитировать браузер нужно добавить заголовки:

HTTP авторизация

Если на сервере настроена HTTP авторизация, например с помощью .htpasswd, подключится к нему можно с помощью параметра CURLOPT_USERPWD .

11 примеров использование команд cURL в режиме реального времени

cURL — инструмент командной строки для получения или отправки данных с использованием синтаксиса URL.

Если вы работаете в службе поддержки, то должны уметь использовать команды cURL для устранения неполадок веб-приложений. cURL — кроссплатформенная утилита для Windows, MAC и UNIX.
Ниже приведены некоторые часто используемые примеры синтаксиса.

1. Проверка возможности подключения к URL-адресу

Если вы работаете в UNIX-системе и пытаетесь подключиться к внешнему URL-адресу, то сначала проверьте наличие доступа к ресурсу через curl . Для этого используйте следующую команду:

2. Сохранение вывод URL / URI в файл

Если нужно сохранить содержимое URL или URI в конкретном файле, используйте следующий синтаксис:

Приведенный выше пример сохранит все содержимое с хоста 74.125.68.100 в файл /tmp/google.html .

3. Показать заголовок запроса и ответа

Если хотите удостовериться, что получаете ожидаемый заголовок запроса и ответа, используйте следующую команду:

4. Загрузить с предельной скоростью

Если нужно узнать, сколько времени требуется для загрузки с определенной скоростью, то используйте следующую команду:

5. Использование прокси для подключения

Если необходимо проверить, можно ли использовать прокси-сервер, примените следующий синтаксис:

6. Проверка URL-адресас введением заголовка

Для устранения конкретной проблемы можно использовать Curl , чтобы вставить в header свои данные. Рассмотрим следующий пример запроса с Content-Type:

Мы просим curl передать Content-Type в качестве application / json в заголовок запроса.

7. Добавить дополнительный заголовок

Вы можете добавить заголовок к запросу с помощью синтаксиса — header .

8. Открыть только заголовок ответа

Если вы хотите быстро проверить заголовок ответа, то для этого можно использовать следующий синтаксис.

9. Подключить HTTPS / SSLURL-адрес и игнорировать любые ошибки SSL -сертификата

Если необходимо получить доступ к https URL-адресу, который выдает ошибку сертификата из-за несоответствия имени хоста, можно использовать следующий синтаксис.

10. Подключиться с использованием определенного протокола (SSL / TLS)

Чтобы подключиться к URL- адресу только по протоколу SSL V2 / V3 или TLS ,используйте следующий синтаксис.

Для подключения с использованием SSLV2:

Для подключения с использованием SSLV3:

Для подключения через TLS:

11. Загрузить файл с FTP-сервера

С помощью cURL можно загрузить файл с ftp-сервера , указав имя пользователя и пароль.

Всегда можно использовать «-v» с любым синтаксисом для вывода в подробном режиме.

Использования cURL онлайн

Да, это возможно. Вы можете выполнить cURL удаленно с помощью следующих инструментов.
Online CURL — компактный инструмент для извлечения URL-адреса онлайн и добавления следующих параметров.

cURL command line builder –позволяет создать команду cURL, с помощью которой можно ввести информацию в пользовательский интерфейс.

cURL — полезная утилита для устранения проблем с подключением в режиме реального времени.

Данная публикация представляет собой перевод статьи « 11 cURL Command Usage with Real-Time Example » , подготовленной дружной командой проекта Интернет-технологии.ру

Как правильно авторизоваться через curl на webasyst

В инете полно примеров curl авторизации, вот один из них:

Вставил его в test.php для пробы и залил в корень сайта. Вызываю через браузер — не работает. Причём открывается страница, есть форма авторизации и даже логин вставился в поле логина, а дальше ничего.

Подскажите, как же всё-таки авторизоваться через curl? Пробовал кто? Знает? Поделитесь мыслями.

2 ответа

Из любопытства, не более: а что такого может находиться в админке, что требуется забирать это таким странным образом? :)

Есть плагин, внутри которого есть отправка формы, которая запускается кнопочкой. Мне нужно сделать авторизацию, чтобы php сымитировало браузер и нажало на эту кнопку, а для этого сперва нужно авторизоваться.

А вот не тут-то было. Вставляю этот код в test.php:


Открываю тест в браузере и вижу всё тоже самое — в поле «логин» вставился логин и всё, пароль в «пароль» не вставился и авторизации нет. С этим кодом всё тоже самое, что и с приведённым изначально. Или что не так делаю?

Знаете, авторизация на php иногда бывает сложнее чем сам парсинг сайта, после авторизации. Каждый случай индивидуален. Тут можно целый список составить для проверки что не так, начиная с протокола HTTP и заголовков.

8 примеров использования cURL вместе с PHP

cURL и его расширение для PHP libcURL являются очень полезными инструментами при решении таких задач, как имитация веб браузера, отправка форм или регистрация на веб сервисе. В данном уроке мы рассмотрим несколько интересных применений cURL совместно с PHP.

1. Проверяем доступность определённого веб сайта

Как узнать, доступен ли определённый веб сайт? cURL поможет ответить на данный вопрос. Данный скрипт можно использовать совместно с планировщиком для мониторинга сайта.

Замените URL в строке 3 на тот, который вам нужен. Скопируйте код на свою страницу, и станет известно, доступен ли указанный сайт.

2. Замена cURL для функции file_get_contents()

Функция file_get_contents() очень полезная, но на многих хостингах она отключена. С помощью cURL можно написать функцию, которая будет работать в точности как file_get_contents() .

3. Получаем последний статус Twitter

С помощью PHP и cURL очень просто получить статус определённого пользователя. Данную информацию можно выводить в блоге.

Использовать функцию очень просто:

4. Twitter: проверяем отношения между двумя пользователями

Если вам нужно узнать, читает ли ваши твиты определенный пользователь, то можно задействовать API Twitter. Данный скрипт выводит true , если два пользователя, указанные на строчках 17 и 18, находятся в дружеских отношениях на Twitter. В противном случае возвращается false .

5. Загружаем и сохраняем изображения со страницы с помощью cURL

Данная функция может быть очень полезна: задаем ей URL страницы и она сохраняет все изображения с нее на вашем сервере.

6. Конвертируем валюту с помощью cURl и Google

Пересчет валюты достаточно простое дело, но курсы достаточно часто изменяются, поэтому приходится использовать сервисы, подобные Google, для получения текущих значений курса пересчета. Функция currency() получает 3 параметра: исходная валюта, целевая валюта и сумма.

7. Получаем информацию о размере файла с помощью cURL

Как определить размер определенного файла, расположенного на другом сервере? Поможет следующая функция. Она получает 3 параметра: URL файла, и (если требуется) имя пользователя и пароль.

8. Загрузка через FTP с помощью cURL

PHP имеет библиотеку FTP library, но также можно использовать cURL для загрузки файлов на FTP сервер. Вот рабочий пример:

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://www.catswhocode.com/blog/amazing-things-to-do-with-php-and-curl
Перевел: Сергей Фастунов
Урок создан: 14 Февраля 2012
Просмотров: 114568
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Цукерберг рекомендует:  Вакансии Russian Robotics

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Многопоточное скачивание в cURL на PHP

В данном топике представлена на мой взгляд удобная и функциональная реализация многопоточного скачивания на cURL для PHP. Возможно кому-то она будет полезна, а мне принесёт инвайт ;)

Скачиванием через cURL не пользовался пусть даже из интереса только ленивый. Будь-то из консоли, либо реализуя код на каком-либо ЯП. Решения блокирующего скачивания одной ссылки валяются на каждом углу сети, к примеру на php.net. Однако, если рассматривать реализации на PHP, то такой подход подчас не подходит ввиду высоких временных затрат на вспомогательные операции ( dns lookup, request waiting и подобные ). Для скачивания большого числа страниц последовательный вариант не приемлем. Если устраивает — дальше можно не читать :)

В Perl, к примеру, можно применять fork() либо нити (use threads) для распараллеливания однопоточных скачиваний. Это не считая богатых возможностей библиотек данного языка. Я лично применял нити и LWP. Однако, речь идёт о PHP, и тут с распараллеливанием большие проблемы ввиду отсутствия данной возможности в принципе. Если кто знает, как создавать нити, сообщите, но я не нашел пока достойных решений. Да, в cURL есть функции curl_multi_*, но вот примеры реализаций на их основе меня не устроили. И, в итоге, решил собрать свой велосипед.

Первоначально отсылаю к простейшему примеру из офф. справочника. Позволю себе привести его тут :)
// create both cURL resources
$ch1 = curl_init ();
$ch2 = curl_init ();

// set URL and other appropriate options

curl_setopt ( $ch1 , CURLOPT_URL , «www.example.com» );
curl_setopt ( $ch1 , CURLOPT_HEADER , 0 );
curl_setopt ( $ch2 , CURLOPT_URL , «www.php.net» );

curl_setopt ( $ch2 , CURLOPT_HEADER , 0 );

//create the multiple cURL handle
$mh = curl_multi_init ();

//add the two handles
curl_multi_add_handle ( $mh , $ch1 );
curl_multi_add_handle ( $mh , $ch2 );

$running = null ;
//execute the handles
do <
curl_multi_exec ( $mh , $running );
> while ( $running > 0 );

//close the handles
curl_multi_remove_handle ( $mh , $ch1 );
curl_multi_remove_handle ( $mh , $ch2 );
curl_multi_close ( $mh );

?>

Код отличается от однопоточного подхода более сложной организацией взаимодействия прикладного кода с библиотекой:
1) Для каждого соединения выполняется свой curl_init() и задаются параметры через curl_setopt(). Тут всё стандартно, привожу без объяснений.
2) Для общего управления скачиванием вызовом curl_multi_init() создается отдельный дескриптор, через который и будет производиться вся дальнейшая работа.
3) К данному дескриптору вызовом curl_multi_add_handle() цепляются созданные в начале отдельный соединения.
Подготовительный этап завершен, теперь непосредственно скачивание:
4) Скачивание библиотекой выполняется автоматически, явного вызова как было с curl_exec() теперь нет. Его заменяет многократный вызов curl_multi_exec(). Несмотря на схожее название, данная функция выполняет несколько другую роль — она блокирующе информирует об изменении числа активных потоков (ну и возникших ошибок). Второй параметр при вызове — ссылка на числовую переменную, в которую сохраняется число активных в данный момент соединений. Количество изменилось — значит какой-то поток завершил работу. Вот по этой причине цикл скачивания и реализован через
do <
curl_multi_exec ( $mh , $running );
> while ( $running > 0 );

5) Ну и наконец после скачивания выполняется освобождение ресурсов. Важно! Хоть соединения, созданные curl_init() и «цепляются» к основному дескриптору, он их автоматически не закрывает, это нужно делать вручную вызовом curl_multi_remove_handle() в добавление к curl_close().

Кому-то может хватить и такой реализации, и они могут дальше не читать. Я же пойду дальше.
Что в данной реализации плохого? Пара наиболее явных моментов:

  1. жёсткое ограничение на скачивание 2х ссылок, заданное прямо в коде
  2. получаемые страницы выводятся прямо в STDOUT

Это лишь часть, остальное обсуждается далее.

Исправляю указанные недостатки и получаю, к примеру, следующее:
= array( «www.example.com» , «www.php.net» );

foreach ( $urls as $url ) <
$chs [] = ( $ch = curl_init () );
curl_setopt ( $ch , CURLOPT_URL , $url );

curl_setopt ( $ch , CURLOPT_HEADER , 0 );
// CURLOPT_RETURNTRANSFER — возвращать значение как результат функции, а не выводить в stdout

curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_multi_add_handle ( $mh , $ch );
>

$prev_running = $running = null ;

do <
curl_multi_exec ( $mh , $running );

if ( $running != $prev_running ) <
// получаю информацию о текущих соединениях

$info = curl_multi_info_read ( $mh );

if ( is_array ( $info ) && ( $ch = $info [ ‘handle’ ] ) ) <

// получаю содержимое загруженной страницы
$content = curl_multi_getcontent ( $ch );

// тут какая-то обработка текста страницы

// пока пусть будет как и в оригинале — вывод в STDOUT
echo $content ;
>

// обновляю кешируемое число текущих активных соединений
$prev_running = $running ;
>

> while ( $running > 0 );

foreach ( $chs as $ch ) <
curl_multi_remove_handle ( $mh , $ch );
curl_close ( $ch );


Далее, вряд ли в большинстве случаев будет достаточно просто выводить страницы в STDOUT. Тем более это происходит в произвольном порядке в зависимости от порядка реального скачивания (а не задания вызовами curl_multi_add_handle() ). Также, если скачивается большой объем, то нет смысла дожидаться получения всех страниц — можно уже начинать обрабатывать их по мере получения. Но и вариант с получением всех скопом также не стоит снимать со счетов.
Для этого: 1) реализую всё в виде функции, 2) введу параметр, задающий callback-функцию, которая будет вызываться для каждого полученного файла. Если callback не задан — применяется вариант с получением всех страниц сразу. Вот пример:
// пример простейшего callback’а. практически dummy-func.
function my_callback ( $url , $content , $curl_status , $ch ) <

echo «Скачивание страницы [$url] » ;
if ( ! $curl_status ) <
echo «было успешным. текст страницы:\n$content\n» ;

>
else <
echo «выполнилось с ошибкой #$curl_status: » . curl_error ( $ch ). «\n» ;
>

function http_load ( $urls , $callback = false ) <
$mh = curl_multi_init ();

$chs = array();
foreach ( $urls as $url ) <
$chs [] = ( $ch = curl_init () );

curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , 0 );
// CURLOPT_RETURNTRANSFER — возвращать значение как результат функции, а не выводить в stdout

curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_multi_add_handle ( $mh , $ch );
>

// если $callback задан как false, то функция должна не вызывать $callback, а выдать страницы как результат работы

if ( $callback === false ) <
$results = array();
>

$prev_running = $running = null ;

do <
curl_multi_exec ( $mh , $running );

if ( $running != $prev_running ) <
// получаю информацию о текущих соединениях

$info = curl_multi_info_read ( $ghandler );

if ( is_array ( $info ) && ( $ch = $info [ ‘handle’ ] ) ) <

// получаю содержимое загруженной страницы
$content = curl_multi_getcontent ( $ch );

// скаченная ссылка
$url = curl_getinfo ( $ch , CURLINFO_EFFECTIVE_URL );

if ( $callback !== false ) <
// вызов callback-обработчика
$callback ( $url , $content , $info [ ‘result’ ], $ch );

>
else <
// добавление в хеш результатов
$results [ $url ] = array( ‘content’ => $content , ‘status’ => $info [ ‘result’ ], ‘status_text’ => curl_error ( $ch ) );

// обновляю кешируемое число текущих активных соединений
$prev_running = $running ;
>

> while ( $running > 0 );

foreach ( $chs as $ch ) <
curl_multi_remove_handle ( $mh , $ch );

curl_close ( $ch );
>
curl_multi_close ( $mh );

// результаты
return ( $callback !== false ) ? true : $results ;

// вариант простой выдачи
print_r ( http_load ( $urls ) );

// вариант с callback
var_export ( http_load ( $urls , my_callback ) );

?>

Вот уже гораздо интереснее. Важный момент: при callback 4ый параметр — дескриптор соединения $ch, а при выдаче результатов хешем — просто строковое описание возникшей ошибки (ну или пустая строка, если всё нормально). Почему? Потому что curl_error() требует передачи дескриптора, который закрывается в конце работы функции. Так что в callback он еще существует и мы можем его использовать, а вот в хеше он уже ничего ценного дать не может. Как вариант, строковые описания кодов ошибок можно взять тут.

Итак, идём дальше. Хочется вызывать функцию не только для массива ссылок, но и иметь возможность скачать ей единственную страницу. Для этого нужно добавить всего-то одну строчку:
function http_load ( $urls , $callback = false ) <

// даже если передан единственный параметр — считаю его элементом массива

// это аналог: $urls = is_array( $urls ) ? $urls : array( $urls );
$urls = (array) $urls ;

. ?>

Вот теперь можно качать ссылки по одной: http_load( ‘google.com’ ). Этакий возврат к истокам.

Потом мне потребовалось задавать много больше передаваемых заголовков для соединений. Указывать их по одному через curl_setopt() не практично. Лучше воспользоваться функцией curl_setopt_array. Переделываю и получаю (часть кода):
< // общие для всех соединений заголовки
$ext_headers = array(
‘Expect:’ ,
‘Accept: text/html,application/xhtml+xml,application/xml;q=0.9’ ,

Цукерберг рекомендует:  Тест по C++. Средний уровень

‘Accept-Language: ru,en-us;q=0.7,en;q=0.7’ ,
//’Accept-Encoding: gzip,deflate’, // нужно потом распаковывать. ну его пока…
‘Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.5’ ,
);
$curl_options = array(

CURLOPT_PORT => 80 ,
CURLOPT_RETURNTRANSFER => 1 , // возвращать значение как результат функции, а не выводить в stdout

CURLOPT_BINARYTRANSFER => 1 , // передавать в binary-safe
CURLOPT_CONNECTTIMEOUT => 10 , // таймаут соединения ( lookup + connect )

CURLOPT_TIMEOUT => 30 , // таймаут на получение данных
CURLOPT_USERAGENT => ‘Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.1) Gecko/20090716 Ubuntu/9.04 (jaunty) Shiretoko/3.5.1’ ,

CURLOPT_VERBOSE => 2 , // уровень информирования
CURLOPT_HEADER => 0 , // заголовок не получается
CURLOPT_FOLLOWLOCATION => 1 , // следовать редиректам

CURLOPT_MAXREDIRS => 7 , // максимальное число редиректов
CURLOPT_AUTOREFERER => 1 , // при редиректе подставлять в «Referer:» значение из «Location:»

// CURLOPT_FRESH_CONNECT => 0, // каждый раз использовать новое соединение
CURLOPT_HTTPHEADER => $ext_headers ,
);
>

function http_load ( $urls , $callback = false ) <
global $curl_options ;

if ( $mh === false ) return false ;

$urls = (array) $urls ;

foreach ( $urls as $url ) <
$chs [] = ( $ch = curl_init () );

curl_setopt_array ( $ch , $curl_options ); // задаю заголовки скопом
curl_setopt ( $ch , CURLOPT_URL , $url );

Прикидываемся Огнелисом. Заголовки я прокомментировал. За подробным объяснением отправляю сюда.
И в догонку к этим заголовкам добавляется третий параметр в функцию:

в котором можно указывать свои заголовки, которые будут дополнительно преданы в соединения при их инициализации. Таким образом можно успешно отправлять POST запросы с параметрами либо указывать свои рефералы и формат передаваемых данных (при компрессии к примеру).

foreach ( $urls as $ind => $url ) <
$chs [] = ( $ch = curl_init () );

curl_setopt_array ( $ch , $curl_options ); // задаю заголовки скопом
curl_setopt ( $ch , CURLOPT_URL , $url );

// есть дополнительные параметры для инициализации данного соединения?
if ( isset( $urls_params [ $ind ] ) && is_array ( $urls_params [ $ind ] ) ) <

curl_setopt_array ( $ch , $urls_params [ $ind ] );
>

curl_multi_add_handle ( $mh , $ch );

Вот такая функция. Еще можно было бы написать про работу с куками и POST-запросами, но это уж если получу инвайт. И так понаписал много, многие ли осилили? ;)

Curl — Авторизация в wi-fi через curl php

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.

Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо

После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..

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

Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.

На последок как оно происходит на форумах

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.

Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

Использование cURL для авторизации.

Новичок

Использование cURL для авторизации.

Здравствуйте,
Пытаюсь написать парсер для корпоративной мэил системы (написана на перле). Но столкнулся с проблемой авторизации php скрипта на сервере мэйлера.

Есть вот такой код:


В итоге выходит страница:
Authorization Required
This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn’t understand how to supply the credentials required.
А затем снова та же веб-форма для второй части авторизации.

Пробовал использовать вторую часть скрипта для авторизации через вебформу на других сайтах, все работает. А вот вместе эти авторизации не пашут.

Подскажите пожалуйста, в чем может быть проблема.

Curl — Авторизация в wi-fi через curl php

Пример входа на сайт через логин-пароль.

Вначале вытягивается страница входа с полями логин-пароль и спецполем token. Потом пересылается логин-пароль и токен через POST и вытягивается страница уже после логина.

/*Дальше устанавливаем опции запроса в любом порядке*/

//Здесь устанавливаем URL к которому нужно обращаться

curl_setopt ($curl, CURLOPT_URL , ‘https://www.olark.com/login/’);

//Настойка опций cookie

curl_setopt ($curl, CURLOPT_COOKIEJAR , ‘cook.txt’); //сохранить куки в файл

curl_setopt ($curl, CURLOPT_COOKIEFILE , ‘cook.txt’); //считать куки из файла

//устанавливаем наш вариат клиента (браузера) и вид ОС

curl_setopt ($curl, CURLOPT_USERAGENT , «Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.2.0»);

//Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP завершал работу скрыто, если возвращаемый HTTP-код имеет значение выше 300. По умолчанию страница возвращается нормально с игнорированием кода.

curl_setopt ($curl, CURLOPT_FAILONERROR , 1 );

//Устанавливаем значение referer — адрес последней активной страницы

curl_setopt ($curl, CURLOPT_REFERER , ‘http://www.olark.com/’);

//Максимальное время в секундах, которое вы отводите для работы CURL-функций.

curl_setopt ($curl, CURLOPT_TIMEOUT , 3 );

curl_setopt ($curl, CURLOPT_POST , 1 ); // устанавливаем метод POST

//ответственный момент здесь мы передаем наши переменные

curl_setopt ($curl, CURLOPT_POSTFIELDS , ‘http://www.olark.com/login/’);

//Установите эту опцию в ненулевое значение, если вы хотите, чтобы шапка/header ответа включалась в вывод.

curl_setopt ($curl, CURLOPT_HEADER , 1 );

//Внимание, важный момент, сертификатов, естественно, у нас нет, так что все отключаем

curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER , 0 ); // не проверять SSL сертификат

curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST , 0 ); // не проверять Host SSL сертификата

curl_setopt ($curl, CURLOPT_FOLLOWLOCATION , 1 ); // разрешаем редиректы

curl_setopt ($curl, CURLOPT_RETURNTRANSFER , 1 );

$html = curl_exec ($curl); // выполняем запрос и записываем в переменную

curl_close ($curl); // заканчиваем работу curl

//подключаем PHP Simple HTML DOM Parser с сайта http://simplehtmldom.sourceforge.net

$html = str_get_html ($html);

//ищем в странице некий authenticity_token и записываем его в переменную $token

$input = $inputs[ 0 ];

// Авторизуемся на сайте со значением authenticity_token в переменной $token

$curl = curl_init (); // инициализируем cURL

/*Дальше устанавливаем опции запроса в любом порядке*/

//Здесь устанавливаем URL к которому нужно обращаться

curl_setopt ($curl, CURLOPT_URL , ‘https://www.olark.com/login/’);

//Настойка опций cookie

curl_setopt ($curl, CURLOPT_COOKIEJAR , ‘cook.txt’); //сохранить куки в файл

curl_setopt ($curl, CURLOPT_COOKIEFILE , ‘cook.txt’); //считать куки из файла

//устанавливаем наш вариат клиента (браузера) и вид ОС

curl_setopt ($curl, CURLOPT_USERAGENT , «Opera/10.00 (Windows NT 5.1; U; ru) Presto/2.2.0»);

//Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP завершал работу скрыто, если возвращаемый HTTP-код имеет значение выше 300. По умолчанию страница возвращается нормально с игнорированием кода.

curl_setopt ($curl, CURLOPT_FAILONERROR , 1 );

//Устанавливаем значение referer — адрес последней активной страницы

curl_setopt ($curl, CURLOPT_REFERER , ‘http://www.olark.com/’);

//Максимальное время в секундах, которое вы отводите для работы CURL-функций.

curl_setopt ($curl, CURLOPT_TIMEOUT , 3 );

curl_setopt ($curl, CURLOPT_POST , 1 ); // устанавливаем метод POST

//ответственный момент здесь мы передаем наши переменные

//замените значения your_name и your_pass на соответственные значения Вашей учетной записи

//Установите эту опцию в ненулевое значение, если вы хотите, чтобы шапка/header ответа включалась в вывод.

curl_setopt ($curl, CURLOPT_HEADER , 1 );

//Внимание, важный момент, сертификатов, естественно, у нас нет, так что все отключаем

curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER , 0 ); // не проверять SSL сертификат

curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST , 0 ); // не проверять Host SSL сертификата

curl_setopt ($curl, CURLOPT_FOLLOWLOCATION , 1 ); // разрешаем редиректы

$result = curl_exec ($curl); // выполняем запрос и записываем в переменную

curl_close ($curl); // заканчиваем работу curl

echo $result; // Выводим на экран результат выполнения

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих