Skip to content

Commit

Permalink
Mts obshchiy_paket, standalone version addition parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
artyl committed Oct 16, 2020
1 parent be5fcdf commit 1fe4864
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 25 deletions.
4 changes: 4 additions & 0 deletions changelist.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,7 @@ __Автономная версия__:
Рекомендую заглянуть в settings.py там описаны все параметры ini файла с коментариями.
Если setup_and_check.bat запустить с параметром noweb то он не дабавляет запуск webserver в автозапуск
Аналогично mbstandalone.bat init noweb - также не добавляет web сервер в автозапуск.

## mbplugin 0.99.23 (16.10.20) Mts obshchiy_paket, standalone version addition parameter
Плагин mts2 умеет забирать информацию из общего пакета для телефонов указанных в параетре mts_usedbyme, или по всем телефонам если mts_usedbyme=1
В автономной версии теперь можно прописывать параметры BalanceNotChangedMoreThen, BalanceChangedLessThen, BalanceLessThen, TurnOffLessThen для каждого телефона (пример см standalone\phones.ini)
23 changes: 9 additions & 14 deletions plugin/httpserver_mobile.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,6 @@ def getreport(param=[]):
</html>'''
db = dbengine.dbengine(store.options('dbfilename'))
# номера провайдеры и логины из phones.ini
try:
options_ini = store.ini('options.ini').read()
edBalanceLessThen = float(options_ini['Mark']['edBalanceLessThen']) # помечать балансы меньше чем
edTurnOffLessThen = float(options_ini['Mark']['edTurnOffLessThen']) # помечать когда отключение CalcTurnOff меньше чем
except Exception:
edBalanceLessThen = float(store.options('edBalanceLessThen', section='HttpServer'))
edTurnOffLessThen = int(store.options('edTurnOffLessThen', section='HttpServer'))
num_format = '' if len(param) == 0 or not param[0].isnumeric() else str(int(param[0]))
table_format = store.options('table_format' + num_format, default=store.options('table_format',section='HttpServer'), section='HttpServer')
table = db.report()
Expand All @@ -170,12 +163,14 @@ def getreport(param=[]):
continue
el = line[he]
mark = '' # class="mark"
if he == 'Balance' and el is not None and el < edBalanceLessThen:
if he == 'Balance' and el is not None and el < float(phones[pkey]['BalanceLessThen']):
mark = ' class="mark" ' # Красим когда мало денег
if he == 'CalcTurnOff' and el is not None and el < edTurnOffLessThen:
if he == 'CalcTurnOff' and el is not None and el < int(phones[pkey]['TurnOffLessThen']):
mark = ' class="mark" ' # Красим когда надолго не хватит
if he == 'NoChangeDays' and el is not None and pkey in phones and int(el) > int(phones[pkey]['BalanceNotChangedMoreThen']):
mark = ' class="mark" ' # Красим когда давно не изменялся
if he == 'NoChangeDays' and el is not None and pkey in phones and int(el) < int(phones[pkey]['BalanceChangedLessThen']):
mark = ' class="mark" ' # Красим недавно поменялся а не должен был
if el is None:
el = ''
if he != 'Balance' and (el == 0.0 or el == 0):
Expand Down Expand Up @@ -251,17 +246,17 @@ def prepare_balance_sqlite(filter='FULL', params={}):
'Готовим данные для отчета из sqlite базы'
db = dbengine.dbengine(store.options('dbfilename', mainparams=params))
table_format = store.options('tg_format', section='Telegram', mainparams=params).replace('\\t','\t').replace('\\n','\n')
edBalanceLessThen = float(store.options('edBalanceLessThen', section='HttpServer'))
edTurnOffLessThen = int(store.options('edTurnOffLessThen', section='HttpServer'))
phones = store.ini('phones.ini').phones()
def alert_suffix(line):
pkey = (line['PhoneNumber'],line['Operator'])
if line['Balance'] is not None and line['Balance'] < edBalanceLessThen:
if line['Balance'] is not None and line['Balance'] < float(phones[pkey]['BalanceLessThen']):
return '<b> ! достигнут порог баланса !</b>'
if line['CalcTurnOff'] is not None and line['CalcTurnOff'] < edTurnOffLessThen:
if line['CalcTurnOff'] is not None and line['CalcTurnOff'] < int(phones[pkey]['TurnOffLessThen']):
return '<b> ! возможно скорое отключение !</b>'
if line['NoChangeDays'] is not None and pkey in phones and line['NoChangeDays'] > phones[pkey]['BalanceNotChangedMoreThen']:
return f'<b> ! баланс не изменялся более {phones[pkey]["BalanceNotChangedMoreThen"]} дней !</b>'
if line['NoChangeDays'] is not None and pkey in phones and line['NoChangeDays'] > phones[pkey]['BalanceNotChangedMoreThen']:
return f'<b> ! баланс изменился менее {phones[pkey]["BalanceChangedLessThen"]} дней назад!</b>'
return ''
# table_format = 'Alias,PhoneNumber,Operator,Balance'
# Если формат задан как перечисление полей через запятую - переделываем под формат
Expand Down Expand Up @@ -365,7 +360,7 @@ def _DoCreateIcons(self, iconame='httpserver.ico'):
hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)

flags = win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP
nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, hicon, "MBplugin http server")
nid = (self.hwnd, 0, flags, win32con.WM_USER + 20, hicon, f"MBplugin http server on port {store.options('port', section='HttpServer')}")
try:
win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid)
except win32gui.error:
Expand Down
24 changes: 22 additions & 2 deletions plugin/mts2.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async def async_main(self):
'remember_js': "document.querySelector('form input[name=rememberme]').click()", # js для выставления remember me
})
# TODO close banner # document.querySelectorAll('div[class=popup__close]').forEach(s=>s.click())
if self.login_ori != self.login: # это финт для захода через другой номер
if self.login_ori != self.login and self.acc_num.isdigit(): # это финт для захода через другой номер
# если заход через другой номер то переключаемся на нужный номер
# TODO возможно с прошлого раза может сохраниться переключенный но вроде работает и так
await self.page_waitForSelector("[id=ng-header__account-phone_desktop]")
Expand Down Expand Up @@ -104,7 +104,7 @@ async def async_main(self):

# Идем и пытаемся взять инфу со страницы https://lk.mts.ru/obshchiy_paket
# Но только если телефон в списке в поле mts_usedbyme или для всех телефонов если там 1
if (mts_usedbyme == '1' or self.login in mts_usedbyme.split(',')) and usedbyme != []:
if mts_usedbyme == '1' or self.login in mts_usedbyme.split(',') or self.acc_num.startswith('common'):
await self.page_goto('https://lk.mts.ru/obshchiy_paket')
res3 = await self.wait_params(params=[{'name': '#checktask', 'url_tag': ['for=api/Widgets/GetUserClaims', '/longtask/'], 'jsformula': "data.result"}])
try:
Expand All @@ -120,8 +120,28 @@ async def async_main(self):
self.result['SpendMin'] = data["MINUTE"]
self.result['SMS'] = data["ITEM"]
self.result['Internet'] = data["GBYTE"]
# Спецверсия для общего пакета, работает только для Donor
if self.acc_num.startswith('common'):
if 'RoleDonor' in str(res3):
# потребление и остаток
cdata_charge = {i['counterViewUnit']:i['groupConsumption'] for i in res4['#donor']}
сdata_rest = {i['counterViewUnit']:i['counterLimit']-i['groupConsumption'] for i in res4['#donor']}
self.result['Min'] = сdata_rest["MINUTE"] # осталось минут
self.result['SpendMin'] = cdata_charge["MINUTE"] # Потрачено минут
if 'rest' in self.acc_num:
self.result['SMS'] = сdata_rest["ITEM"] # остатки по инету и SMS
self.result['Internet'] = сdata_rest["GBYTE"]
else:
self.result['SMS'] = cdata_charge["ITEM"] # расход по инету и SMS
self.result['Internet'] = cdata_charge["GBYTE"]
else: # Со страницы общего пакета не отдали данные, чистим все, иначе будут кривые графики. ТОЛЬКО для common
raise RuntimeError(f'Страница общего пакета не возвращает данных')
except:
logging.info(f'Ошибка при получении obshchiy_paket {"".join(traceback.format_exception(*sys.exc_info()))}')
if self.acc_num.startswith('common'):
self.result = {'ErrorMsg': 'Страница общего пакета не возвращает данных'}



def get_balance(login, password, storename=None):
''' На вход логин и пароль, на выходе словарь с результатами '''
Expand Down
4 changes: 3 additions & 1 deletion plugin/pyppeteeradd.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ def clear_cache(storename):
profilepath = os.path.abspath(os.path.join(storefolder, 'puppeteer', storename))
shutil.rmtree(os.path.join(profilepath, 'Cache'), ignore_errors=True)
shutil.rmtree(os.path.join(profilepath, 'Code Cache'), ignore_errors=True)
shutil.rmtree(os.path.join(profilepath, 'Service Worker', 'CacheStorage'), ignore_errors=True)

def delete_profile(storename):
'Удаляем профиль'
Expand Down Expand Up @@ -325,7 +326,8 @@ async def wait_params(self, params, url='', save_to_result=True):
{'name':'text', 'url_tag':['text'], 'jsformula':'text'} - ожидается приход json с урлом содержащим url_tag из этого json через js eval возьмем tag_jformula
либо
{'name':'text', 'url_tag':[], 'jsformula':'text'} - url_tag - пустой список или не указан, на странице выполняется js из jsformula
результат во всех случаях записывается с именем name в результирующий словарь
Если нужно указать что в url_tag url заканчивается этим текстом, то поставьте после него знак $
результат во всех случаях записывается с именем name в результирующий словарь
Если параметр необязательный (т.е. его может и не быть) то чтобы его не ждать можно добавить в словарь по данному параметру 'wait':False
#param если параметр не нужен а просто нужно выполнить действие, то в начале такого параметра ставим #
---
Expand Down
20 changes: 15 additions & 5 deletions plugin/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
'dbfilename': '..\\BalanceHistory.sqlite',
# путь к html файлу, который создается после получения баланса
'balance_html': '..\\DB\\balance.html',
'average_days': 30, # Количество дней для расчета среднего по истории, если не смогли взять из options.ini
'updatefrommdb': 0, # Обновлять SQLite базу данными из MDB и на сколько дней в глубино
# Обновлять SQLite базу данными из MDB и на сколько дней в глубино
'updatefrommdbdeep': 30,
Expand All @@ -53,8 +52,19 @@
# список тел, через запятую - показать использованный только для этого списка телефонов
'mts_usedbyme': '0',
# average_days - если нет в Options.ini Additional\AverageDays то возьмем отсюда
# Число дней по которому считаем среднее
'average_days': 30,
# Количество дней для расчета среднего по истории
'average_days': 30,
# Порог, ниже которого выдается предупреждение о низком балансе
'BalanceLessThen': '2.5',
# Порог дней, посл которого выдается предупреждение о скором отключении.
'TurnOffLessThen': '2',
# В отчете будут показаны красным, если по номеру не было изменения более чем ... дней
# Если данный параметр не выставлен индивидуально для номера в phones.ini
'BalanceNotChangedMoreThen': '60',
# В отчете будут показаны красным, если по номеру были изменения менее чем ... дней
# Если данный параметр не выставлен индивидуально для номера в phones.ini
# Полезно когда вы следите за балансом который не должен меняться и вдруг начал меняться
'BalanceChangedLessThen': '0',
},
'Telegram': { # Раздел mbplugin.ini [Telegram]
'start_tgbot': 1, # Стартовать telegram bot вместе с http
Expand Down Expand Up @@ -92,7 +102,7 @@
# в отчете будут показаны красным, если число дней до отключения меньше чем
'edTurnOffLessThen': 2,
# В отчете будут показаны красным, если по номеру не было изменения более чем ... дней
# Если данный параметр не виставлен индивидуально для номера в phones.ini
'BalanceNotChangedMoreThen': 60
# Если данный параметр не выставлен индивидуально для номера в phones.ini
'BalanceNotChangedMoreThen': 60,
},
}
6 changes: 4 additions & 2 deletions plugin/store.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,6 @@ def phones(self):
if self.fn.lower() != 'phones.ini':
raise RuntimeError(f'{self.fn} is not phones.ini')
data = {}
BalanceNotChangedMoreThenDefault = int(options('BalanceNotChangedMoreThen', section='HttpServer'))
for secnum,el in self.read().items():
if secnum.isnumeric() and 'Monitor' in el:
key = (re.sub(r' #\d+','',el['Number']),el['Region'])
Expand All @@ -184,7 +183,10 @@ def phones(self):
data[key]['Number'] = el.get('Number','')
data[key]['PhoneDescription'] = el.get('PhoneDescription','')
data[key]['Monitor'] = el.get('Monitor','')
data[key]['BalanceNotChangedMoreThen'] = int(el.get('BalanceNotChangedMoreThen', BalanceNotChangedMoreThenDefault))
data[key]['BalanceLessThen'] = float(el.get('BalanceLessThen', options('BalanceLessThen')))
data[key]['TurnOffLessThen'] = int(el.get('TurnOffLessThen', options('TurnOffLessThen')))
data[key]['BalanceNotChangedMoreThen'] = int(el.get('BalanceNotChangedMoreThen', options('BalanceNotChangedMoreThen')))
data[key]['BalanceChangedLessThen'] = int(el.get('BalanceChangedLessThen', options('BalanceChangedLessThen')))
data[key]['Password2'] = el.get('Password2','')
return data

Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ vscale - Облачные серверы для разработчиков
Местоположение отчета по умолчанию - в папке 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 [Скачать можно отсюда](https://www.microsoft.com/en-us/download/details.aspx?id=13255). Для первоначального полного импорта используйте plugin\copy_alldata_from_mdb.bat
для интеграции с базой MDB необходимо установить 32битный ODBC драйвер для MDB AccessDatabaseEngine.exe [Скачать можно отсюда](https://www.microsoft.com/en-us/download/details.aspx?id=13255). Для первоначального полного импорта используйте plugin\copy_alldata_from_mdb.bat Замечание для пользователей автономной версии, импортировать данные можно и в ней (положив mdb файл в ту же папку где лежит sqlite файл), но для этого нужно на время импорта добавить параметр updatefrommdb = 1 а после импорта или выключить или убрать.
* __path__ - путь к папке, где находится MobileBalance
* __show_tray_icon__ - показывать иконку в трее - 1 прятать - 1, (по умолчанию 1)
* __show_chrome__ - Прятать окна Chrome (при logginglevel=DEBUG всегда показывает)
Expand Down
3 changes: 3 additions & 0 deletions standalone/phones.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ Monitor = TRUE
Alias = Èâàíû÷
Number = 9161112233
BalanceNotChangedMoreThen = 60
BalanceChangedLessThen=1
BalanceLessThen=100
TurnOffLessThen=1
Password2 = 123password

[Phone] #2
Expand Down

0 comments on commit 1fe4864

Please sign in to comment.