Как стать автором
Обновить

Сервис-Гид как источник полезной информации

Как многие из вас наверняка знают, относительно недавно Мегафон запустил новую версию Сервис-Гида. Мне лично она очень понравилась — гораздо больше фич по сравнению с тем, что было, а особенно меня порадовала возможность автоматически пополнять баланс с банковской карты (т.е. теперь я насовсем забыл об оплате телефона — он оплатится сам!)… но здесь не об этом.

Есть там один пункт, который привлёк моё внимание: «Настройка Сервис-Гид -> Автоматический доступ». Как можно догадаться из описания, где-то там запрятан API для автоматизации сбора сведений о балансе. Это же интересно! Вот только где этот API искать…

Как оказалось, не очень далеко. Всё довольно нехитро: надо просто сделать обычный HTTPS запрос к serviceguide.megafonnw.ru/ROBOTS/SC_TRAY_INFO?X_Username=<login>&X_Password=<password> (домен второго уровня надо выбрать в зависимости от вашего региона; логин и пароль от Сервис-Гида). А что же в ответ? Конечно же, всеми любимый XML! От обилия тегов глаза немедленно начинают разбегаться. Ещё немного усилий и на очередном региональном сайте Мегафона обнаруживается описание формата. Букв там много, желающие сами ознакомятся, а я вкратце перескажу самое интересное.

Самый главный тег <SELFCARE&gt…</SELFCARE&gt. Внутри него находится всё остальное.
  • <LOGIN&gt…</LOGIN&gt — ну тут всё ясно.
  • <SUBSCRIBER_MSISDN&gt…</SUBSCRIBER_MSISDN&gt — это номер телефона
  • <GET_ACCOUNT_INFO&gt…</GET_ACCOUNT_INFO&gt — внутри много разных цифр (см. описание)
  • <GET_CLIENT_NAME&gt…</GET_CLIENT_NAME&gt
    • <CLIENT_NAME&gt…</CLIENT_NAME&gt — ФИО
  • <IS_ACTIVE_OR_LOCKED&gt…</IS_ACTIVE_OR_LOCKED&gt
    • <STATUS&gt…</STATUS&gt — 1 = «Активный»; 2 = «Добровольная блокировка»; 3 = «Блокирован»
  • <GET_BALANCE&gt…</GET_BALANCE&gt
    • <BALANCE&gt…</BALANCE&gt — денежки
    • <DATE&gt…</DATE&gt — последнее обновление


Ну что же, теория есть. Осталось вооружиться любимым инструментом и-и-и… сделать что-нибудь полезное.

Вот что я набросал:



#!/usr/bin/python3


MEGADOMAIN = 'megafonnw'


import sys
import urllib.request
import urllib.error
import xml.dom.minidom

def getFromSimpleDomPath(root, path_list):
  cur = root
  for elem in path_list:
    cur = cur.getElementsByTagName(elem)[0]
  return cur.firstChild.data

def main():
  if len(sys.argv) != 3:
    print('Usage: sg.py <login> <password>')
    sys.exit(1)
  login, password = sys.argv[1], sys.argv[2]

  phone = None
  name = None
  status = None
  balance = None
  balance_date = None

  urlpath = 'https://serviceguide.{}.ru/ROBOTS/SC_TRAY_INFO?X_Username={}&X_Password={}'.format(MEGADOMAIN, login, password)
  try:
    with urllib.request.urlopen(urlpath) as data:
      r = xml.dom.minidom.parse(data).documentElement
      
      phone = getFromSimpleDomPath(r, ['SUBSCRIBER_MSISDN'])
      name = getFromSimpleDomPath(r, ['GET_CLIENT_NAME', 'CLIENT_NAME'])
      status = getFromSimpleDomPath(r, ['IS_ACTIVE_OR_LOCKED', 'STATUS'])
      balance = getFromSimpleDomPath(r, ['GET_BALANCE', 'BALANCE'])
      balance_date = getFromSimpleDomPath(r, ['GET_BALANCE', 'DATE'])
      
      print('=== {} ==='.format(phone))
      print('Name:', name)
      print('Status:', ['Active', 'Self-blocked', 'Blocked'][int(status)-1])
      print('Balance:', '{}rur (updated {})'.format(balance, balance_date))

  except urllib.error.HTTPError as e:
    if e.code == 423: # Locked
      print('Incorrect login or password')
      sys.exit(2)
    else:
      raise e


if __name__ == '__main__':
  main()



Типичный вывод программы выглядит так:
=== 9219876543 ===
Name: Пупкин Иван Петрович
Status: Active
Balance: 500.66rur (updated 18.08.2010 20:41:53)
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.