Skip to content

Commit

Permalink
refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
artyl committed Aug 7, 2022
1 parent 51f437b commit 6794316
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 49 deletions.
18 changes: 12 additions & 6 deletions plugin/browsercontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,7 @@ def do_logon(self, url=None, user_selectors=None):
self.sleep(1)
self.page_screenshot()

def calculate_param(self, url_tag: list =[], jsformula: str ='', pformula: str =''):
def calculate_param(self, param_name, url_tag: list =[], jsformula: str ='', pformula: str =''):
'Вычисляет js выражение jsformula над json co страницы с url_tag, !!! url_tag - список тэгов'
# TODO self.page.evaluate(f"(data) => {jsformula}", json_data)
#return self.page_evaluate(f"()=>{{data={json.dumps(json_data,ensure_ascii=False)};return {jsformula};}}")
Expand All @@ -666,7 +666,7 @@ def calculate_param(self, url_tag: list =[], jsformula: str ='', pformula: str =
if len(response_result_)>0:
response_result = response_result_[-1] # если ответов несколько - берем последний, так правильнее
if pformula != '':
logging.info(f'pformula on {url_tag}:{pformula}')
logging.info(f'{param_name}: pformula on {url_tag}:{pformula}')
# Для скрипта на python делаем
try:
res = eval(pformula, {'data':response_result})
Expand All @@ -675,7 +675,7 @@ def calculate_param(self, url_tag: list =[], jsformula: str ='', pformula: str =
exception_text = f'Ошибка в pformula:{pformula} :{store.exception_text()}'
logging.info(exception_text)
if jsformula != '':
logging.info(f'jsformula on {url_tag}:{jsformula}')
logging.info(f'{param_name}: jsformula on {url_tag}:{jsformula}')
# !!! TODO Было:
res = self.page_evaluate(f"()=>{{data={json.dumps(response_result,ensure_ascii=False)};return {jsformula};}}")
# Стало: в playwright автоматом подставится переменная response_result из кода, теперь можно так:
Expand Down Expand Up @@ -716,20 +716,26 @@ def wait_params(self, params, url='', save_to_result=True):
error_msg = f'Not all params have name param: {params}'
logging.error(error_msg)
raise RuntimeError(error_msg)
store.feedback.text(f'Собираем параметры {",".join([i.get("name","") for i in params])}', append=True)
fb_txt = f'Собираем параметры {",".join([i.get("name","") for i in params])}'
store.feedback.text(fb_txt, append=True)
logging.info(f'wait_params: {fb_txt}')
if url != '': # Если указан url то сначала переходим на него
self.page_goto(url)
self.page_wait_for(loadstate=True)
for countdown in range(self.wait_loop):
self.sleep(1)
breakpoint() if os.path.exists('breakpoint_wait') else None
for param in params:
res = self.calculate_param(param.get('url_tag',[]), param.get('jsformula',''), param.get('pformula',''))
if param['name'] in result:
continue # Если этот параметр уже получен, то его пропускаем
res = self.calculate_param(param['name'], param.get('url_tag',[]), param.get('jsformula',''), param.get('pformula',''))
if res is not None:
result[param['name']] = res
# Если все обязательные уже получили
if {i['name'] for i in params if i.get('wait',True)} - set(result) == set():
required__not_received = {i['name'] for i in params if i.get('wait',True)} - set(result)
if required__not_received == set():
break # выходим если все получили
logging.info(f'Wait {", ".join(required__not_received)}')
if countdown == self.wait_and_reload:
# так и не дождались - пробуем перезагрузить и еще подождать
self.page_reload('Data not received')
Expand Down
48 changes: 5 additions & 43 deletions plugin/mts.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def data_collector(self):
self.wait_params(params=[
{'name': 'Balance', 'url_tag': [api_login_userinfo], 'jsformula': "parseFloat(data.userProfile.balance).toFixed(2)"},
# Закрываем банеры (для эстетики)
{'name': '#banner1', 'url_tag': [api_login_userinfo], 'jsformula': "document.querySelectorAll('mts-dialog div[class=popup__close]').forEach(s=>s.click())", 'wait':False},
{'name': '#banner1', 'url_tag': [api_login_userinfo], 'jsformula': "document.querySelectorAll('mts-dialog div[class=popup__close]').forEach(s=>s.click())==null", 'wait':False},
])

# Потом все остальное
Expand Down Expand Up @@ -155,19 +155,16 @@ def data_collector(self):
logging.info(f'Ошибка при получении списка услуг {store.exception_text()}')

# Идем и пытаемся взять инфу со страницы https://lk.mts.ru/obshchiy_paket
# Теперь это на https://lk.ssl.mts.ru/sharing
# Но только если телефон в списке в поле mts_usedbyme или для всех телефонов если там 1
if mts_usedbyme == '1' or self.login in mts_usedbyme.split(',') or self.acc_num.lower().startswith('common'):
self.page_goto('https://lk.mts.ru/obshchiy_paket')
# 24.08.2021 иногда возвращается легальная страница, но вместо информации там сообщение об ошибке - тогда перегружаем и повторяем
for i in range(3):
res3 = {}
res3_alt = self.wait_params(params=[{'name': '#checktask', 'url_tag': ['for=api/sharing/counters', '/longtask/'], 'jsformula': "data"}])
if 'Donor' in str(res3_alt) or 'Acceptor' in str(res3_alt):
break # Новый вариант аккумуляторов
# TODO отключить в будущем
res3 = self.wait_params(params=[{'name': '#checktask', 'url_tag': ['for=api/Widgets/GetUserClaims', '/longtask/'], 'jsformula': "data.result"}])
if 'claim_error' not in str(res3):
break # Старый вариант аккумуляторов (если он уже не срабатывает приходит пустой без ошибки)
if i == 1: # Аккумуляторы теперь приходят с первоначальной страницей, но если вдруг их нет пробуем ткнуться в страницу с аккумуляторами
self.page_goto('https://lk.ssl.mts.ru/sharing')
logging.info(f'mts_usedbyme: GetUserClaims вернул claim_error - reload')
self.page_reload()
self.sleep(5)
Expand Down Expand Up @@ -195,26 +192,6 @@ def data_collector(self):
self.result['SMS'] = el.get('usedAmount', 0)
if el.get('packageType', '') == 'Internet':
self.result['Internet'] = round(el.get('usedAmount', 0) / 1024 / 1024, 3)
# TODO отключить в будущем
# Обработка по старому варианту страницы api/Widgets/GetUserClaims
if 'RoleDonor' in str(res3): # Просто ищем подстроку во всем json вдруг что-то изменится
logging.info(f'mts_usedbyme: RoleDonor')
res4 = self.wait_params(params=[{'name': '#donor', 'url_tag': ['for=api/Widgets/AvailableCountersDonor$', '/longtask/'], 'jsformula': "data.result"}])
# acceptorsTotalConsumption - иногда возвращается 0 приходится считать самим
# data = {i['counterViewUnit']:i['groupConsumption']-i['acceptorsTotalConsumption'] for i in res4['#donor']}
data = {i['counterViewUnit']:i['groupConsumption']-sum([j.get('consumption',0) for j in i.get('acceptorsConsumption',[])]) for i in res4['#donor']}
if 'RoleAcceptor' in str(res3):
logging.info(f'mts_usedbyme: RoleAcceptor')
res4 = self.wait_params(params=[{'name': '#acceptor', 'url_tag': ['for=api/Widgets/AvailableCountersAcceptor', '/longtask/'], 'jsformula': "data.result.counters"}])
data = {i['counterViewUnit']:i['consumption'] for i in res4['#acceptor']}
if 'RoleDonor' in str(res3) or 'RoleAcceptor' in str(res3):
logging.info(f'mts_usedbyme collect: data={data}')
if 'MINUTE' in data:
self.result['SpendMin'] = data["MINUTE"]
if 'ITEM' in data:
self.result['SMS'] = data["ITEM"]
if 'GBYTE' in data:
self.result['Internet'] = data["GBYTE"]
# Спецверсия для общего пакета, работает только для Donor
if self.acc_num.lower().startswith('common'):
# Обработка по новому варианту страницы api/sharing/counters
Expand All @@ -234,21 +211,6 @@ def data_collector(self):
self.result['Internet'] = round((el.get('totalAmount', 0) - el.get('usedAmount', 0)) / 1024 / 1024, 3)
else: # потрачено
self.result['Internet'] = round(el.get('usedAmount', 0) / 1024 / 1024, 3)
# TODO отключить в будущем старый вариант
# Обработка по старому варианту страницы api/Widgets/GetUserClaims
elif '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"]
logging.info(f'mts_usedbyme common collect: сdata_rest={сdata_rest} cdata_charge={cdata_charge}')
else: # Со страницы общего пакета не отдали данные, чистим все, иначе будут кривые графики. ТОЛЬКО для common
raise RuntimeError(f'Страница общего пакета не возвращает данных')
except Exception:
Expand Down Expand Up @@ -486,7 +448,7 @@ def get_balance(login, password, storename=None, **kwargs):
pkey=store.get_pkey(login, plugin_name=plugin_name)
plugin_mode = store.options('plugin_mode', pkey=pkey).upper()
# Поменять дефолт если будут проблемы с playwright != 'WEB':
if plugin_mode in ('API', 'FASTAPI'):
if False: # API вариант не работает plugin_mode in ('API', 'FASTAPI'):
fast_api = (plugin_mode == 'FASTAPI')
return get_balance_api(login, password, storename, plugin_name=plugin_name, fast_api=fast_api)
else:
Expand Down

0 comments on commit 6794316

Please sign in to comment.