Skip to content

Latest commit

 

History

History
212 lines (156 loc) · 27.1 KB

mobilebalance.md

File metadata and controls

212 lines (156 loc) · 27.1 KB

Шлюз для запроса баланса из программы MobileBalance без Internet Explorer

Этот файл в удобном для просмотра виде можно найти на github

  • шлюз дает возможность писать собственные скрипты на любом языке и уходит от ограничений IE для javascript.
  • Т.к. mobilebalance меньше дергает IE, он меньше подвисает и падает.
  • Для ряда операторов используется движок браузера chrome или родственных ему на chromium, для получения информации о балансе, но взаимодействие с ним вынесено за пределы процесса Mobilebalance? так что не приводит к накоплению ошибок и утечкам памяти.
  • Можно сохранять сессии, т.е. на каждый телефон tele2 у вас будет своя сессия с сохраненными куками.
  • Все собрано таким образом, чтобы не оказывать никакого влияния на установленные программы, в т.ч. если установлен python другой версии.
  • Есть два варианта использования вызов через DLL - dllplugin плагин и вызов через локальный веб-сервер jsmblhplugin.
  • jsmbLh и DLL плагины это всего-лишь обертка, которая внутри вызывает одни и те же плагины
  • Т.к. у версии dllplugin обнаружился недостаток в виде того что MobileBalance принимает из dllplugin ограниченное количество параметров, то в настоящий момент приоритетной является версия с веб-сервером - jsmblhplugin, хотя если вам нужен только баланс и какие-то базовые вещи, то никто не мешает использовать и dllplugin.

Короткая инструкция по установке для работы с MobileBalance

  1. Свежую версию сборки можно найти в releases в моем репозитории на github или в форуме на 4pda посвященном MobileBalance.
  2. Распаковать свежую версию сборки в папку где установлен MobileBalance (точнее, где находятся файлы Options.ini, phones.ini, BalanceHistory.mdb если в папке MobileBalance.exe есть, а указанных файлов нет, то пробуйте поискать в папке например вместо C:\Program Files (x86)\Mobilebalance посмотрите в папке %localappdata%\VirtualStore\Program Files (x86)\Mobilebalance или просто поищите по диску в какой папке у вас находится phones.ini и другие файлы).
  3. Запустить из папки mbplugin setup_and_check.bat (он пересобирет плагины, поставит в автозагрузку веб-сервер и проверит работу тестовым плагином). Бывает, что он в процессе выдает ошибки, но при этом отрабатывает нормально. Так что если были сообщения об ошибке, то можно их проигнорировать и попробовать работу программы, или при желании можно запустить setup_and_check.bat повторно и посмотреть на результат.
  4. Подключить нужные плагины из папки mbplugin\jsmblhplugin
  5. Можно пользоваться.

Видеоинструкция по установке

Записал несколько видео о том как настраивать, кому-то по видео возможно будет проще
Видеоинструкция сильно устарела, так что возможны нестыковки, но общие принципы позволяет понять

ВАЖНО! Веб-сервер

DLL плагины работают без web-сервера, но для получения всех параметров, например остатков интернета придется использовать jsmbLH плагины (они в папке jsmblhplugin)
Для jsmbLH плагинов нужен веб-сервер (запускается mbplugin\run_webserver.bat), а кроме этого если включить режим записи в БД, то через web сервер становиться доступен просмотр отчетов по телефонам, полученным через mbplugin report, это ссылку также можно открыть через иконку web-сервера в системном трее.
Отчет также можно открыть как html файл, по умолчанию он находится в папке mbplugin\DB\balance.html, при желании это можно поменять через параметр balance_html в mbplugin.ini

Какие бывают плагины

Все плагины (простые и через браузер) в использовании одинаковы независимо от задействованного внутреннего механизма

Простые плагины

Этот вид плагинов использует для работы получение данных по конкретным url адресам и не требует больших ресурсов для работы, но требует больших усилий по разработке и в ряде случаев запредельную сложность реализации

Плагины через запуск скрытого браузера

Этот вид плагинов использует для получения баланса запуск скрытого браузера, такие плагины значительно легче разрабатывать, но т.к. для запуска браузера требуется больше ресурсов этот вариант немного тяжелее простых плагинов для системы.
В качестве браузера может быть выбран один из вариантов Chromium, Firefox или WebKit (чтобы уменьшить размер трафика при установке по умолчанию скачивается только Chromium)
Сокрытие окна браузера с экрана может осуществляться как средствами ОС (параметр show_chrome) так и включением специального режима headless (headless_chrome)
Запуск браузера может осуществляться в трех вариантах в зависимости от настроек в mbplugin.ini: show_chrome = 1 и headless_chrome = 0 - браузер показывается все время. show_chrome = 0 и headless_chrome = 0 - браузер скрывается с экрана, но в момент запуска кратковременно появляется в панели задач. В случае появления капчи может быть отображен. Скрытие браузера в этом режиме работает только на платформе Windows
show_chrome = 0 и headless_chrome = 1 - браузер запускается в скрытом режиме, никак во время работы визуально себя не проявляет, в случае появления капчи не может быть отображен. С некоторыми плагинами не может работать в таком режиме при использовании движка хрома.

Кроме простого использования есть еще:

Телеграм бот
Запись в базу sqlite
Импорт данных из mdb базы mobilebalanse в БД sqlite
Просмотр балансов в браузере (как в MobileBalance) и генерация отчета в виде html странички
В перспективе есть планы, чтобы mbplugin работал как самостоятельное приложение

mbplugin.ini (в нем можно включить дополнительные фишки)

Полный список настроек смотри в mbplugin_ini.md

Архив должен был распакован в папку где расположен MobileBalance, при первом запуске (setup_and_check.bat) в папке, где находится mobilebalance.exe будет создан mbplugin.ini с дефолтовыми минимальными настройками (по умолчанию все доп фишки выключены):

  • mts_usedbyme = 0 - спецвариант по просьбе Mr. Silver в котором возвращается не остаток интернета, а использованный, 0 - показывать оставшийся трафик (NonUsed) по всем, 1 - показывать использованный трафик (usedByMe) по всем, или список тел, через запятую - показать использованный только для этих списка телефонов
  • sqlitestore = 1 - запись запросов в sqlite БД, причем пишутся все поля, например те же SMS, которые не принимает MobileBalance через DLL, sqlite БД по умолчанию находится в папке mobilebalance
  • createhtmlreport = 1 (требуется включенный sqlitestore = 1)- после каждого вызова mbplugin создавать файл с отчетом, сходный с html страничкой, которую mobilebalance умеет отдавать в виде html. Список полей в отчете можно поменять в переменной table_format, только не трогайте на первых двух местах PhoneNumber,Operator, иначе сломается. Пока не придумал как по другому.

Местоположение отчета по умолчанию - в папке mbplugin\db\balance.html, если хотите в другое место - меняйте параметр balance_html Если выставить sqlitestore = 1 и createhtmlreport = 1, то после каждого получения баланса будет генерироваться файл db\balance.html максимально близкий по виду к файлу, который генерирует MobileBalance, но только по тем телефонам, баланс которых мы получаем через mbplugin. Также все данные получаемые через mbplugin сохраняются в базу SQLITE схожей структуры с BalanceHistory.mdb. Данная возможность позволяет видеть те поля, которые не принимает MobileBalance из DLL плагинов, например количество SMS.

  • updatefrommdb = 1 - Импорт данных из BalanceHistory.mdb после каждого запроса, требует установленного ODBC драйвера и включенного sqlitestore = 1, для интеграции с базой MDB необходимо установить 32-битный ODBC драйвер для MDB AccessDatabaseEngine.exe Скачать можно отсюда. Для первоначального полного импорта используйте plugin\copy_alldata_from_mdb.bat Замечание для пользователей автономной версии, импортировать данные можно и в ней (положив mdb файл в ту же папку, где лежит sqlite файл), но для этого нужно на время импорта добавить параметр updatefrommdb = 1, а после импорта или выключить или убрать.
  • show_tray_icon - показывать иконку в трее - 1 прятать - 0, (по умолчанию 1)
  • show_chrome - Прятать окна Chrome (при logginglevel=DEBUG всегда показывает)
  • show_captcha - При определении что в браузере сработала капча скрытое окно хрома будет показано (не сработает в режиме headless)
  • [Telegram] секция с настройками для телеграм бота (подробное описание в секции про телеграм)
  • [HttpServer] - Секция с настройками web сервер порт сервера, доступ к серверу по сети, и список полей в отчете
  • Для использования этих возможностей убедитесь, что в файле mbplugin.ini в разделе [MobileBalance] параметр path указывает на папку где находится mobilebalance.exe. Если вы распаковали архив в подпапку в папке с MobileBalance, то path должен настроиться автоматически.

Telegram бот

Инструкция настройке бота

log журналы

В папке mbplugin\log ведется журнал работы mbplugin

Как проверить что все работает

Запустите mbplugin\setup_and_check.bat он пересоберет плагины, настроит автозапуск web сервера для jsmbLH плагинов и проверит работу плагинов запуском обоих вариантов тестового плагина.

Немного технических деталей

Установка из исходников из github

Склонировать репозиторий c github (обновления можно так же будет накатывать через git pull)
Для сборки под windows понадобиться curl.exe и 7z.exe, в linux и MacOS сборка не требуется, достаточно установить python >3.6 склонировать репозиторий и установить пакеты

git clone https://github.com/artyl/mbplugin

зайти в папку mbplugin

build clean
build build

tkinter для python, если нужен ввод капчи для python к сожалению автоматом поставить не получиться, нашел только такой способ
Сборка всех DLL: dllsource\compile_all_p.bat
После этого все DLL будут находиться в папке mbplugin\dllplugin
Если есть желание использовать свой питон, тогда можно поменять вызов в mbplugin\plugin\mbplugin.bat

Использование

Теперь есть два варианта использования jsmblh plugin (jsmb localhost) приоритетный вариант и старый вариант dllplugin jsmblh plugin мы подключаем из папки mbplugin\jsmblhplugin dllplugin из папки mbplugin\dllplugin

jsmblhplugin

Для использования добавить в автозагрузку mbplugin\run_webserver.bat и подключить нужный плагин из папки mbplugin\jsmblhplugin
Вызов осуществляется через jsmb плагин, передающий параметры в webserver, который в свою очередь уже вызывает сам плагин. Плюсы - получаем все поля, которые могли использовать в jsmb плагинах, минусы - необходимо запускать webserver, также в этой схеме больше участия IE, и возможно глюков от замусоренного кэша IE будет больше.
!ВАЖНО! Не забывайте, что для работы jsmblhplugin должен быть запущен web server mbplugin\run_webserver.bat (при запущенном webserver появляется иконка в трее)

dllplugin

Для использования в MobileBalance подключить нужный dll плагин из папки mbplugin\dllplugin Вызов плагина осуществляется через вызов DLL, плюс - минимальное участие IE, минус MB не все поля принимает обратно
Пути, жестко прописываются в DLL, в готовой сборке они смотрят в C:\mbplugin, если ваша папка отличается от этой, то запустите dllsource\compile_all_p.bat
Подключить DLL для нужных провайдеров (Настройки\Плагины\Операторы Добавить и выбрать DLL для нужных операторов) В настройках для соответствующего телефона выбрать провайдера соответствующей DLL !ВАЖНО! Dll plugin привязан к той папке, куда настроен, если вы хотите переместить папку mbplugin в другое место, то после перемещения ОБЯЗАТЕЛЬНО запустите mbplugin\setup_and_check.bat

Замечания по месту на диске

Т.к. используется самостоятельный движок chromium и другие, то в ряде случаев старые версии движков могут накапливаться. Хотя документация к playwright уверяет что этого происходить не должно. Проверить это можно заглянув в папку %userprofile%\AppData\Local\ms-playwright

Как написать свой плагин

Если на python, то это файл с функцией get_balance(login, password, storename, **kwargs) storename это строка, используемая как ключ для хранения сессии. Формируется как имя плагина + login Функция возвращает результат в виде словаря. Можно посмотреть как сделаны другие плагины, также есть простые тестовые. После того как плагин будет готов запускаем C:\mbplugin\setup_and_check.bat и будут пересобраны DLL и jsmbLH для всех имеющихся в папке C:\mbplugin\plugin плагинов. Подключаем полученный jsmbLH или DLL плагин в MobileBalance и используем его для получения баланса, не забывайте что для jsmbLH нужен запущенный веб-сервер.

