curl ходить по редиректам

PHP cURL следуют за редиректом и получают результат

Если вы посещаете URL:

тогда он будет перенаправлен и результаты будут показаны по URL:

Я пытаюсь с помощью PHP cURL получить эти результаты, но страница пуста. Это не перенаправление.

Вот мой код, который я попробовал:

Как заставить это работать?

Решение

==== (возможно) Проблема: ваша конфигурация PHP имеет safe_mode или же open_basedir включен.

CURLOPT_FOLLOWLOCATION (целое число) Эта константа недоступна, когда
open_basedir или safe_mode включены. (http://php.net/manual/en/curl.constants.php )

==== (возможно) Проблема: удаленная служба не отвечает, как вы ожидаете. Разбейте его на отдельные части и зарегистрируйте вывод или проверьте Google Chrome (или аналогичный) для перенаправления:

curl ходить по редиректам

Ага! Chrome показывает, что перенаправления нет!

==== Проблема: вы выполняете запрос дважды (вы, вероятно, заметили это!):

==== Проблема: вы ожидаете json_decode HTML-ответ. Это не будет работать (и не может ожидать).

КОРОЧЕ
Похоже, что в JavaScript есть перенаправление, которое использует эта страница, в отличие от обычных перенаправлений заголовка. Возможно, вам придется переосмыслить свой подход, так как вы, вероятно, будете изо всех сил пытаться извлечь эту информацию со страницы, и она, безусловно, подвергнется изменениям. (На самом деле это отправка формы по следующему URL, поэтому вам придется выяснить, откуда поступают данные — снова проверьте журнал Chrome).

(сноска) И код, который поможет вам определить это в PHP (для этого URL он сразу возвращает 200 — перенаправления нет!):

Источник

Проблемы с редиректом для CURL

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

Это указывает cURL что в случае если при загрузке указанного URL будет получен редирект (т.е. статус 301 или 302) то будет автоматически осуществлен переход и загрузка страницы по новому адресу. Удобно и практично. Но не всегда.
Оказывается что из-за соображений безопастности эта опция может игнорироваться. И тогда получаем сообщение об ошибке:

И соответственно редирект автоматически не срабатывает. Получить такой сюрприз можно на шаред хостингах где включен режим safe_mode или же установленно ограничение для open_basedir
И можно к гадалке не ходить — хостер не отключит данные настройки безопастности ради вас. И его можно понять.
А нам надо искать обходные пути 🙂
Самым простым и легким для меня оказалось сделать самостоятельную обработку заголовка Location:. Рассказываю как

Изначально вся работа с cURL у меня ведется через сапописную функцию make_curl — я ей URL — она мне содержимое страницы.
Поэтому в данную функцию добавил инициализацию следующего параметра

Таким образом в результате ответа кроме содержимого страницы появились еще и HTTP заголовки.

В самом конце функции, перед тем как вернуть результат работы вместо

добавил следующий код

Т.е. обрабатывается случай редиректа (код статуса 301 или 302), из заголовков вырезается новый URL и уже с ним функция вызывает рекурсивно саму себя.

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

Источник

Как с помощью Curl проигнорировать 307 редирект?

Есть сайт с обратным аукционом. Сделан он так, что когда мы листаем страницы с 1 на 2, со второй на 3-ью и так далее, url mysite/listing никак не изменяется. При этом если ввести вручную адрес типа mysite/listing?page=3, то мы попадаем на страницу номер 3.

Так было до сего дня.

Теперь, вводя mysite/listing?page=3, мы получаем страницу с URL адресом mysite/listing?page=3, а контент на странице mysite/listing. Код переадресации 307.
Если вовремя остановить загрузку страницы, нажав крестик, то переадресацию не успеватю произойти и все нормально.

1) Какой параметр CURL позволяет игнорировать переадресацию 307? ( вот эта конструкция не работает curl_setopt($ch, CURLOPT_AUTOREFERER, 0);)
2) Каким образом можно остановить работу скрипта CURL допустим через 1 секунду, чтобы получить контент до переадресации? (аналог нажатия кнопки «Остановить загрузку страницы»)
3) Задача казаться живым человеком. Есть ли «опасность» вычисления что я бот, если все запросы будут на середины страницы обрываться?
4) Если 3 это да, то какая схема поможет продолжать казаться человеком? (например, качаем страницу, до редиректа все сохраняем в файл «а», после редиректа сохраняем файл «б». Работаем с файлом «а»)
5) Есть ли алетернативные способы ограничения переадресации 307? (Например, если задать игнорирование какого-то куска кода, или фильтрация через прокси, короче чтобы попроще и работало=))

