LINUX.ORG.RU

Сайт мобильного оператора. Авторизация. curl

 , ,


0

2

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

Требуется: авторизовываться в личном кабинете на сайте мегафон (https://lk.megafon.ru) с помощью curl. Просто практика для освоения curl)

Что делал: несколько команд из скриптов, в частности, отсюда http://blog.elve.name/?p=104 (по аналогии), на этом форуме какие-то «кусочки» находил, по забугорным форумам лазил. Где-то что-то все-равно не подходило к моей задаче. Ни разу не получилось войти.

Что заметил: я в курсе, что curl только отправляет запросы серверу, а не нажимает кнопки на сайтах). Поэтому применял F12 на сайте, входил в ЛК, пытался отследить запрос, который высылает браузер. Во вкладке «Network»/«Other» заметил единственные данные, в которых присутствуют мои логин-пароль. Что интересно, ссылка этого URL https://lk.megafon.ru/dologin/, а его реферер https://lk.megafon.ru/login/. То есть получается, что изначально я захожу на сайт https://lk.megafon.ru/login/, ввожу данные логин/пароль в форму и при нажатии кнопки «войти», браузер шлет POST-запрос на сайт https://lk.megafon.ru/dologin/, а затем уже GET-запрос на сайт https://lk.megafon.ru (сам личный кабинет). То есть, сохранив и выслав куки, отправив POST-запрос, я все-равно не попадаю в ЛК, потому что за POST-запросом должен последовать GET-запрос? Как это обойти? Кроме того, в заголовках, которые идут в запросе на сервер (наряду с логин-паролем), присутствует какой то «CSRF» с кодом, совпадающим с кодом из куков. Его тоже нужно указывать в команде (CSRF:№&j_username:000&j_password:000) или же он автоматом «присоединяется» к высылаемым кукам? Просьба, пните меня в правильном направлении-дальше сам постараюсь нарыть. Прошу прощения, если где то непонятно написал, у нас ночь. Глаза слипаются).

Ты пытаешься чинить машину одним гаечным ключом. Я даже больше скажу - многие сервисы не пускают таких роботов, поэтому ещё и хедеры нужно передавать правильные, эмулируя браузер. Оно тебе надо? Смотри Selenium WebDriver если ты хочешь реальной автоматизации.

former_anonymous ★★★ ()

Для начала вам стоит запомнить, что никакой магии в браузере нет - он просто обменивается запросами с сервером и получает ответы. Все, что делает браузер, так иди иначе можно воспроизвести в скриптах. Это к "отправив POST-запрос, я все-равно не попадаю в ЛК, потому что за POST-запросом должен последовать GET-запрос" - скорее всего ответом на POST-запрос являются куки и редирект на локейшн для GET-запроса - следите внимательнее за тем какие запросы выполняются в браузере.

Браузерная консоль позволяет вообще копировать запросы "как curl".

Конкретно для вашего случая - CSRF есть прям в коде страницы с формой логина. Когда жмете кнопку входа - у вас идет пост на dologin, в ответ возвращается HTTP 302 с локейшном login (ну и браузер туда редиректится). Валидной учетки чтоб проверить у меня нет, но думаю что в случае успеха в ответе на POST к dologin вернется какая-то сессионная кука, и уже в зависимости от нее вы либо страницу с запросом логина\пароля увидите, либо ЛК.

micronekodesu ★★ ()
Ответ на: комментарий от former_anonymous

Вот это оперативность! Мне это нужно больше для опыта. Хочу научиться пользоваться curl и самому автоматизировать то, что мне требуется. В независимости от сторонних программ и приложении. Поэтому и готов тратить свои силы и время)

linuhhh ()

Сделай авторизацию для ЛОРа да иди спать. У мегафонов со всякими банками всё это не просто. И дело там не только в запросах.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Классный форум!

Ответы быстрые и по делу. Приятно внимание к новичкам). Сейчас еще раз зашел с браузера, просмотрел запрос. Вы правы. В методе запроса (Request Method) прописано «POST», в «Respons headers» в location прописан адрес https://lk.megafon.ru/. И вы еще правы - CSRF прописан в коде страницы входа. После входа данные CSRF с кода страницы входа появляются в данных формы наравне с логином и паролем.

Это что получается: для авторизации в ЛК перед запросом нужно grep-нуть данные CSRF, затем добавить куки, и уже при POST-запросе добавить эти данные?

linuhhh ()
Ответ на: комментарий от crutch_master

Возможно, несовсем удачный объект для освоения curl я выбрал. Ну, попытаюсь хоть). В любом случае опыт будет (сын ошибок трудных)).

linuhhh ()
Ответ на: Классный форум! от linuhhh

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

crutch_master ★★★★★ ()
Ответ на: комментарий от crutch_master

Да я и не спорю. Навыков у меня точно не хватит. Тем более, что сейчас моб.оператор почти=банк. Карточки там всякие вводят.

linuhhh ()
Ответ на: комментарий от linuhhh

Я делал пару дней назад вход в личный кабинет. Не мегафон правда, да и вообще не мобильный оператор.

curl -s https://somesite.com/login -c mycookies > /dev/null

У меня CSRF токен был доступен в файле с сохраненными куками, если это не так, как уже говорили выше грепайте вывод curl, а не перенаправляйте в /dev/null

TOKEN=$(cat mycookies | grep token | awk {'print $7'})
DATA="csrfmiddlewaretoken=$TOKEN&username=XXX&password=XXX"
echo $DATA > datafile

собственно POST запрос

curl 'https://somesite.com/login' -c mycookies -b mycookies -H 'Referer: https://somesite.com/login' --data @datafile  > /dev/null

Теперь если сервер ответил к примеру 302 загружаем страницы дальше...

curl "https://somesite.com/someurl" -c mycookies -b mycookies -H 'Referer: https://somesite.com/login' --output page_for_grep.html

Больше ничего хитрого кроме referer на стороне сервера не проверялось (без referer нихера не работало кстати). Ну и наверное стоит поменять в curl User-Agent )

UPD. И да, внимательно смотрите в консоль браузера при POST запросе. В моем случае на вкладке Params как раз было видно какие данные (form data) отдает браузер: csrmiddlewaretoken, username и password

swarnk ★★ ()
Последнее исправление: swarnk (всего исправлений: 1)
Ответ на: комментарий от swarnk

Блин, точно! Вскрыл куки-увидел CSRF-токен. Спасибо! Команды позже проверю-хочу для себя разобраться что куда и как)

linuhhh ()

Вам нужно почитать про http, вопросы сразу отпадут.

anonymous ()
Ответ на: комментарий от swarnk

Благодарю!

Всё получилось! Использовал команды уважаемого swarnk. Почти ничего дорабатывать под мегафон не пришлось-практически всё подошло). UserAgent не менял. В запросе нужно вставить только CSRF из кук, j_username и j_password (по Мегафону).

Получил хороший опыт, каждую команду изучил (и продолжаю изучать) чуть не под микроскопом, принципы использования, ключи.

Спасибо micronekodesu за разъяснения, как происходит авторизация на сайте - намного проще было въехать после ваших слов.

В общем, всем спасибо за комментарии!

Хочу отметить атмосферу форума - новичку помогают. За эти сутки я получил больше, чем за неделю гуглений).

linuhhh ()
Ответ на: Благодарю! от linuhhh

Хочу отметить атмосферу форума - новичку помогают. За эти сутки я получил больше, чем за неделю гуглений).

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

Allakka ★★★ ()
Ответ на: комментарий от Allakka

Насчет пони не уверен). Но мне, как пютающемуся разобраться самостоятельно, приятно, что форумчане не «шлют на маны», а высказываются конкретно и по делу. Тем более, когда долбаешься не один день над какой то задачей. А маны, инструкции я и так изучаю. Просто не всегда все понятно. На примерах лучше учится. Как то так)

linuhhh ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.