crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QNetworkAccessManager и QStateMachine для авторизации
SABROG
  опции профиля:
сообщение 15.5.2010, 12:19
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


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

Хочу проконсультироваться как это правильней сделать. Думаю авторизацию и дальнейшую работу сделать через машину состояний, но похоже эту машину надо будет использовать в скрипте (QScriptEngine). Вспомнил про проект SCXML. Может действительно на нем как-то сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 15.5.2010, 13:45
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Имхо, концепция конечного автомата действительно уместна в данном случае, т.к. Алгоритм состоит из нескольких шагов, состояний. Разбить это дело на состояния не должно представлять сложностей. И потом прыгать от одного состояния к другому пока не достигнем заданного состояния.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 16.5.2010, 18:32
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я пока не разобрался как можно привязать переход состояния (transition) в зависимости от QNetworkReply::attribute(), который проверяется на сигнал QNetworkAccessManager::finished(). То ли класс своего состояния писать, то ли класс перехода писать, что скорее всего. Тогда получается, чтобы сделать переход, мне нужно унаследоваться от QSignalTransition, вызвать конструктор базового класса с сигналом QNetworkAccessManager::finished(). Затем в eventTest() отправлять true, если QNetworkReply::attribute() содержит условия необходимые для перехода. Проблема только в том, что аттрибутов куча и на многие из них хочется своё состояние и как следствие такое же количество переходов от одного состояния к другому. Нужно подумать еще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 9.8.2020, 19:53