发送MSN消息的PYTHON程序

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值