Как многие из вас наверняка знают, относительно недавно Мегафон запустил новую версию Сервис-Гида. Мне лично она очень понравилась — гораздо больше фич по сравнению с тем, что было, а особенно меня порадовала возможность автоматически пополнять баланс с банковской карты (т.е. теперь я насовсем забыл об оплате телефона — он оплатится сам!)… но здесь не об этом.
Есть там один пункт, который привлёк моё внимание: «Настройка Сервис-Гид -> Автоматический доступ». Как можно догадаться из описания, где-то там запрятан API для автоматизации сбора сведений о балансе. Это же интересно! Вот только где этот API искать…
Как оказалось, не очень далеко. Всё довольно нехитро: надо просто сделать обычный HTTPS запрос к serviceguide.megafonnw.ru/ROBOTS/SC_TRAY_INFO?X_Username=<login>&X_Password=<password> (домен второго уровня надо выбрать в зависимости от вашего региона; логин и пароль от Сервис-Гида). А что же в ответ? Конечно же, всеми любимый XML! От обилия тегов глаза немедленно начинают разбегаться. Ещё немного усилий и на очередном региональном сайте Мегафона обнаруживается описание формата. Букв там много, желающие сами ознакомятся, а я вкратце перескажу самое интересное.
Самый главный тег <SELFCARE>…</SELFCARE>. Внутри него находится всё остальное.
Ну что же, теория есть. Осталось вооружиться любимым инструментом и-и-и… сделать что-нибудь полезное.
Вот что я набросал:
Типичный вывод программы выглядит так:
Есть там один пункт, который привлёк моё внимание: «Настройка Сервис-Гид -> Автоматический доступ». Как можно догадаться из описания, где-то там запрятан API для автоматизации сбора сведений о балансе. Это же интересно! Вот только где этот API искать…
Как оказалось, не очень далеко. Всё довольно нехитро: надо просто сделать обычный HTTPS запрос к serviceguide.megafonnw.ru/ROBOTS/SC_TRAY_INFO?X_Username=<login>&X_Password=<password> (домен второго уровня надо выбрать в зависимости от вашего региона; логин и пароль от Сервис-Гида). А что же в ответ? Конечно же, всеми любимый XML! От обилия тегов глаза немедленно начинают разбегаться. Ещё немного усилий и на очередном региональном сайте Мегафона обнаруживается описание формата. Букв там много, желающие сами ознакомятся, а я вкратце перескажу самое интересное.
Самый главный тег <SELFCARE>…</SELFCARE>. Внутри него находится всё остальное.
- <LOGIN>…</LOGIN> — ну тут всё ясно.
- <SUBSCRIBER_MSISDN>…</SUBSCRIBER_MSISDN> — это номер телефона
- <GET_ACCOUNT_INFO>…</GET_ACCOUNT_INFO> — внутри много разных цифр (см. описание)
- <GET_CLIENT_NAME>…</GET_CLIENT_NAME>
- <CLIENT_NAME>…</CLIENT_NAME> — ФИО
- <IS_ACTIVE_OR_LOCKED>…</IS_ACTIVE_OR_LOCKED>
- <STATUS>…</STATUS> — 1 = «Активный»; 2 = «Добровольная блокировка»; 3 = «Блокирован»
- <GET_BALANCE>…</GET_BALANCE>
- <BALANCE>…</BALANCE> — денежки
- <DATE>…</DATE> — последнее обновление
Ну что же, теория есть. Осталось вооружиться любимым инструментом и-и-и… сделать что-нибудь полезное.
Вот что я набросал:
#!/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)