Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Мониторинг баланса сотового оператора на BASH  (Прочитано 4706 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Здравствуйте.
Фрагмент кода который должен выдергивать баланс на Билайне:
#!/bin/sh -e

request_curl -o /tmp/1.html \
        --data "loginFormB2C%3AloginForm=loginFormB2C%3AloginForm&loginFormB2C%3AloginForm%3Alogin=НОМЕР&loginFormB2C%3AloginForm%3Apassword=ПАРОЛЬ&loginFormB2C%3AloginForm%3ApasswordVisibl$ \
        https://my.beeline.ru/login.html
Авторизация в личном кабинете проходит.
Отображается только номер телефона без баланса http://i.imgur.com/FWEquxP.jpg
Баланс подгружается ajax-ом.
Вот нашел такой код на странице показывающий баланс:
<form id="j_idt582:j_idt584" name="j_idt582:j_idt584" method="post" action="./Личный кабинет «Мой Билайн»_files/Личный кабинет «Мой Билайн».html" enctype="application/x-www-form-urlencoded" style="display: none">
<input type="hidden" name="j_idt582:j_idt584" value="j_idt582:j_idt584">
[b]<script type="text/javascript">loadingBalance = function() {PrimeFaces.ab({source:'j_idt582:j_idt584:j_idt585',formId:'j_idt582:j_idt584',updateSelector:'@(.pre-balance-block, .payment-form)',async:true,onstart:function(cfg){loadingBalanceBlock.show();;},oncomplete:function(xhr,status,args){loadingBalanceBlock.hide(); try{ avaibleServices();}catch(e) {};},params:arguments[0]});};$(function() {loadingBalance();});</script>[/b]<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="747523851311306748:6362696473948308748" autocomplete="off">
</form>
Как его выполнить из BASH?
Делал так:
curl -k -i --raw -o 0.dat -X POST -d "javax.faces.partial.ajax=true&javax.faces.source=j_idt582%%3Aj_idt724%%3Aj_idt752&javax.faces.partial.execute=%%40all&javax.faces.partial.render=j_idt582%%3Aj_idt724+headerBalance+&j_idt582%%3Aj_idt724%%3Aj_idt752=j_idt582%%3Aj_idt724%%3Aj_idt752&j_idt582%%3Aj_idt724=j_idt582%%3Aj_idt724&javax.faces.ViewState=-1028883408476721569%%3A6254645381703189495" "https://my.beeline.ru/c/pre/index.html" -H "Host: my.beeline.ru" -H "Connection: keep-alive" -H "Accept: application/xml, text/xml, */*; q=0.01" -H "Origin: https://my.beeline.ru" -H "X-Requested-With: XMLHttpRequest" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" -H "Faces-Request: partial/ajax" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" -H "Referer: https://my.beeline.ru/c/pre/index.html" -H "Accept-Encoding: gzip,deflate" -H "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" -H "Cookie: GlobUserRegion=385; GlobUserRegionPath=mkl; GlobRegionAncestors=1%%7C384%%7C385; __utma=1.1726003945.1389105045.1389105045.1389105045.1; WT_FPC=id=ИП-418711440.30336735:lv=1389105046522:ss=1389105046522; usst=sjzUCw83FR; ui.language.current=ru_RU; SRV=WebNode26; WGID=mnWG2; _ym_visorc_20907550=b; _gat_UA-10061712-42=1; _gat_UA-10061712-32=1; _gat_UA-10061712-1=1; _ga=GA1.2.1726003945.1389105045; _gat_UA-10061712-37=1; JSESSIONID=g4O3l2qXNploAr0BvHLczPJLWBRluF8aCfkmcPLjQkGQok83EnzZ!-41650466; user_9674093113=9674093113; ticket=b5467ddcd44009ed5987a7fe626967e316bb0f9f; userType=B2C"
Результат нажатия кнопки обновить баланс в сервис гиде.
Файл 0.dat выглядит так:
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.5.3
Date: Sun, 16 Nov 2014 08:01:57 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Location: http://my.beeline.ru/login.html
X-USS-SERVER-NAME: nWebNode16
X-Powered-By: Servlet/3.0 JSP/2.2
Set-Cookie: usst=JhY3XYexBd; domain=my.beeline.ru; path=/; secure; HttpOnly
Set-Cookie: SRV=WebNode16; path=/
Set-Cookie: WGID=mnWG1; path=/

103
<html><head><title>302 Moved Temporarily</title></head>
<body bgcolor="#FFFFFF">
<p>This document you requested has moved
temporarily.</p>
<p>It's now at <a href="http://my.beeline.ru/login.html">http://my.beeline.ru/login.html</a>.</p>
</body></html>

0
Как увидеть баланс?

Оффлайн Vlad.V

  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
А билайн это интернет или gsm? Если это для gsm, могу помочь скриптом для Астериск, у меня регулярно проверяет счет.

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Задача такая в общем:
Есть файл со списком номеров состоящего из двух колонок разделенных ";". В первой номер, а во второй пароль от личного кабинета(НОМЕР;ПАРОЛЬ).
Cкрипт (в данном случае мой на bash) должен выдергивать номер и пароль и заходить в личные кабинеты операторов вытаскивая инфу
НОМЕР - БАЛАНС в отдельный файл HTML(HTML будет лежать на сервере для всех желающих видеть баланс на номерах)
Ваш скрипт тоже не помешает.
Сам curl видит только скелет страницы динамику он не видит.
На билайне как раз таки баланс формируется динамически аяксом.
Ваш скрипт тоже не помешает.
Вот думаю сделать на php что ли? :'(

Пользователь решил продолжить мысль 17 Ноябрь 2014, 17:12:11:
У МТС есть замечательный легкий вариант личного кабинета которого не т у МегаФона и Билайна! :'(
« Последнее редактирование: 17 Ноябрь 2014, 17:12:11 от Aslanali »

Оффлайн Vlad.V

  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
В php я не шарю, для меня во всем этом самое сложное - ввод логина и пароля для входа в кабинет, я не представляю как это сделать.
Насчет просмотра страницы, что если использовать lynx и grep'ать код с состоянием счета? Я когда-то так делал, правда без авторизации.
ЗЫ: это типа корпоративные номера сотрудников?

Оффлайн .ubuntufan

  • Активист
  • *
  • Сообщений: 638
    • Просмотр профиля

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
У МТС есть замечательный легкий вариант личного кабинета которого не т у МегаФона и Билайна!
У МегаФона есть нормальный API.
И bash-скрипт нагуглился довольно быстро.
Чутка допилил, и всё работает.
Наверняка, и для остальных операторов есть что-то подобное.

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
В php я не шарю, для меня во всем этом самое сложное - ввод логина и пароля для входа в кабинет, я не представляю как это сделать.
Насчет просмотра страницы, что если использовать lynx и grep'ать код с состоянием счета? Я когда-то так делал, правда без авторизации.
ЗЫ: это типа корпоративные номера сотрудников?
Да корпоративные номера сотрудников.
Так залогинился я и отобразил личный кабинет. Беда в том что билайн отображает баланс аяксом и из-за этого поймать не могу я этот баланс никак )))

