Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
UPD: Специалисты мегафона всё исправили.
import webapp2, re, base64, Cookie
from google.appengine.api import memcache
from google.appengine.api import urlfetch
from google.appengine.ext import db
from xml.dom import minidom
from datetime import datetime, timedelta
url_login = "https://messages.megafon.ru/userjson/weblogin.do?webloginReq.user=%s&webloginReq.secinfo=%s&imageVerifyCode=&__checkbox_remember=false&__checkbox_keepmeloggedin=false"
url_chatlist = "https://messages.megafon.ru/onebox/getChatList.do?startNum=1&endNum=100&reFreshFlag=1&operation=1&chatMsgType=10100000000100000000000000000000"
url_messages = "https://messages.megafon.ru/onebox/oneboxList.do?umReq.ctlg=1%%2C2&umReq.mType=2053&umReq.bNum=1&umReq.eNum=20&umReq.snd=%s&umReq.rcv=7%s"
def ums(username, password, senders):
try:
total_result = True
for sender in senders:
session_id = memcache.get(username)
action_result = None
if session_id:
action_result = messages(session_id, username, sender)
if action_result is False or session_id is None:
session_id = login(username, password)
action_result = messages(session_id, username, sender)
if action_result != True:
total_result = False
return total_result
except:
return
#get session id (cookie)
def login(login, password):
try:
result = urlfetch.fetch(url=url_login % (base64.b64encode(login), base64.b64encode(password)))
if result.content != '{"returnFlg":true}':
return False
cookie = Cookie.SimpleCookie()
cookie.load(result.headers.get('Set-Cookie'))
memcache.set(login, cookie['JSESSIONID'].value)
return cookie['JSESSIONID'].value
except:
return
#get and put to db messages from sender to username
def messages(session_id, username, sender):
try:
result = urlfetch.fetch(url=url_messages % (sender, username), follow_redirects=False,
headers={'Cookie': 'JSESSIONID=' + session_id})
if result.status_code == 302:
return False
xmldoc = minidom.parseString(result.content.replace("\r",'').replace("\n",''))
msg_list = xmldoc.getElementsByTagName('uniMsg')
for msg_element in msg_list:
msgID = msg_element.getElementsByTagName('msgID')[0].firstChild.nodeValue
msgText = msg_element.getElementsByTagName('ttl')[0].firstChild.nodeValue
msgTime = msg_element.getElementsByTagName('t')[0].firstChild.nodeValue
if sms.get_by_key_name(msgID) is None:
sms(key_name=msgID,msgID=msgID,msgTime=datetime.strptime(msgTime,"%Y%m%d%H%M%S"),msgText=msgText)
sms.put()
return True
except:
return
#get numbers and messages list (get xml for example)
def chatlist(session_id):
try:
result = urlfetch.fetch(url=url_chatlist,
headers={'Cookie': 'JSESSIONID=' + session_id})
return result.content
except:
return
class sms(db.Model):
msgID = db.StringProperty(required=True)
msgTime = db.DateTimeProperty(required=True) #UTC
msgText = db.TextProperty()
Пароль должен содержать от 6 до 20 цифр.
4. По подписке приходит SMS с кодом подтверждения
Выполняют подписку на дурацкий МегафонПро
64 742 073 абонента в апрелеЕсли кто-то сомневается, то подумайте: как мы получаем коды подтверждения от банков, коды для восстановления паролей вконтакте, facebook, gmail…
Страна непуганных идиотов
в одном месте есть капча, а в другом нет; кто-то говорит «от 6 до 20 цифр», а кто-то «от 3 до 128»SSO сделает любую аутентификацию в одном месте и авторизацию доступа к API для разных дочерних сервисов контролируемой. Сервисы эти пароль ваш не спрашивают и не получают, а получают токен доступа OAuth v.2, через механизм п.5 и то только с вашего согласия
Новая дыра в безопасности Мегафона позволяет взламывать счета абонентов