Closed sisaenkov closed 7 years ago
pgu.mos.ru переехал на www.mos.ru Сильно они процесс авторизации поменяли. Сходу подправить скрипт у меня не вышло. Если у меня это получится раньше чем у Кота Васьки, то выложу сюда кусок кода...
Кажется пофиксил. Данные для воды и электричества получает. Отправлять не пробовал пока.
Правим файл: lib.sh
loginPgu() {
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() {
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"
}
@Osrx Попробовал Ваш вариант - тоже не авторизует. Вероятно, опять что-то поменяли, а может быть из-за того что логин содержит собаку, которую надо urlencode. У Вас работать не перестало?
раз 5 подряд попробовал pgu.sh get первые раза 4 писало Login failed! потом начало присылать данные.... Глючит... Будем думать...
@Osrx у Вас в секции передаваемых параметров, где $kv, русская буква ф затесалась: &requestParфms. А так - действительно, с n-ной попытки авторизует, и данные даёт (через раз пустые, но даёт). Возможно, оно глючит из-за таймаута (curl). Я ламер, поэтому курю ман, но не могу найти, есть ли какой-то таймаут по умолчанию.
@volkov-i63 Спасибо исправил в комменте. Думаю что пока они не сделают переход до конца на новый портал mos.ru эти проблемы будут продолжаться... Устаканится... Исправим... Дело-то нужное...
@volkov-i63 Я пофиксил проблему в своем форке этого репозитория Osrx/scripts. Нужна проверка. Сам проверить досконально не смог, так как уже подал показания воды через приложение с мобильного, а оказывается удалить поданные с мобильного показания на веб сайте невозможно. Ругается...
Проблему не столько решил сколько обошел. Почему-то иногда curl запрос на сайт www.mos.ru возвращает: "curl: (35) Unknown SSL protocol error in connection to www.mos.ru". Это или проблема OpenSSL или curl или балансера запросов портала mos.ru. Разбираться не стал. просто исполняю запрос трижды, один из них да пройдет... Не красиво, но за-то просто.
@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 } ` И проблема, похоже, на стороне сервера: кажется мы его слишком быстро закидываем запросами и он не успевает закэшировать сессию.
@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 раза успевает исполниться корректно. По крайней мере я иного пока не встречал.
Можно также добавить 15-20 секундный таймаут перед вторым запросом. У них, видимо, медленный авторити сервис.
Согласен. Более трёх обломов подряд у меня тоже не было. Чаще 1 2, а иногда и сразу коннектит. Если осмелюсь взяться - попробую на php переписать, хотя там тоже cURL используется. В любом случае интересно. Продолжим развлекаться. А может нормального документированного API дождёмся =)
Исправил логины. При запросе услуги теперь каждый раз происходит редирект на oauth и обратно
./pgu.sh get Login failed!
FreeBSD 10.3