Pull to refresh

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

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

Есть там один пункт, который привлёк моё внимание: «Настройка Сервис-Гид -> Автоматический доступ». Как можно догадаться из описания, где-то там запрятан 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)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.