Пользователь решил продолжить мысль [time]17 Ноябрь 2014, 23:13:54[/time]:
http://phantomjs.org/
Что это за библиотека и для чего она нужна?

Пользователь решил продолжить мысль 17 Ноябрь 2014, 22:15:00:
У МТС есть замечательный легкий вариант личного кабинета которого не т у МегаФона и Билайна!
У МегаФона есть нормальный API.
И bash-скрипт нагуглился довольно быстро.
Чутка допилил, и всё работает.
Наверняка, и для остальных операторов есть что-то подобное.
В студию код не предоставите? :-)
« Последнее редактирование: 17 Ноябрь 2014, 22:15:00 от Aslanali »

Оффлайн Vlad.V

  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля


Цитировать
Да корпоративные номера сотрудников.
В таком случае мой скрипт вам не пригодится. Он для Астериска и gsm шлюзов.

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля


Цитировать
Да корпоративные номера сотрудников.
В таком случае мой скрипт вам не пригодится. Он для Астериска и gsm шлюзов.

Спасибо Вам!

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Aslanali, я брал код отсюда:
https://github.com/psyX/pbal
Кстати, там есть и другие провайдеры/операторы.

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Aslanali, я брал код отсюда:
https://github.com/psyX/pbal
Кстати, там есть и другие провайдеры/операторы.
Старые ссылки, попробую переделать.
То что вы переделали для МегаФона не поделитесь с нами? :-)

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Вот текущий рабочий вариант для МегаФона:
Код: Bash
  1. URL1="http://sg.megafon.ru/ps/scc/php/route.php"
  2. DATA1=$(curl --location --silent "$URL1" -d "CHANNEL=WWW&ULOGIN=$PHONE")
  3. URL2=$(echo "$DATA1" | sed --quiet 's/<URL>\(.*\)<\/URL>/\1/p')
  4. DATA2=$(curl --location --silent "${URL2}ROBOTS/SC_TRAY_INFO?X_Username=$PHONE&X_Password=$PASSWD")
  5. STATUS=$(echo "$DATA2" | sed --quiet 's/<BALANCE>\(.*\)<\/BALANCE>/\1/p')

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
МегаФон работает. :)
МТС начал "делать мозги"
Мои данные
page="https://login.mts.ru/amserver/UI/Login?gx_charset=UTF-8&service=lk"

