С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321

Не получается авторизоваться через парсер на своем же сайте

24.11.2019, 14:47. Показов 1747. Ответов 11
Метки нет (Все метки)

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

Заинтересовала тема парсинга информации, решил потренироваться на своем же сайте. Итак, я точно знаю какие переменные и куда отправляются у меня при авторизации. При авторизации ссылка "Вход" превращается в "Личный кабинет".

Вот код:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$url = 'https://www.site.ru/';   // URL сайта на котором будем авторизоваться 
$urlTo = 'https://www.site.ru/enter.php';   // URL на которой будем слать POST данные
$login = '*****'; 
$pass = '*****';
$post = 'mail='.$login.'&pass='.$pass.'&rem=1&who=1'; // Дополнительные переменные необходимы для авторизации у меня
 
$ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Делаем так, чтобы страница не выдавалась сразу в поток, а можно было ее записать в переменную
$html = curl_exec($ch);                         // Имитируем заход на сайт
 
curl_setopt($ch, CURLOPT_URL, $urlTo);              // Устанавливаем адрес куда будем слать POST данные
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');  // Записываем cookies в файл, чтобы потом можно было их считать
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'); // Теперь читаем cookies с файла
curl_setopt($ch, CURLOPT_POST, true);               // Говорим, что информация будет отправляться методом POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);        // Передаем POST данные
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);     // Иногда бывает, что после отправки данных происходит редирект heaer('Location:...'). 
curl_setopt($ch, CURLOPT_URL, $url);                // Этот параметр говорит о то, чтобы мы следовали за ними, а не оставались на месте после отправки данных
 
$html = curl_exec($ch); // Записываем пришедшие данные в переменную    
curl_close($ch);        // Закрываем сеанс работы CURL
 
echo $html;             // Выводим авторизованную страницу
Запускаю скрипт на другом сервере. Страница открывается, все ОК. Но страница открывается не авторизованного пользователя, т.е. ссылка личного кабинета - "Вход".

Скажите пожалуйста, что не так делаю?

Добавлено через 1 минуту
Еще немного не понятен момент с cookie.txt, этот файл автоматически не создается. Создал его в корне сайта, он всё равно всегда пустой, т.е. запись в него информации не производится.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2019, 14:47
Ответы с готовыми решениями:

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

Не получается авторизоваться на сайте cURL
Здравствуйте, возникла проблема при авторизации на сайте chaxun.slhappiness.com, имеется функция: function get_web_page( $url ){ ...

Не получается авторизоваться на сайте (Grab)
Привет всем, возникла проблема с POST запросом, пытаюсь при помощи POST авторизоваться на форуме (использую Grab): from grab import...

11
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 15:05
Зачем на 18 строке меняете URL? Он уже на 12 задан.
0
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321
24.11.2019, 15:20  [ТС]
Jodah, получается так: если 18 строку убираю, то в cookie.txt записывается кука, а на экране json ответ сервера. Затем строку 18 возвращаю и тогда страница открывается авторизованного пользователя. Куку убираю, снова страница открывается неавторизованного пользователя.

Т.е. если нет строки 18, то авторизация происходит, но страница не открывается. Если строка есть, то страница открывается, но неавторизованная. Тёмный лес как авторизоваться и открыть страницу тут же после авторизации.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 15:22
Lion_astana, если надо после авторизации сделать ещё один запрос на главную - сделайте ещё один запрос на главную. У вас же 2 запроса сейчас в коде, значит надо третий добавить. Только CURLOPT_COOKIEJAR + CURLOPT_COOKIEFILE не забыть.
0
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321
24.11.2019, 15:28  [ТС]
Jodah, простите не понял, только начинаю это осваивать. Сможете показать после чего это прописать и как?

Добавлено через 2 минуты
Я как понял именно 18 строка как бы и говорит что после получения кук открыть именно целевую страницу.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 15:30
Lion_astana, у вас первый запрос на 7-10 строках, второй на 12-21, теперь надо добавить третий, который будет идентичен первому, только с куками.

Добавлено через 2 минуты
Цитата Сообщение от Lion_astana Посмотреть сообщение
именно 18 строка как бы и говорит что после получения кук открыть именно целевую страницу
18 строка говорит, что запрос будет к странице с URL = $url.

Упрощённо, вы пытаетесь сделать так:
PHP
1
2
3
$var = 1;
$var = 2;
echo $var;
И удивляетесь, почему echo выводит 2, а не 1.
0
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321
24.11.2019, 15:52  [ТС]
С упрощенным примером всё понятно )))
Я просто не до конца понимаю именно кукиджар и кукифайл.

Почему 13 и 14 строка идет до отправки запроса в 16 строке? И если данные записали и кука получена, почему при моем прописывании адреса в 18 строке они не считываются? Что-то мозг кипит!

Добавлено через 5 минут
А, понял, сделал так:

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
$url = 'https://www.site.ru/';   // URL сайта на котором будем авторизоваться 
$urlTo = 'https://www.site.ru/enter.php';   // URL на которой будем слать POST данные
$login = '*****'; 
$pass = '*****';
$post = 'mail='.$login.'&pass='.$pass.'&rem=1&who=1'; // Дополнительные переменные необходимы для авторизации у меня
 
$ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Делаем так, чтобы страница не выдавалась сразу в поток, а можно было ее записать в переменную
$html = curl_exec($ch);                         // Имитируем заход на сайт
 
curl_setopt($ch, CURLOPT_URL, $urlTo);              // Устанавливаем адрес куда будем слать POST данные
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');  // Записываем cookies в файл, чтобы потом можно было их считать
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'); // Теперь читаем cookies с файла
curl_setopt($ch, CURLOPT_POST, true);               // Говорим, что информация будет отправляться методом POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);        // Передаем POST данные
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);     // Иногда бывает, что после отправки данных происходит редирект heaer('Location:...'). 
curl_setopt($ch, CURLOPT_URL, $url);                // Этот параметр говорит о то, чтобы мы следовали за ними, а не оставались на месте после отправки данных 
$html = curl_exec($ch); // Записываем пришедшие данные в переменную
 
curl_setopt($ch, CURLOPT_URL, $url);                // Этот параметр говорит о то, чтобы мы следовали за ними, а не оставались на месте после отправки данных
$html = curl_exec($ch); // Записываем пришедшие данные в переменную
 
curl_close($ch);        // Закрываем сеанс работы CURL
 
echo $html;             // Выводим авторизованную страницу
Добавлено через 10 минут
Открыть страницу с авторизацией на своем сайте получилось. Теперь смотрю на сайт, с которого нужно спарсить данные.

Когда авторизируюсь на свое сайте и смотрю через Хром, то вижу Form Data, в котором вижу переменные которые летят при запросе. Проверяю на нужном сайте, там нет пункта Form Data во вкладке Headers, а есть пункт Request Payload и две переменные, но в скобках {}, типа это массив.

Как тогда быть мне с пунктом:

PHP
1
$post = 'email='.$login.'&pass='.$pass;
и
PHP
1
$post = '{email='.$login.'&pass='.$pass.'}';
Не работают.

Если убираю строки 21 и 22, то вижу ответ сервера на мой такой запрос: {"error":"Ошибка при заполнении формы"}

Как правильно отправить данные? Отправяемые данные верны, у меня есть аккаунт на нужном мне сайте и авторизируюсь с ними через форму нормально, да и в Хроме при отправке формы вижу данные которые летят, их всего две переменных.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 15:57
Lion_astana, не сталкивался, но гугл говорит, что вроде бы надо просто данные в json формате передавать.
https://www.nulled.cc/threads/264520/
https://stackoverflow.com/ques... st-payload
1
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321
24.11.2019, 19:33  [ТС]
Jodah, спасибо за помощь!

Добавлено через 1 час 42 минуты
Позвольте вопрос по парсингу инфы на нужной странице:

На странице есть такой элемент:

HTML5
1
<a href="http://site.ru?utm_source=xxx.ru" rel="nofollow" target="_blank" itemprop="url">site.ru</a>
Как регуляркой вытащить содержимое href до части ?utm_source=xxx.ru ???

Делаю так:

PHP
1
2
preg_match('/href="(.*)?utm_source=xxx.ru"/isU', $html, $arr);
echo $arr[1];
Выводит какую-то другую часть нужной мне страницы.

Пробовал так:

PHP
1
preg_match('~href="(.*)?utm_source=xxx.ru"~siU', $html, $arr);
То же самое.

Сможет кто-нибудь помочь с регуляркой?
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 19:43
Lion_astana, для поиска по html предпочитаю библиотеку DiDom.

Цитата Сообщение от Lion_astana Посмотреть сообщение
вытащить содержимое href до части ?utm_source=xxx.ru ???
Можно взять весь URL и распарсить с помощью https://www.php.net/manual/en/... se-url.php
0
 Аватар для Lion_astana
16 / 16 / 8
Регистрация: 15.03.2010
Сообщений: 321
24.11.2019, 19:59  [ТС]
Да в том и дело, что именно эту ссылку не найдёшь быстро по ID, так как его нет. А ссылок на странице сотни.
У меня есть вариант сначала вытащить все ссылки на странице, точнее их атрибут href, затем перебрать циклом и найти ту, которая содержит подстроку ?utm_source=xxx.ru

Мне кажется что это долго и много букв кода.

Требуется найти в тексте регуляркой подстроку из неизвестного количества любых символов между <a href=" и ?utm_source=xxx.ru, вот это строгое условие. Не могу понять как!

Добавлено через 2 минуты
При том похожее условие для поиска содержимого элемента span, внутри которого есть email отрабатывает на ура:

PHP
1
2
preg_match('~<span itemprop="email">(.*)</span>~siU', $html, $match);
echo $match[1];
Добавлено через 2 минуты
Или если проще сформулировать задачу, то нужен первый результат поиска атрибута href элемента a, который в коце содержит символы ?utm_source=xxx.ru.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,904
24.11.2019, 20:31
Lion_astana,

https://github.com/Imangazalie... in-element

PHP
1
2
// all links containing the string "example.com"
$document->find('a[href*=example.com]');
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2019, 20:31
Помогаю со студенческими работами здесь

Авторизоваться на сайте через WebBrowser и работать на нем через WebClient
Я тут подумал, можно ли сделать так: авторизоваться через веббраузер и после этого работать на сайте (на котором я авторизовался) через...

Как авторизоваться на сайте через Delphi?
Как мне авторизоваться на сайте? Нужно получить код страницы (с аккаунта) Попробовал через браузер (вручную (WebBrowser1) ) но не...

Не получается авторизоваться через POST-запрос
Пытаюсь авторизоваться через пост запрос: HttpWebRequest httpWebRequest =...

Как программно авторизоваться на сайте через форму авторизации?
Добрый день. Как можно программно авторизоваться на сайте через форму авторизации и хранить сессию? На примере...

Авторизоваться на сайте, используя WebBrowser, через свою форму с логином и паролем
В общим мусолил интернет, первоначальная задача была: создать виндоус форм в которой будет загружаться определённый сайт и...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru