Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QNetworkAccessManager и QStateMachine для авторизации
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
SABROG
Хотел написать утилиту для работы, которая парсит данные с сайта партнера, но где-то через день к странице их сайта добавили форму авторизации. Не бросать же на пол пути... Первая проблема с которой я столкнулся это ошибка не существующей страницы (404). Оказалось, что после передачи ссылки в QNetworkAccessManager на выходе в QNetworkReply::url() по какой-то причине добавляется знак вопроса "?" в конец запроса, хотя в передаваемом QUrl его никогда небыло и используются только английские буквы без спец.символов, которые надо было бы экранировать. Решил добавлением "/" в конец url'a, оставив разбор проблемы на потом. Затем возникла проблема с кодом 302 Moved Permanently, эту проблемы мне вроде бы удалось решить через обработку возвращаемых кодов от QNetworkReply. QNetworkAccessManager просто не имеет API типа "Следовать редиректу". Приходится формировать новый запрос для этого и идти на второй круг. Следующая проблема возникла в форме авторизации, мало того, что сервак ставит куку с номером сессии, так он еще генерит какой-то хеш, который подставляет в поле внутри HTML странички. Без регулярки по всей страницы не обойтись. Сначала нужно как-то продетектить, что сервак хочет авторизации, потом отпарсить HTML, чтобы выцепить передаваемый ключ и сформировать POST запрос для самой авторизации. Можно конечно сделать все это жестко, по шагам. Но у меня 12 партнеров, такое же количество сайтов, каждый из них делает как ему вздумается. Сегодня одна версия авторизации, завтра другая и т.п. В общем было бы правильно это дело перенести на скрипты, чтобы не нужно было даже перекомпилировать программу, если чего у них изменится.

Хочу проконсультироваться как это правильней сделать. Думаю авторизацию и дальнейшую работу сделать через машину состояний, но похоже эту машину надо будет использовать в скрипте (QScriptEngine). Вспомнил про проект SCXML. Может действительно на нем как-то сделать?
kuzulis
Имхо, концепция конечного автомата действительно уместна в данном случае, т.к. Алгоритм состоит из нескольких шагов, состояний. Разбить это дело на состояния не должно представлять сложностей. И потом прыгать от одного состояния к другому пока не достигнем заданного состояния.
SABROG
Я пока не разобрался как можно привязать переход состояния (transition) в зависимости от QNetworkReply::attribute(), который проверяется на сигнал QNetworkAccessManager::finished(). То ли класс своего состояния писать, то ли класс перехода писать, что скорее всего. Тогда получается, чтобы сделать переход, мне нужно унаследоваться от QSignalTransition, вызвать конструктор базового класса с сигналом QNetworkAccessManager::finished(). Затем в eventTest() отправлять true, если QNetworkReply::attribute() содержит условия необходимые для перехода. Проблема только в том, что аттрибутов куча и на многие из них хочется своё состояние и как следствие такое же количество переходов от одного состояния к другому. Нужно подумать еще.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.