С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 3

CURL, промежуточная страница с редиректом на 404

08.05.2017, 19:37. Показов 3056. Ответов 5

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.

Есть ресурс: disk-space.ru
Открываем через любой браузер: попадаем на промежуточную страницу "Идет загрузка страницы, подождите" с таймером 4 сек.
После чего нас успешно редиректит на сайт.

Я в сетевых технологиях не шарю, php только осваиваю параллельно с поставленной задачей, соответственно и cURL для меня механизм далеко не освоенный. Хотя попарился я со своей задачей изрядно, решаю я ее уже битый день. Многому научился, но проблема не сдвигается с места!!

Как можно было уже догадаться, проблема: не могу забрать целевую страницу с этого disk-space.ru!!
Насколько я понял, cURL применяют с имитацией заголовков запроса браузера. Есть подобная проблема, которая решена, на этом же форуме по ссылке Не достучаться до сайта используя Curl. Ошибка 404 not found/

Не нашел подробную информацию в сети, как грамотно составлять запросы, имитирующие браузерные, от и до, до достижения всегда необходимой страницы. Часто, видимо, бывает достаточно стандартного cURL запроса с одной лишь опцией URL. Либо вообще обходятся известной функцией - file_get_contents($url).

По ссылке на подобную проблему выше: там все просто, нет ПРЕДВАРЯЮЩЕЙ страницы, дополнительных редиректов. Именно этим осложняется мой случай.
Даже на основную страницу - http://disk-space.ru - попадаешь через промежуточную "Идет загрузка" с таймером - ЕСЛИ НЕТ КУКОВ (о куках далее).

Простым cURL запросом без лишних опций мы получаем эту промежуточную страницу. cURL запрос сделан и завершен. А полученная страница по истечении таймера просто редиректует нас на ОТНОСИТЕЛЬНУЮ ссылку "/cdn-cgi/l/chk_jschl...", где вместо многоточия идут ключи с ответами, отправленные из формы. То есть промежуточная страница имеет скрытую форму с уже сгенерированными двумя случайными значениями для инпутов name=value, а также есть javascript для таймера и javascript, генерирующий третье случайное число, которое идет как value для третьего инпута формы без предустановленного value, после чего функция джаваскрипта f.submit() отправляет форму GET-запросом, и мы попадаем на что-то вроде: "/cdn-cgi/l/chk_jschl?jschl_vc=e6b053d3854b567b3dbba 2261929eaaf&pass=1494161963.724-KX8vlWihJr&jschl_answer=1129". А так как такой страницы нет на локалхосте или на удаленном хостинге, мы получаем ошибку 404.

Возникает понимание, что нужен второй cURL запрос.
Я сделал 2 php-страницы. На первой странице происходит первый cURL запрос, получаем страницу ожидания. Также здесь я через preg_replace заменил относительный адрес (action отправочной формы) - /cdn-cgi/l/chk_jschl - на адрес своей второй страницы. Это сделано для удобства получения целого адреса со всеми ключами - переход на 2ю страницу, и я достаю его из браузерной строки (т.к. метод GET) посредством $_SERVER['REQUEST_URI'] с удалением приставки названия моей второй страницы. Здесь же я делаю второй запрос cURL, подробный, с множеством опций и браузерными заголовками. Я через Firefox в консоли Firebug посмотрел второй запрос (полный адрес со всеми ключами) и сделал точь-в-точь.
УВЫ, целевая страница так и не достается мне!!!

Для первой своей страницы переписывать заголовки с Firebug'а не стал.

По кукам: при первом обращении, как я уже сказал, мы попадаем на промежуточную страницу ожидания со скрытой формой отправки методом GET на относительный адрес. И получаем первый кукис "cfduid". В момент отправки формы происходит переход по адресу "/cdn-cgi/l/chk_jschl..." со статусом 302 Moved Temporarily (Firebug), сервак делает нам второй кукис "cf_clearance", затем редирект на целевой адрес - и вот мы на нужной странице! Это через браузер.

Что у меня: вторая страница делает запрос, и тут у меня было 2 варианта: либо пустая страница, либо СНОВА промежуточная страница ожидания - и вылет на поганую 404.
Если FOLLOWLOCATION выставить false, то белая страница с жирным уведомлением "302 Moved Temporarily"; в этом случае и в первом варианте (пустая страница) как будто бы наблюдается какой-то успех, однако второго кукиса не создается.

Приведу HEADER промежуточной страницы при первом запросе:
HTTP/1.1 503 Service Temporarily Unavailable Date: Sun, 07 May 2017 11:20:46 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Set-Cookie: __cfduid=d26ddb8e6ae19ba93c2191a87083eb1 eb1494156046; expires=Mon, 07-May-18 11:20:46 GMT; path=/; domain=.disk-space.ru; HttpOnly X-Frame-Options: SAMEORIGIN Cache-Control: no-cache Server: cloudflare-nginx CF-RAY: 35b3cab840bc4ede-DME
Этот HEADER совпадает полностью с полученным в Firebug.

При втором запросе во втором моем варианте (когда повторно получаю страницу ожидания и вылетаю на 404) HEADER следующий:
HTTP/1.1 302 Moved Temporarily Date: Mon, 08 May 2017 12:20:46 GMT Content-Type: text/html Content-Length: 165 Connection: keep-alive Location: / Server: cloudflare-nginx CF-RAY: 35bc6000053d4f32-DME X-Frame-Options: SAMEORIGIN HTTP/1.1 503 Service Temporarily Unavailable Date: Mon, 08 May 2017 12:20:46 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Frame-Options: SAMEORIGIN Refresh: 8;URL=/cdn-cgi/l/chk_jschl?pass=1494246050.748-fq89pYqQA8 Cache-Control: no-cache Server: cloudflare-nginx CF-RAY: 35bc600025644f32-DME
Как видим, здесь два HEADER'а сразу, 503й повторяется с первого запроса (или он новый, я не стал это отслеживать), а 302й - новый - имеет оборванное значение Location и НЕ создает второй кукис.

Проверяю я в основном со своего компа (Denwer, "localhost/..."). Есть хостинг, там в принципе то же самое, но геморройно постоянно заливать страницы и редактировать.

В начале темы привел пример подобной головной боли, но там все гораздо проще, человеку сказали в заголовках убрать User-agent и Referer и сделать его опциями cURL-запроса - и автор говорит, что все получилось!

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

В Firebug со страницы ожидания (статус 503) происходит переход на адрес готового вида со всеми ключами: "http://disk-space.ru/cdn-cgi/l/chk_jschl?jschl_vc=8265cdd0fbcb4f62679e2 02229b76997&pass=1494153842.072-lzRbZ7x7bB&jschl_answer=447448". Статус - 302. Браузер отдает среди прочих заголовков заголовок Cookie (первый кукис), а сервер ему дает "Location: http://disk-space.ru/" и генерит второй кукис - и браузер переходит на главную страницу сайта. Аки "фейс-контроль прошел".

В чем у меня тогда дело-то???
Я и в первом, и во втором запросах проставлял опции COOKIEJAR и COOKIEFILE. Получаю только первый кукис - при первом обращении (страница ожидания). Второй кукис не генерировался ни в одном из моих случаев.
Я даже, усомнившись в действии COOKIEJAR и COOKIEFILE, замутил код вытаскивания строки кукиса из файла для передачи ее в заголовках по заголовку Cookie (в Firebug есть такой заголовок во втором обращении).

В общем, кто что подскажет?
Речь идет о любой странице сайта disk-space.ru, я пытаюсь забрать главную, хотя цель другая, но получить главную - как простейший случай для начала.

Вот мои две несчастные страницы:

Первая

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$url = "http://disk-space.ru/";
$useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36";
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_REFERER, "http://disk-space.ru/");
//curl_setopt($ch, CURLOPT_HEADER, true);
//    здесь поступил как предлагали тому человеку с похожей 
//    проблемой - убрал большинство заголовков
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'DNT'=>"1",
  'Upgrade-Insecure-Requests'=>"1"
));
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookies.txt');  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
 
$data = curl_exec($ch);
curl_close($ch);
 
//    меняю относительный адрес из form action=
//    на свою страницу, итоговый адрес будет содержать
//    все необходимые ключи формы
//    его только нужно передать на домен
//    вторым cURL запросом...
$pattern = '/\/cdn-cgi\/l\/chk_jschl/';
$replacement = 'proba2.php';
$result = preg_replace($pattern, $replacement, $data);
 
print_r($result);
?>

Вторая

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
 
echo $_GET[infa];
 
//    Подменяю приставку proba2.php
//    на домен плюс относительная ссылка
$turl = $_SERVER['REQUEST_URI'];
$pattern = '/\/proba2.php/';
$replacement = 'http://disk-space.ru/cdn-cgi/l/chk_jschl';
$rurl = preg_replace($pattern, $replacement, $turl);
 
$useragent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36";
 
//$cookiesfile = __DIR__ . "/cookies.txt";
 
//echo $rurl;
 
//    так может выглядеть в итоге ссылка,
//    по которой сделаю второй cURL запрос:
//    http://disk-space.ru/cdn-cgi/l/chk_jschl?jschl_vc=e6b053d3854b567b3dbba2261929eaaf&pass=1494161963.724-KX8vlWihJr&jschl_answer=1129
 
///////////////////////////////////////////////////////////////////////
 
//    ЭТУ СЕКЦИЮ МОЖНО ПРОПУСТИТЬ
//    ЗДЕСЬ ПРОСТО ВЫТАСКИВАЮ СТРОКУ КУКИСА ИЗ ФАЙЛА
 
//берем файл куков
$cf = file_get_contents(__DIR__ . "/cookies.txt");
 
//ищем позицию, где начинается нужная конструкция
$findme = '__c';
$pos = strpos($cf, $findme);
 
//обрезаем до нужной позиции
$t = substr($cf, $pos);
 
//прибавляем знак =
$pattern2 = '/cfduid/';
$replacement2 = 'cfduid=';
$tn = preg_replace($pattern2, $replacement2, $t);
 
//убираем пробел-перенос
$tnn = str_replace('    ', '', trim($tn));
 
//ПОЛУЧАЕМ РЕЗУЛЬТАТ!!!
//echo $tnn;
 
////////////////////////////////////////////////////////////////////////
 
//    СОБСТВЕННО ВТОРОЙ ЗАПРОС
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $rurl);
//curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
//curl_setopt($ch, CURLOPT_REFERER, "http://disk-space.ru");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host'=>"disk-space.ru",
    'User-Agent'=>$useragent,
    'Accept'=>"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    'Accept-Language'=>"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
    'Accept-Encoding'=>"gzip, deflate",
    'Referer'=>"http://disk-space.ru/",
    'Cookie'=>$tnn,
    'DNT'=>"1",
    'Connection'=>"keep-alive",
    'Upgrade-Insecure-Requests'=>"1"
));
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookies.txt');  
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiesfile);
//curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiesfile);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
$data = curl_exec($ch);
curl_close($ch);
 
print_r($data);
 
?>
Короче, вот такая хитровывернутая шняга. Понятия не имею, почему не работает моя технология и куда теперь копать... Среди прочих похожих проблем, что пишут люди в нете, такой случай с предваряющей страницей - не встречал... Бьюсь который день, перелопатил кучу страниц мануалов, форумов...
Неужто мой случай - самый сложный в опыте парсинга сайтов с cURL? Сам ресурс, на который ломлюсь, что характерно, довольно халявно смотрится выполненным и обладает не лучшей репутацией.

Буду очень благодарен за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2017, 19:37
Ответы с готовыми решениями:

Промежуточная страница
Здравсвуйте.Есть HTML форма,её заполняет пользователь,формы обрабатывает CGI программа и на основе этих форм выполняет запрос в БД.Запрос...

Промежуточная страница перед переходом по ссылке к pdf
Добрый день. Кто может подсказать, как реализовать следующий скрипт: Например мы находимся на странице domen.ru/test, с этой страницы...

Страница 404
При аудите одного сайта переходе на несуществующую страницу не показывается страница 404, сразу отображается главная, но в Bertal и других...

5
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
09.05.2017, 19:23
Сначала нужно получить разрешение владельца сайта на применение парсера curl
0
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 3
14.05.2017, 00:03  [ТС]
А разве cURL не является той самой технологией, которая спокойно минует всякие ограничения владельцев сайтов?
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
14.05.2017, 20:45
Если он поставил защиту, значит не хочет, чтобы его сайтом пользовались роботы. Насилие в отношении других людей, а также содействие насилию может привести к заболеваниям.
0
0 / 0 / 0
Регистрация: 08.05.2017
Сообщений: 3
14.05.2017, 23:01  [ТС]
plohoyav, насилие может привести к заболеваниям? Серьезно? К каким, например?
Если нечего дельного сказать по сабжу, то, как правило, проходят мимо. Но ты молодец, что написал. Возможно, еще не все так запущено, и визит к психиатру может спасти от дальнейшего развития заболевания межушного нервного узла. Скорее в ПНД! Если шиза, то еще немного, и роботы начнут совершать насилие в отношении людей, и никакая защита не спасет роботов от неизбежных заболеваний! Бедные роботы!...
Ник наверно тоже неспроста, плохо наяву, когда шиза, нечего и добавить тут. Побольше галоперидола, и сон, сон, целебный сон... Психиатр в общем разберется там.
0
313 / 312 / 221
Регистрация: 11.07.2015
Сообщений: 1,107
15.05.2017, 07:46
Например, люди, которые оказывают давление на окружающих, сами страдают от повышенного артериального давления.

Согласно закона человек обязан помогать окружающим, в частности тонущим.

Уши психиатор не лечит, уши лечит послушание окружающих.

Сон не является целебным, по статистике люди, спящие 12 часов в день, живут на 10-15 лет меньше остальных.

При входе на сайт http://disk-space.ru/ после счётчика происходит перенаправление и выводится ошибка
Error establishing a database connection

Видимо хостинг не справляется с нагрузкой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2017, 07:46
Помогаю со студенческими работами здесь

Страница 404
как сделать страницу перехватывающую ошибку 404 поясню проходит ползователь на страницу а её нет, и его перекидывает на мою страницу

Не достучаться до сайта используя Curl. Ошибка 404 not found/
Пытаюсь авторизироваться в своем кабинете на сайте pulscen.ru Но никак не могу получить данные, все время выдает 404 not found,...

Возвращение 404 ошибки от ссылки Yandex через CURL
Добрый день! Имеются ссылки (см. ниже), которые, если вставить их в адресную браузера, работают. Через запрос CURL PHP возвращается 404...

Страница ошибки 404
Вычитал о том , как создавать обработку ошибки 404 . Сделал сначала файл .htaccess с текстом : ErrorDocument 404 /err404.html . ...

Страница не найдена 404
Пдскаите, в чем проблема? на локалке спокойно открывает страницу /about, которая лежит в корне. Кинул все на хост. все ссылки работают, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru