Доброго времени суток.
В очередной раз столкнулся с проблемой проверки баланса моих многочисленных симок Мегафона для мобильного интернета — автомобиль, дача, iPad, мобильный роутер и.т.д. Проблема в том, что данные симки работают в модемах и иных гаджетах и могут быть не всегда под рукой. Более того, времени и желания постоянно мониторить состояние баланса в разных устройствах, в том числе и удаленных, просто нет. А интернет имеет обыкновенно «заканчиваться» в самый неподходящий момент.
На сегодняшний день у ОПСОСов существуют следующие варианты проверки баланса:
1. Отправка смс на короткий номер
2. Личный интернет-кабинет
3. USSD команда
4. Звонок на короткий номер
Не понимаю, что мешает операторам добавить в личный кабинет модуль — оповещение по электронной почте абонента при достижении порога баланса в ххх рублей.
Собственно это я и собираюсь реализовать с помощью bash скрипта.
Пойду я «тупиковым» путем — парсинг странички личного кабинета. Тупиковым, потому что ОПСОсы постоянно что-то меняют в коде страничек и в скором времени скрипт перестанет работать, как перестал работать например вот этот. В ближайшем будущем планирую сделать скрипт на основе USSD или путем отправки SMS, правда в таких случаях необходимо подключение модема в комп или роутер (например mikrotik), в котором есть возможность создания скриптов.
Вот готовый скрипт парсинга странички личного кабинета.
Вкратце механизм:
1. Сохранение курлом ID сессии и печеньки (при заходе на страничку ЛК неким скриптом генерится ID и привязывается к текущей сессии, по этому в один заход курлом не залогиниться).
2. Залогинивание в ЛК с использованием сохраненной куки и session ID.
3. Парсинг странички и выцепление баланса.
Какие есть «косяки»:
1. Иногда сервак меги выплевывает «сервис временно недоступен», по этому сделал несколько попыток получения баланса с таймаутом.
2. При ошибках залогинивания (неправильный пароль или номер телефона) — может выскочить каптча и тогда скрипт не будет работать до тех пор пока не залогинитесь через вэб с вводом каптчи.
3. Не нравится парсинг в два прохода grep'ом. Знаю, что можно sed'ом в один проход, но что то пока не выходит.
4. Лучше сначала сохранять целиком код страницы во временный файл, а потом уже парсить (как здесь) — так можно будет отпарсить различные ошибки залогинивания или сервиса.
5. Логин и пароль лучше вынести в параметры передаваемые скрипту, чтобы был более универсальным.
Далее буду делать небольшой управляющий скрипт (в процессе создания), который будет вызывать вышеуказанный с различными логинами и паролями и проверять не упал ли баланс ниже заданного порога с отправкой уведомлений по мылу.
Далее запихну его в крон например на вэб серваке с запуском один раз в день.
Как-то так.
Идеи и критика приветствуются.
З.Ы. Для частных клиентов, всеж лучше и проще отпарсить страничку ИК (Интернет Кабинет) вместо ЛК.
На ИК пускает без залогинивания, достаточно перейти на страничку user.megafonmoscow.ru через симку меги.
И отпарсить там можно сразу и баланс и остаток траффика, что тоже очень актуально.
Сегодня наваяю новый скриптик.
Вторая версия скрипта проверки баланса.
Будет работать только на тарифах для частников. Проверка баланса и остатка траффика осуществляется той сим карты с которой скрипт ходит в инет. Скрипт шлет сообщение на мыло в случае достижения определенной суммы на балансе или определенного остатка траффика.
Второй вариант функции отправки письма
Не знаю какой лучше. Работает и так и так вполне стабильно.
Функцию отправки мыла реализовал двумя способами — mailx и с помощью перлового скрипта sendEmail. Для последнего могут потребуются дополнительные пакеты — Perl-Net-SMTP-SSL, Perl-Net-SSLeay, Perl-IO-Socket-SSL, Perl-Crypt-SSLeay.
Вышеуказанные скрипты отправки почты проверял на smtp.yandex.ru!!! На других серваках возможно необходимо будет подкрутить настройки.
З.З.Ы.
mailx работает быстрее…
В очередной раз столкнулся с проблемой проверки баланса моих многочисленных симок Мегафона для мобильного интернета — автомобиль, дача, iPad, мобильный роутер и.т.д. Проблема в том, что данные симки работают в модемах и иных гаджетах и могут быть не всегда под рукой. Более того, времени и желания постоянно мониторить состояние баланса в разных устройствах, в том числе и удаленных, просто нет. А интернет имеет обыкновенно «заканчиваться» в самый неподходящий момент.
На сегодняшний день у ОПСОСов существуют следующие варианты проверки баланса:
1. Отправка смс на короткий номер
2. Личный интернет-кабинет
3. USSD команда
4. Звонок на короткий номер
Не понимаю, что мешает операторам добавить в личный кабинет модуль — оповещение по электронной почте абонента при достижении порога баланса в ххх рублей.
Собственно это я и собираюсь реализовать с помощью bash скрипта.
Пойду я «тупиковым» путем — парсинг странички личного кабинета. Тупиковым, потому что ОПСОсы постоянно что-то меняют в коде страничек и в скором времени скрипт перестанет работать, как перестал работать например вот этот. В ближайшем будущем планирую сделать скрипт на основе USSD или путем отправки SMS, правда в таких случаях необходимо подключение модема в комп или роутер (например mikrotik), в котором есть возможность создания скриптов.
Вот готовый скрипт парсинга странички личного кабинета.
Вкратце механизм:
1. Сохранение курлом ID сессии и печеньки (при заходе на страничку ЛК неким скриптом генерится ID и привязывается к текущей сессии, по этому в один заход курлом не залогиниться).
2. Залогинивание в ЛК с использованием сохраненной куки и session ID.
3. Парсинг странички и выцепление баланса.
#!/bin/bash cookies=./cookies.txt sessionID_url='https://lk.megafon.ru/login/' login_url='https://lk.megafon.ru/login/dologin/' logout_url='https://lk.megafon.ru/logout/' useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" balance="" i=0 attempts=5 timeout=20 username='phone_number' # 10-ти значный номер телефона без 8-ки и 7-ки password='password' # пароль от ЛК while [[ "$balance" == "" && "$i" -le "$attempts" ]]; do let "i+=1" # ---------- CSRF / SessionID --------------- CSRF=`curl -A "$useragent" -c "$cookies" "$sessionID_url" | grep "CSRF_PARAM" | grep -o -E "([Aa]|[0-9])\S+-\S+-\S+-\S+-\S+([Aa]|[0-9])"` userdata="CSRF=$CSRF&j_username=$username&j_password=$password" balance=`curl -A "$useragent" -b "$cookies" -dump -L -X POST "$login_url" -d "$userdata" | grep -E -o "Баланс\s\S+\s[0-9]{1,},[0-9]{1,}" | grep -E -o "[0-9]{1,},[0-9]{1,}"` if [ "$balance" == "" ]; then sleep "$timeout" fi done if [ "$balance" != "" ]; then echo "Баланс = $balance руб." else echo "Не удалось проверить баланс, повторите попытку позже." fi # ------ LOGOUT --------------------------------- sleep 5 curl -b "$cookies" -L "$logout_url" > /dev/null 2>&1 if [ -f "$cookies" ]; then rm "$cookies" fi exit 0
Какие есть «косяки»:
1. Иногда сервак меги выплевывает «сервис временно недоступен», по этому сделал несколько попыток получения баланса с таймаутом.
2. При ошибках залогинивания (неправильный пароль или номер телефона) — может выскочить каптча и тогда скрипт не будет работать до тех пор пока не залогинитесь через вэб с вводом каптчи.
3. Не нравится парсинг в два прохода grep'ом. Знаю, что можно sed'ом в один проход, но что то пока не выходит.
4. Лучше сначала сохранять целиком код страницы во временный файл, а потом уже парсить (как здесь) — так можно будет отпарсить различные ошибки залогинивания или сервиса.
5. Логин и пароль лучше вынести в параметры передаваемые скрипту, чтобы был более универсальным.
Далее буду делать небольшой управляющий скрипт (в процессе создания), который будет вызывать вышеуказанный с различными логинами и паролями и проверять не упал ли баланс ниже заданного порога с отправкой уведомлений по мылу.
Далее запихну его в крон например на вэб серваке с запуском один раз в день.
Как-то так.
Идеи и критика приветствуются.
З.Ы. Для частных клиентов, всеж лучше и проще отпарсить страничку ИК (Интернет Кабинет) вместо ЛК.
На ИК пускает без залогинивания, достаточно перейти на страничку user.megafonmoscow.ru через симку меги.
И отпарсить там можно сразу и баланс и остаток траффика, что тоже очень актуально.
Сегодня наваяю новый скриптик.
Вторая версия скрипта проверки баланса.
Будет работать только на тарифах для частников. Проверка баланса и остатка траффика осуществляется той сим карты с которой скрипт ходит в инет. Скрипт шлет сообщение на мыло в случае достижения определенной суммы на балансе или определенного остатка траффика.
#!/bin/bash page_dump=/usr/tmp/dump url='http://user.moscow.megafon.ru/' useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" balance="" traffic="" phone="" balance_deadline="100" traffic_deadline="1" # -------- sendmail function ------------- function sendalert () { FROM_EMAIL_ADDRESS="my@mail.ru" EMAIL_USER="userlogin" EMAIL_ACCOUNT_PASSWORD="password" TO_EMAIL_ADDRESS="mailto@domain.ru" echo "$2" | mailx -s "$1" \ -S smtp-use-starttls \ -S ssl-verify=ignore \ -S smtp-auth=login \ -S smtp=smtp://smtp.yandex.ru \ -S smtp-auth-user="$EMAIL_USER" \ -S smtp-auth-password="$EMAIL_ACCOUNT_PASSWORD" \ -S from="$FROM_EMAIL_ADDRESS" \ "$TO_EMAIL_ADDRESS" } curl -A "$useragent" -dump "$url" >"$page_dump" balance=`cat "$page_dump" | grep -E -o 'balance(\S+\s)*' | grep -E -o '[0-9]{1,},[0-9]{1,}'` traffic=`cat "$page_dump" | grep -E -o 'traffic-by\S+' | grep -E -o '[0-9]{1,}(,[0-9]{1,})*'` phone=`cat "$page_dump" | grep -E -o 'phone.*+7' | grep -E -o '\([0-9]{3}\)\s[0-9]{3}(-[0-9]{2}){2}'` bal_test=`echo "$balance" | sed -e 's/,.*//'` traff_test=`echo "$traffic" | sed -e 's/,.*//'` if [ "$traff_test" -lt "$traffic_deadline" ]; then sendalert "Траффик ниже допустимого $phone" "Номер телефона - $phone Остаток траффика - $traffic ГБ" fi if [ "$bal_test" -lt "$balance_deadline" ]; then sendalert "Баланс ниже допустимого $phone" "Номер телефона - $phone Ваш баланс - $balance руб." fi if [ -f "$page_dump" ]; then rm "$page_dump" fi exit 0
Второй вариант функции отправки письма
Не знаю какой лучше. Работает и так и так вполне стабильно.
# -------- sendmail function ------------- function sendalert () { FROM_EMAIL_ADDRESS="my@mail.ru" EMAIL_USER="userlogin" SMTP_SERVER="smtp.yandex.ru" EMAIL_ACCOUNT_PASSWORD="password" TO_EMAIL_ADDRESS="mailto@domain.ru" sendEmail -f "$FROM_EMAIL_ADDRESS" \ -t "$TO_EMAIL_ADDRESS" \ -s "$SMTP_SERVER" \ -o message-charset=utf8 \ -xu "$EMAIL_USER" \ -xp "$EMAIL_ACCOUNT_PASSWORD" \ -u "$1" \ -m "$2" }
Функцию отправки мыла реализовал двумя способами — mailx и с помощью перлового скрипта sendEmail. Для последнего могут потребуются дополнительные пакеты — Perl-Net-SMTP-SSL, Perl-Net-SSLeay, Perl-IO-Socket-SSL, Perl-Crypt-SSLeay.
Вышеуказанные скрипты отправки почты проверял на smtp.yandex.ru!!! На других серваках возможно необходимо будет подкрутить настройки.
З.З.Ы.
mailx работает быстрее…
