Skip to content

Commit

Permalink
fix beeline web
Browse files Browse the repository at this point in the history
  • Loading branch information
artyl committed Aug 1, 2023
1 parent 304f5a4 commit 4269564
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 16 deletions.
3 changes: 3 additions & 0 deletions changelist.md
Original file line number Diff line number Diff line change
Expand Up @@ -523,3 +523,6 @@ FIX: очередная правка на выдачу ошибки вместо
FIX: исправил нажатие на submit на megafonb2b
FIX: pasha00000 прислал добавление по проверку на окончания срока действия абонемента avtodor-tr
FIX: pasha00000 прислал PR на исправление работы mangooffice

## mbplugin v1.00.59 (01.08.23) fix beeline web
FIX: еще раз (похоже не в последний) починил и ускорил работу WEB версии Beeline (напомню что по умолчанию по прежнему API)
43 changes: 27 additions & 16 deletions plugin/beeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,61 +7,72 @@
login_url = 'https://my.beeline.ru'
# если залогинены, то попадем сразу в ЛК, иначе попадем ХЗ куда
direct_lk_url = 'https://beeline.ru/customers/products/elk/tab/mobile-connection'
user_selectors = {'chk_lk_page_js': "document.querySelector('form input[type=password][role=textbox]') == null",
'chk_login_page_js': "document.querySelector('form input[type=password][role=textbox]') !== null",
profile_url = 'https://beeline.ru/customers/products/mobile/profile/'
user_selectors = {'chk_lk_page_js': "document.querySelector('form input.TBWrdb')== null && document.querySelector('form input[type=password]')== null",
'chk_login_page_js': "!(document.querySelector('form input.TBWrdb')== null && document.querySelector('form input[type=password]')== null)",
'login_clear_js': "document.querySelector('form input[type=text]').value=''",
'login_selector': 'form input[type=text]',
'password_clear_js': "document.querySelector('form input[type=password][role=textbox]').value=''",
'password_selector': 'form input[type=password][role=textbox]',
'submit_js': "document.querySelector('form [type=button]').click()",
}
}
profile_tag = 'api/profile/userinfo/data/?noTimeout'
accumulators2_tag = 'api/uni-profile-mobile/blocks'
services_tag = '/api/uni-profile-mobile/services/'
subscribtions_tag = '/api/uni-profile-mobile/subscriptions/'

