basiliocat / mos.ru

BSD 3-Clause "New" or "Revised" License
23 stars 10 forks source link

Login failed #6

Closed sisaenkov closed 7 years ago

sisaenkov commented 7 years ago

./pgu.sh get Login failed!

FreeBSD 10.3

Osrx commented 7 years ago

pgu.mos.ru переехал на www.mos.ru Сильно они процесс авторизации поменяли. Сходу подправить скрипт у меня не вышло. Если у меня это получится раньше чем у Кота Васьки, то выложу сюда кусок кода...

Osrx commented 7 years ago

Кажется пофиксил. Данные для воды и электричества получает. Отправлять не пробовал пока.

Правим файл: lib.sh

loginPgu() {

post login data, follow redirects, check resulting page

curl -k -L -s -c $cjar 'https://www.mos.ru/api/oauth20/v1/frontend/json/ru/process/enter?redirect=https%3A%2F%2Fmy.mos.ru%2Fmy%2F' >> /dev/null
if ! curl -k -L -s -c $cjar -b $cjar "https://oauth20.mos.ru/sps/j_security_check?j_username=$login&j_password=$password&accessType=alias" \
|  grep -q "SURNAME"; then
    echo "Login failed!" >&2
    cleanup
    exit 1
fi

}

getWaterIndications() {

get water counters

curl -k -L -s -c $cjar -b $cjar -k "https://www.mos.ru/pgu/ru/application/guis/1111/?getCountersInfo=true&requestParams%5BpaycodeFlat%5D%5Bpaycode%5D=$paycode&requestParams%5BpaycodeFlat%5D%5Bflat%5D=$kv"

}

volkov-i63 commented 7 years ago

@Osrx Попробовал Ваш вариант - тоже не авторизует. Вероятно, опять что-то поменяли, а может быть из-за того что логин содержит собаку, которую надо urlencode. У Вас работать не перестало?

Osrx commented 7 years ago

раз 5 подряд попробовал pgu.sh get первые раза 4 писало Login failed! потом начало присылать данные.... Глючит... Будем думать...

volkov-i63 commented 7 years ago

@Osrx у Вас в секции передаваемых параметров, где $kv, русская буква ф затесалась: &requestParфms. А так - действительно, с n-ной попытки авторизует, и данные даёт (через раз пустые, но даёт). Возможно, оно глючит из-за таймаута (curl). Я ламер, поэтому курю ман, но не могу найти, есть ли какой-то таймаут по умолчанию.

Osrx commented 7 years ago

@volkov-i63 Спасибо исправил в комменте. Думаю что пока они не сделают переход до конца на новый портал mos.ru эти проблемы будут продолжаться... Устаканится... Исправим... Дело-то нужное...

Osrx commented 7 years ago

@volkov-i63 Я пофиксил проблему в своем форке этого репозитория Osrx/scripts. Нужна проверка. Сам проверить досконально не смог, так как уже подал показания воды через приложение с мобильного, а оказывается удалить поданные с мобильного показания на веб сайте невозможно. Ругается...

Проблему не столько решил сколько обошел. Почему-то иногда curl запрос на сайт www.mos.ru возвращает: "curl: (35) Unknown SSL protocol error in connection to www.mos.ru". Это или проблема OpenSSL или curl или балансера запросов портала mos.ru. Разбираться не стал. просто исполняю запрос трижды, один из них да пройдет... Не красиво, но за-то просто.

volkov-i63 commented 7 years ago

@Osrx Работает! (подавать не пробую по той же причине). По крайней мере авторизует и показывает железно. Вариация на тему: ` loginPgu() { for i in 1 2 3 4 5 do echo "Connection attempt "$i if curl -k -L -s -c $cjar 'https://www.mos.ru/api/oauth20/v1/frontend/json/ru/process/enter?redirect=https%3A%2F%2Fmy.mos.ru%2Fmy%2F' >> /dev/null then echo "Connected" break else if [ $i = 5 ] then echo "Connection failed permanently!" >&2 cleanup exit 1 fi fi done

for j in 1 2 3 4 5 do echo "Login attempt "$j if ! curl -k -L -s -c $cjar -b $cjar "https://oauth20.mos.ru/sps/j_security_check?j_username=$login&j_password=$password&accessType=alias" | grep -q "SURNAME"; then if [ $j = 5 ] then echo "Login failed permanently!" >&2 cleanup exit 1 fi else echo "Authorized!" break fi done } ` И проблема, похоже, на стороне сервера: кажется мы его слишком быстро закидываем запросами и он не успевает закэшировать сессию.

Osrx commented 7 years ago

@volkov-i63 Не похоже что слишком быстро. Дело в том что проблема возникает во время исполнения первого же обращения к серверу. Вот запрос без редиректов и сразу ошибка:

bash-3.2$ curl -k -c /tmp/aaa 'https://www.mos.ru/api/oauth20/v1/frontend/json/ru/process/enter?redirect=https%3A%2F%2Fmy.mos.ru%2Fmy%2F' curl: (35) Unknown SSL protocol error in connection to www.mos.ru:-36

Или еще один тест. Пробуем обращаться по http вместо https и получаем: bash-3.2$ curl -c /tmp/aaa 'http://www.mos.ru/api/oauth20/v1/frontend/json/ru/process/enter?redirect=https%3A%2F%2Fmy.mos.ru%2Fmy%2F' curl: (56) Recv failure: Connection reset by peer

Проблема где-то на стыке технологий курла и веб сервера...

Странно почему максимум на 3ий раз железно срабатывает именно от этого у меня родилась догадка относительно балансера запросов. Видимо какая-то из нод настроена не аналогично остальным а может и еще какие мысли у них были...

Твой вариант более верный, но он так же более громоздкий и еще я не видел что бы после первого выполненного корректно запроса второй выдавал ошибку. А первый всегда за 3 раза успевает исполниться корректно. По крайней мере я иного пока не встречал.

sisaenkov commented 7 years ago

Можно также добавить 15-20 секундный таймаут перед вторым запросом. У них, видимо, медленный авторити сервис.

volkov-i63 commented 7 years ago

Согласен. Более трёх обломов подряд у меня тоже не было. Чаще 1 2, а иногда и сразу коннектит. Если осмелюсь взяться - попробую на php переписать, хотя там тоже cURL используется. В любом случае интересно. Продолжим развлекаться. А может нормального документированного API дождёмся =)

basiliocat commented 7 years ago

Исправил логины. При запросе услуги теперь каждый раз происходит редирект на oauth и обратно