Как работает вариант jsmbLH

На компьютере работает веб-сервер (по умолчанию на 19777 порту, который принимает обращения из пустышек-jsmbLH плагинов и реализует обращение к самим плагинам). Работа самих плагинов не зависит от того, кто их вызвал DLLplugin или jsmbLH плагин

Как работает вариант DLL

ВАЖНО! DLL собраны 32-битным компилятором, и вызываться должны из 32-битного приложения. 32-битную DLL вызвать из 64-битного приложения нельзя!
Mobilebalance вызывает DLL, передавая ей логин и пароль через xml строку В самой DLL никакого функционала нет, она служит лишь оберткой для передачи вызова в mbplugin\plugin\mbplugin.bat
DLL вызывает mbplugin\plugin\mbplugin.bat, передавая ему имя плагина в качестве параметра, а переданный XML через переменную окружения RequestVariable mbplugin.bat вызывает mbplugin.py, в котором вызывается соответствующий python плагин. mbplugin.bat возвращает результат через stdout.

Данные по параметрам вызова DLL были получены с помощью реверса существующего DLL плагина. Я постарался сделать все так, чтобы все можно было собрать за 10 минут, не устанавливая 10 гигабайтные компиляторы, минималистичная DLL весь код вынесен в скрипты. Конечно DLL можно собрать и на vc и gpp и на Delphi и много на чем еще, но для этого нужно много возни с установкой среды, в моем варианте все можно собрать с нуля за 10 минут, скачав несколько десятков мегабайт.
Количество кода для DLL минимум, чтобы любой желающий мог без труда убедится что в нем нет закладок.

Остальной код на скриптах, и его можно проверить в любой момент. C я знаю не очень хорошо, поэтому единственный простой способ передать request я нашел через переменную окружения, а возврат осуществляется через поток вывода. Пути в папке mbplugin внутри DLL приходится прописывать абсолютными, потому что из DLL выяснить, по какому пути она находится, оказалось очень нетривиальной задачей, даже имя DLL узнать очень непросто. В принципе это проблема небольшая, на tcc все пересоберается за пару секунд. Хотел сохранить настройки для путей в реестре, но из реестра прочитать оказалось тоже не просто. В результате у меня получилось сделать только так, код на C получился не очень хороший, но работоспособный. Если кто в состоянии причесать сишный код, буду признателен. Вызов bat файла, а не напрямую скрипта python, сделан для того, чтобы если будет желание отвязаться от python, с минимумом изменений в остальном коде.

Т.к. в запросе передается только логин и пароль, то нам приходится сделать по отдельной DLL для каждого сервиса. Чтобы оставить задел на будущее, я для плагинов добавил еще префиксы, для питона это p_ Таким образом, мы генерируем dll по следующему принципу: Для python плагина tele2 - файл плагина tele2.py tele2 - имя модуля на python, который получает баланс p_tele2.dll - dll которую мы подключаем в mobilebalance

В процессе эксплуатации выяснилось, что mobilebalance, оказывается, все поля принимает из результата возвращенного DLLplugin, как оказалось, например не понимает остаток SMS, Список принимаемых полей достаточно короткий:

  • Balance
  • Expired
  • Min
  • Internet
  • TarifPlan
  • BlockStatus
  • AnyString

Все, кроме этого, будет проигнорировано

Несмотря на то, что, на первый взгляд, это все идет не через браузер, mobilebalance все равно перед стартом DLL дергает движок IE (res://ieframe.dll/navcancl.htm и about:blank) - это видно по логу и появлению файлов в папке кэша IE, так что не исключаю, что часть каких-то глюков может по-прежнему лечиться чисткой кэша браузера, хотя это и маловероятно.

ВАЖНО. В xml который возвращает плагин поля case sensitive, так что если будет balance вместо Balance, MB будет писать что баланс равен нулю.

--- Структура request который приходит из mobilebalance через переменную окружения ----------

<?xml version="1.0" encoding="windows-1251" ?>
<Request>
  <ParentWindow>007F09DA</ParentWindow>
  <Login>loginlogin</Login>
  <Password>password123456</Password>
</Request>

---- В mobilebalance уходит xml через вывод на экран -------------

<Response><Balance>123</Balance></Response>