Источник

Утилита командной строки CURL

CURL — утилита командной строки для Linux или Windows, поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах сайтов и других операций с URL адресами. Поддержка CURL добавлена в множество различных языков программирования и платформ.

curl ходить по редиректам

Запускаем командную строку, переходим в директорию curl/bin и пытаемся скачать главную страницу Google:

Следовать за редиректами

Сохранить вывод в файл

Сохраняем страницу Google в файл google.html :

Сохраняем документ gettext.html в файл gettext.html :

Загрузить файл, только если он изменён

Прохождение аутентификации HTTP

Получение и отправка cookie

Cookie используются сайтами для хранения некой информации на стороне пользователя. Сервер сохраняет cookie на стороне клиента (т.е. в браузере), отправляя заголовки:

А браузер, в свою очередь, отправляет полученные cookie обратно на сервер при каждом запросе. Разумеется, тоже в заголовках:

Передать cookie на сервер, как будто они были ранее получены от сервера:

Чтобы сохранить полученные сookie в файл:

Затем можно отправить сохраненные в файле cookie обратно:

Файл cookie.txt имеет вид:

Получение и отправка заголовков

По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:

Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен HEAD запрос):

А вот так можно отправить свой заголовок:

Отправка данных методом POST

Содержимое файла data.txt :

Пример URL-кодирования данных из файла перед отправкой POST-запроса:

Содержимое файла username.txt :

Загрузка файлов методом POST

Чтобы отправить на сервер данные такой формы:

Работа по протоколу FTP

Скачать файл с FTP-сервера:

Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:

Источник

Оттачиваем мастерство работы с cURL

cURL – это специальный инструмент, который предназначен для того, чтобы передавать файлы и данные синтаксисом URL. Данная технология поддерживает множество протоколов, таких как HTTP, FTP, TELNET и многие другие. Изначально cURL было разработано для того, чтобы быть инструментом командной строки. К счастью для нас, библиотека cURL поддерживается языком программирования PHP. В этой статье мы рассмотрим некоторые расширенные функций cURL, а также затронем практическое применение полученных знаний средствами PHP.

Почему cURL?

На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые PHP функции вместо cURL:

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

Базовая структура

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

Шаг #2 (то есть, вызов curl_setopt()) будем обсуждать в этой статье намного больше, чем все другие этапы, т.к. на этой стадии происходит всё самое интересное и полезное, что вам необходимо знать. В cURL существует огромное количество различных опций, которые должны быть указаны, для того чтобы иметь возможность сконфигурировать URL-запрос самым тщательным образом. Мы не будем рассматривать весь список целиком, а остановимся только на том, что я посчитаю нужным и полезным для этого урока. Всё остальное вы сможете изучить сами, если эта тема вас заинтересует.

Проверка Ошибки

Вдобавок, вы также можете использовать условные операторы для проверки выполнения операции на успех:

Тут прошу отметить для себя очень важный момент: мы должны использовать “=== false” для сравнения, вместо “== false”. Для тех, кто не в курсе, это поможет нам отличать пустой результат от булевого значения false, которое и будет указывать на ошибку.

Получение информации

Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.

Возвращаемый массив содержит следующую информацию:

Обнаружение перенаправления в зависимости от браузера

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

Мы собираемся использовать опцию CURLOPT_HTTPHEADER для того, чтобы определить наши исходящие HTTP заголовки, включая название браузера пользователя и доступные языки. В конечном итоге мы сможем определить, какие сайты перенаправляют нас к разным URL.

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

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

curl ходить по редиректам

Создание POST запроса на определённый URL