class browserengine(browsercontroller.BrowserController):
def data_collector(self):
logging.info(f'Before call self.page_goto({direct_lk_url})')
self.page_goto(direct_lk_url)
self.sleep(2)
# оптимистичный сценарий если залогинены стараемся побыстрому все забрать
for _ in range(10):
self.sleep(1)
logging.info(f'Wait page {accumulators2_tag} and {services_tag}')
# Ждем пока появтся accumulators2_tag и services_tag
if len([v for k, v in self.responses.items() if accumulators2_tag in k and 'accumulators' in v or services_tag in k]) >= 2:
break
# Если не попали внутрь ЛК - тогда пытаемся логиниться
if self.page_evaluate("document.querySelector('form input[name=userName]') != null"):
if self.page_evaluate("document.querySelector('form input.TBWrdb')== null && document.querySelector('form input[type=password]')== null"):
self.do_logon(url=login_url, user_selectors=user_selectors)
self.page_goto('https://beeline.ru/customers/products/mobile/profile/')
profile_tag = 'api/profile/userinfo/data/?noTimeout'
self.page_goto(direct_lk_url)
self.sleep(10)
logging.info(f'Before call self.page_goto({profile_url})')
self.page_goto(profile_url)
# TODO костыль - сайт очень медленно открывается тупо долго ждем
for _ in range(0, 180, 5):
for _ in range(0, 180, 1):
logging.info(f'Wait page {profile_tag} {len(self.responses)}')
if any([k for k, v in self.responses.items() if profile_tag in k and 'balance' in v]):
break
self.sleep(5)
self.sleep(1)
else:
raise RuntimeError(f'Так и не получили страницу с балансом {profile_tag}')
# Приходится сначала долго ждать страницу, а затем когда она пришла получить ее точный url чтобы отфильтроваться от остальных запросов с похожим url
bal_data_url, bal_data = [[k, v] for k, v in self.responses.items() if profile_tag in k and 'balance' in v][-1]
self.result['Balance'] = bal_data.get('balance', {}).get('data', {})['balance']
self.result['TarifPlan'] = bal_data.get('profileSummary', {}).get('data', {}).get('tariffName','')
self.result['TarifPlan'] = bal_data.get('profileSummary', {}).get('data', {}).get('tariffName', '')
# ??? self.result['Internet'] = ??? {'name': 'Internet', 'url_tag': [bal_data_url], 'jsformula': "Math.max.apply(null,data.accumulators.data.list.concat(data.accumulators.data.listForYoung).map(el => (el!=undefined&&el.unit=='KBYTE'?el.rest:0)))"},
# ??? self.result['Min'] = ??? {'name': 'Min', 'url_tag': [bal_data_url], 'jsformula': "Math.max.apply(null,data.accumulators.data.list.concat(data.accumulators.data.listForYoung).map(el => (el!=undefined&&el.unit=='SECONDS'?el.rest/60:0))).toFixed(0)"},
# ??? self.result['SMS'] = {'name': 'SMS', 'url_tag': [bal_data_url], 'jsformula': "Math.max.apply(null,data.accumulators.data.list.concat(data.accumulators.data.listForYoung).map(el => (el!=undefined&&el.unit=='SMS'?el.rest:0)))"},
self.result['BlockStatus'] = bal_data.get('status', {}).get('data', {}).get('status', '')
self.result['LicSchet'] = bal_data.get('profileSummary', {}).get('data', {}).get('ctn', '')
# аккумуляторы тарифа Простой ?
try:
accumulators2_tag = 'api/uni-profile-mobile/blocks'
# все страницы попадающие под описание
accumulators2_all = [v for k, v in self.responses.items() if accumulators2_tag in k and 'accumulators' in v]
if len(accumulators2_all) > 0: # Нашли что нибудь?
acc2_list = accumulators2_all[-1].get('accumulators', {}).get('items', []) # Из последнего подходящего списка берем список items
acc2_dict = {el.get('unit'): el.get('rest', 0) for el in acc2_list}
self.result['Internet'] = self.result.get('Internet', 0) + acc2_dict.get('KBYTE', 0)
self.result['Internet'] = round(self.result.get('Internet', 0) * (settings.UNIT['KB'] / settings.UNIT.get(store.options('interUnit'), settings.UNIT['KB'])), 3)
self.result['Min'] = self.result.get('Min', 0) + acc2_dict.get('SECONDS', 0)
self.result['SMS'] = self.result.get('SMS', 0) + acc2_dict.get('SMS', 0)
except Exception:
exception_text = f'Ошибка при получении accumulators2 {store.exception_text()}'
logging.error(exception_text)
self.result['Internet'] = round(self.result.get('Internet', 0) * (settings.UNIT['KB'] / settings.UNIT.get(store.options('interUnit'), settings.UNIT['KB'])), 3)
try:
self.page_goto(direct_lk_url)
self.sleep(5)
services = [v for k, v in self.responses.items() if '/api/uni-profile-mobile/services/' in k][0]
subscribtions = [v for k, v in self.responses.items() if '/api/uni-profile-mobile/subscriptions/' in k][0]
services = [v for k, v in self.responses.items() if services_tag in k][0]
subscribtions = [v for k, v in self.responses.items() if subscribtions_tag in k][0]
uslugi = [[ln.get('title', 'xxx'), ln.get('rcRate', 0) * (1 if ln.get('rcRatePeriod') == 'Mounthly' else 1)] for ln in services]
# у меня этого нет - строчка ниже написана в слепую
uslugi.extend([[ln.get('title', 'xxx'), ln.get('rcRate', 0) * (1 if ln.get('rcRatePeriod') == 'Mounthly' else 1)] for ln in subscribtions])
Expand Down

0 comments on commit 4269564

Please sign in to comment.