-d "IDToken1=НОМЕР&IDToken2=ПАРОЛЬ&IDButton=Submit&goto=&encoded=false&loginURL=%2Famserver%2FUI%2FLogin%3Fgx_charset%3DUTF-8%26service%3Dlk&csrf.sign=057cd51c6186c734cc2ac3743c30b518476356c913fa0b2184face746b600a26&csrf.ts=$CSRFToken"
Ошибка:
ERROR: Can't get CSRFToken from https://login.mts.ru/amserver/UI/Login?service=lk&goto=https://lk.ssl.mts.ru
Заменил CSRFToken на csrf.ts (даже и на csrf) ошибки никакой не выдает и не выполняется (завершаю по ctrl+c)
В файле mts.response нет ничего подобного csrf
tmp_file=/tmp/mts.response

...

#CSRFToken
CSRFToken=`grep csrf $tmp_file | head -n1 | sed -n -e 's/.*value="\(.*\)".*/\1/p'`
    if [ -z "$CSRFToken" ]; then
        err "Can't get CSRFToken from $page"
    fi

Пользователь решил продолжить мысль 19 Ноябрь 2014, 09:35:21:
Они защитились:
csrf.sign=057cd51c6186c734cc2ac3743c30b518476356c913fa0b2184face746b600a26
« Последнее редактирование: 19 Ноябрь 2014, 09:35:21 от Aslanali »

Оффлайн Aslanali

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Для Билайна пробовал, но там все сложнее оказалось. Баланс формируется аяксом.
_WARN=`echo $_RESPONSE | grep "messages-error"`
if [ "$_WARN" == "" ];
then
_BALANCE=`echo $_RESPONSE | egrep -o "<span class=\"price[^\"]?\">[^<]+<span[^>]+>" | sed -e 's@<[^>]*>@@g' -e 's@\s*@ @' -e 's@\ @ @g' -e 's@^\s*@@'`

if [ "$_BALANCE" != "" ];
then
echo "$_BALANCE" | sed -e 's@\..*@.@' -e 's@,@.@'
else
echo "Error: balance not avaible"
fi
else
echo "Error: incorrect login or password"
fi
Выдает "Error: balance not avaible", потому что баланс пуст.

Пользователь решил продолжить мысль 27 Ноябрь 2014, 22:28:47:
К примеру fiddler выдал мне такой запрос
javax.faces.partial.ajax=true&javax.faces.source=j_idt582%3Aj_idt584%3Aj_idt585&javax.faces.partial.execute=%40all&javax.faces.partial.render=j_idt582%3AhomeBalance+&j_idt582%3Aj_idt584%3Aj_idt585=j_idt582%3Aj_idt584%3Aj_idt585&j_idt582%3Aj_idt584=j_idt582%3Aj_idt584&javax.faces.ViewState=-1212071419226762276%3A-9155697296636732265
Также fiddler позволяет выгружать сессии в bat файл.
Выгрузил и пробовал выполнить то что выгрузилось, но увы.
« Последнее редактирование: 27 Ноябрь 2014, 22:28:47 от Aslanali »

 

Страница сгенерирована за 0.148 секунд. Запросов: 24.