#http://www.puke365.com
#改编自Daniel Winter的PHP sendMsg 可用来发送报警信息
#!/usr/bin/env python
from socket import socket, ssl, AF_INET, SOCK_STREAM
from sys import exit, stdin, stdout, argv
from os import popen3
import getpass,md5,thread,time,re
ERR_AUTHENTICATION_FAILED = 911
ERR_SERVER_UNAVAILABLE = 600
ERR_USER_OFFLINE = 217
ERR_TOO_MANY_SESSIONS = 800
OK = 1
class MSNPAuth(object):
#ticket = ''
def MSNPAuthInit(self,passport,password,challenge):
username = passport.split("@")
if username[1] == "hotmail.com" or username[1] == "msn.com":
server = "loginnet.passport.com"
else:
server = "login.passport.com"
self.sock = socket(AF_INET,SOCK_STREAM)
self.sock.connect((server,443))
ssl_conn = ssl(self.sock)
buffer_passport = "GET /login2.srf HTTP/1.1/r/nAuthorization: Passport1.4 OrgVerb=GET,"+ /
"OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" + username[0] + /
"%40" + username[1] + ",pwd=" + password + "," + challenge + /
"/r/nHost: login.passport.com/r/n/r/n"
ssl_conn.write(buffer_passport)
buffer_passport = ssl_conn.read(2024)
tmp = buffer_passport.split("from-PP='")
buffer_passport = tmp[1].split("',ru=")
self.ticket = buffer_passport[0]
print self.ticket
print "ticket >>>>>/r/n"
self.sock.close()
def getKey(self):
return self.ticket
class sendMsg(object):
#sockNS = 0
sockSB = socket(AF_INET, SOCK_STREAM)
result = 0
def getsock(self,_socket):
if _socket == "NS":
return self.sockNS
else:
return self.sockSB
def simpleSend(self, passport, password, recipient, message):
print "init ok/r/n"
self.loginmsn(passport, password)
print "loginmsn ok/r/n"
if self.result > 1:
return False
self.createSession(recipient)
print "createSession ok/r/n"
self.sendMessage(message,"","")
def loginmsn(self,passport,password):
self._passport = passport
self._password = password
self._connect("NS","messenger.hotmail.com")
print "_connect ok/r/n"
self._send_data("NS","VER 0 MSNP8")
self._read("NS")
def createSession(self,account):
print "createSession init1/r/n"
if self.result > 1:
return False
print "createSession init2/r/n"
self._account = account
self._send_data("NS","XFR 5 SB")
self._read("NS")
def sendMessage(self,message,font,color):
if self.result > 1:
return False
head = "MIME-Version: 1.0/r/nContent-Type: text/plain; charset=UTF-8/r/n"
head = head + "/r/n"
lehth = len(head + message)
self._send_data("SB","MSG 3 U " + str(lehth) + "/r/n" + head + message)
self.result = OK
def _connect(self,_socket,_server):
#self.getsock(_socket) = socket(AF_INET, SOCK_STREAM)
print _socket
print "/r/n"
if _socket == "NS":
self.sockNS = socket(AF_INET, SOCK_STREAM)
else:
self.sockSB = socket(AF_INET, SOCK_STREAM)
try:
self.getsock(_socket).connect((_server, 1863))
except:
print "Operation Timed Out./n"
return True
def _read(self,_socket):
br = False
while True:
buffer_resp = self.getsock(_socket).recv(1024)
nlen = len(buffer_resp)
if nlen==0:
return True
nlen = nlen - 2
buffer_resp = buffer_resp[0:nlen]
br = self._process_data(buffer_resp)
if br == True:
return True
def _send_data(self,_socket,_data):
strtmp = _data[0:3]
if strtmp == "MSG":
strdata = _data
else:
strdata = _data + "/r/n"
self.getsock(_socket).send(strdata)
def _process_data(self,_data):
print _data
print "/r/n"
params = _data.split(" ")
if "VER" == params[0]:
self._send_data("NS","CVR 1 0x0409 winnt 5.1 i386 MSNMSGR 6.0.0254 MSMSGS " + self._passport)
elif "CVR" == params[0]:
self._send_data("NS","USR 2 TWN I " + self._passport)
elif "XFR" == params[0]:
subParams = params[3].split(":")
br = self._connect(params[2],subParams[0])
if params[2] == "NS":
self._send_data("NS","VER 0 MSNP8")
elif params[2] == "SB":
self._send_data("SB","USR 1 " + self._passport + " " + params[5])
self._read(params[2])
return True
elif "USR" == params[0]:
if params[2] == "TWN":
msnpa = MSNPAuth()
msnpa.MSNPAuthInit(self._passport,self._password,params[4])
hashkey = msnpa.getKey()
self._send_data("NS","USR 3 TWN S " + hashkey)
elif params[2] == "OK":
if len(params) == 7:
self._send_data("NS","CHG 4 NLN")
return True
else:
self._send_data("SB","CAL 0 " + self._account)
elif "JOI" == params[0]:
return True
elif "500" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "600" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "601" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "910" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "911" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "921" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "928" == params[0]:
self.result = ERR_SERVER_UNAVAILABLE
return True
elif "800" == params[0]:
self.result = ERR_TOO_MANY_SESSIONS
return True
elif "217" == params[0]:
self.result = ERR_USER_OFFLINE
return True
return False
sendmsn = sendMsg()
sendmsn.simpleSend("登陆帐号","密码","发送对象","信息")
print sendmsn.result