#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (c) 2001-2004 Twisted Matrix Laboratories. # See LICENSE for details. # # Twisted Imports from twisted.internet import reactor from twisted.internet.protocol import ClientFactory from twisted.words.protocols import msn from twisted.python import log from urllib import quote, unquote # System Imports import sys, getpass, locale """ This example connects to the MSN chat service and prints out information about all the users on your contact list (both online and offline). The main aim of this example is to demonstrate the connection process. @author Samuel Jordan """ def _createNotificationFac(): fac = msn.NotificationFactory() fac.userHandle = USER_HANDLE fac.password = PASSWORD fac.protocol = Notification return fac class Switchboard(msn.SwitchboardClient): def __init__(self, notification, userHandle, person, key, sessionID='', message=''): msn.SwitchboardClient.__init__(self) self.notification = notification self.userHandle = USER_HANDLE self.to = userHandle self.person = person self.key = key self.sessionID = sessionID def lineReceived(self, line): print "<<<", line.decode('UTF-8').encode(default_locale[1]) msn.SwitchboardClient.lineReceived(self, line) def sendLine(self, line): print ">>>", line.decode('UTF-8').encode(default_locale[1]) msn.SwitchboardClient.sendLine(self, line) def gotMessage(self, msg): print msg.message.decode('UTF-8').encode(default_locale[1]) echo = msn.MSNMessage(message = msg.message) echo.setHeader('Content-Type', msg.getHeader('Content-Type')) self.sendMessage(echo) class SwitchboardFactory(ClientFactory): protocol = Switchboard def __init__(self, notification, userHandle, person, key, sessionID='', message=''): self.notification = notification self.userHandle = userHandle self.person = person self.key = key self.sessionID = sessionID self.message = message def buildProtocol(self,addr): p = self.protocol(self.notification, self.userHandle, self.person, self.key, self.sessionID, self.message) if self.sessionID: p.reply = 1 return p class Dispatch(msn.DispatchClient): def __init__(self): msn.DispatchClient.__init__(self) self.userHandle = USER_HANDLE def gotNotificationReferral(self, host, port): self.transport.loseConnection() reactor.connectTCP(host, port, _createNotificationFac()) class Notification(msn.NotificationClient): def loginFailure(self, message): print 'Login failure:', message def listSynchronized(self, *args): contactList = self.factory.contacts print 'Contact list has been synchronized, number of contacts = %s' % len(contactList.getContacts()) for contact in contactList.getContacts().values(): if not contact.lists & msn.REVERSE_LIST: '''不能在这里立即调用 promptRemovedMe 进行清除.. 否则会导致帐户进入一个奇怪的状态..''' print 'WARNING: %s remove me' % contact.userHandle continue print 'Contact: %s' % (contact.screenName,) print ' email: %s' % (contact.userHandle,) print ' groups:' for group in contact.groups: print ' - %s' % contactList.groups[group] print #检查自己不在线期间有谁添加自己进入 FORWARD_LIST? for contact in contactList.getReverseContacts().values(): if not contact.lists & msn.FORWARD_LIST: self.promptAddedMe(contact.userHandle, contact.screenName) def promptRemovedMe(self, userHandle): print userHandle, "REMOVE ME!" self.remContact(msn.ALLOW_LIST, userHandle) self.remContact(msn.FORWARD_LIST, userHandle) def promptAddedMe(self, userHandle, screenName): print userHandle, screenName, "ADD ME!" self.addContact(msn.ALLOW_LIST, userHandle) self.addContact(msn.FORWARD_LIST, userHandle) def userRemovedMe(self, userHandle, listVersion): '''重载 userRemovedMe ''' msn.NotificationClient.userRemovedMe(self, userHandle, listVersion) self.promptRemovedMe(userHandle) def userAddedMe(self, userHandle, screenName, listVersion): '''重载 userAddedMe ''' msn.NotificationClient.userAddedMe(self, userHandle, screenName, listVersion) self.promptAddedMe(userHandle, screenName) def gotSwitchboardInvitation(self, sessionID, host, port, key, userHandle, screenName): print '%s(%s) send a invitaion ...' % (userHandle, screenName) factory = SwitchboardFactory(self, userHandle, screenName, key, sessionID) print 'connect to %s:%d' % (host, port) print 'key => %s; sessionID => %d' % (key, sessionID) reactor.connectTCP(host, port, factory) def gotMessage(self, message): cTypes = [s.lstrip() for s in message.getHeader('Content-Type').split(';')] if 'text/x-msmsgsinitialemailnotification' in cTypes: print 'Hotmail Info ->', message.message.split('\r\n')[0] print def lineReceived(self, line): print line.decode('UTF-8').encode(default_locale[1]) msn.MSNEventBase.lineReceived(self, line) def handle_LST(self, params): print params msn.NotificationClient.handle_LST(self, params) if __name__ == '__main__': USER_HANDLE = raw_input("Email (passport): ") PASSWORD = getpass.getpass() log.startLogging(sys.stdout) default_locale = locale.getdefaultlocale() _dummy_fac = ClientFactory() _dummy_fac.protocol = Dispatch reactor.connectTCP('messenger.hotmail.com', 1863, _dummy_fac) reactor.run()