При формировании GET запроса передаваемые данные могут быть переданы на URL через “строку запроса”. Например, когда Вы делаете поиск в Google, критерий поиска располагаются в адресной строке нового URL:

Для того чтобы сымитировать данный запрос, вам не нужно пользоваться средствами cURL. Если лень вас одолевает окончательно, воспользуйтесь функцией “file_get_contents()”, для того чтобы получить результат.

Но дело в том, что некоторые HTML-формы отправляют POST запросы. Данные этих форм транспортируются через тело HTTP запроса, а не как в предыдущем случае. Например, если вы заполнили форму на форуме и нажали на кнопку поиска, то скорее всего будет совершён POST запрос:

Мы можем написать PHP скрипт, который может сымитировать этот вид URL запроса. Сначала давайте создадим простой файл для принятия и отображения POST данных. Назовём его post_output.php:

Затем мы создаем PHP скрипт, чтобы выполнить cURL запрос:

При запуске данного скрипта вы должны получить подобный результат:

curl ходить по редиректам

Загрузка файла

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

Сначала давайте создадим файл для того, чтобы сформировать его и отправить файлу upload_output.php:

А вот и код скрипта, который выполняет указанный выше функционал:

Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:

curl ходить по редиректам

Множественный cURL

Одной из самых сильных сторон cURL является возможность создания «множественных» cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.

В классическом варианте cURL запроса выполнение скрипта приостанавливается, и происходит ожидание завершения операции URL запроса, после чего работа скрипта может продолжиться. Если вы намереваетесь взаимодействовать с целым множеством URL, это приведёт к довольно-таки значительным затратам времени, поскольку в классическом варианте вы можете работать только с одним URL за один раз. Однако, мы можем исправить данную ситуацию, воспользовавшись специальными обработчиками.

Давайте рассмотрим пример кода, который я взял с php.net:

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

В этом примере есть два основных цикла. Первый цикл do-while вызывает функцию curl_multi_exec(). Эта функция не блокируемая. Она выполняется с той скоростью, с которой может, и возвращает состояние запроса. Пока возвращенное значение является константой ‘CURLM_CALL_MULTI_PERFORM’, это означает, что работа ещё не завершена (например, в данный момент происходит отправка http заголовков в URL); Именно поэтому мы продолжаем проверять это возвращаемое значение, пока не получим другой результат.

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

Проверяем ссылки в WordPress

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

Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 404, после чего предоставит нам подробнейший отчёт.

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

Давайте же наконец начнём. Сначала мы должны сделать выборку всех ссылок из базы данных:

Сначала мы формируем конфигурационные данные для взаимодействия с базой данных, далее пишем список доменов, которые не будут участвовать в проверке ($excluded_domains). Также мы определяем число, характеризующее количество максимальных одновременных соединений, которые мы будем использовать в нашем скрипте ($max_connections). Затем мы присоединяемся к базе данных, выбираем посты, которые содержат ссылки, и накапливаем их в массив ($url_list).

Следующий код немного сложен, так что разберитесь в нём от начала до конца:

Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии.

Я использовал данный скрипт на своем блоге (с некоторыми неработающими ссылками, которые добавил нарочно для того, чтобы протестировать его работу) и получил следующий результат:

curl ходить по редиректам

В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее.

Пару слов о других полезных опциях cURL

HTTP Аутентификация

Если на URL адресе есть HTTP аутентификация, то вы без труда можете воспользоваться следующим скриптом:

FTP загрузка

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

Используем Прокси

Вы можете выполнить свой URL запрос через прокси:

Функции обратного вызова

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

Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.

Заключение

Сегодня мы познакомились с тем, как можно применить библиотеку cURL в своих корыстных целях. Я надеюсь, что вам понравилась данная статья.

Спасибо! Удачного дня!

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.net.tutsplus.com/tutorials/php/techniques-and-resources-for-mastering-curl/
Перевел: Станислав Протасевич
Урок создан: 5 Июля 2011
Просмотров: 165388
Правила перепечатки

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

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

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

curl ходить по редиректам

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

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

curl ходить по редиректам

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

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

curl ходить по редиректам

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

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

curl ходить по редиректам

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *