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

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

08.05.2017, 19:37. Показов 3129. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru