= Twisted - Событийно-ориентированный сетевой фреймворк = [[http://twistedmatrix.com/trac/|Twisted]] - это событийно-ориентированный сетевой фреймворк, написанный на Python и лицензированный по MIT License. Проекты на Twisted могут поддерживать TCP, UDP, SSL/TLS, IP Multicast, Unix domain sockets, большое количество протоколов включая HTTP, XMPP, NNTP, IMAP, SSH, IRC, FTP и другие. Twisted основан на парадигме событийно-ориентированного программирования, и это значит, что пользователи Twisted пишут небольшие программы обратного вызова, которые вызываются фреймворком. Но работа Twisted не ограничивается только сетью. Этот фреймворк облегчает создание расширяемых с помощью плагинов программ, конструирование многосервисных программ, создание единой авторизации пользователей между сервисами и многое другое. '''Пример простого бота для Jabber-сервера''' {{{#!highlight python # Эти модули понадобятся. from twisted.words.protocols.jabber import client, jid, xmlstream from twisted.words.xish import domish from twisted.internet import reactor # Для JID-а используем специальный Twisted-класс me = jid.JID("greutly@swissjabber.ch/TwistedWords") # Так как бот -- это клиентское приложение, то и factory (см глоссарий) # тоже будет клиентским. Библиотека twisted.words.protocols.jabber.client # предоставляет класс для создания factory Jabber-клиентов. factory = client.basicClientFactory(me, "password") # FSM полностью строится на callback-ах. Ждать нельзя. Поэтому писать # что-то вроде "открыть сокет, подождать ответ, послать логин/пароль, # подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то # определенные действия после авторизации, необходимо создать callback: def authd(xmlstream): # создание XML элемента presence. presence = domish.Element(('jabber:client', 'presence')) presence.addElement('status').addContent('Online') # отправка в xmlstream. Обратите внимание, что это безопасная отправка, # так как эта функция вызывалась из главного цикла и в данный момент мы # единственные, кто сейчас работает с потоком. Остальные, если есть, ждут. xmlstream.send(presence) # Установка обработчика на входящие XML-элементы message. Первый # параметр -- это XPath xmlstream.addObserver('/message', gotMessage) # сам обработчик. параметр message -- XML-элемент # основная функция обработчика -- печатать то, что # пришло. def gotMessage(message): # sorry for the str(), makes unicode happy print u"from: %s" % message["from"] for e in message.elements(): if e.name == "body": print unicode(str(e)) break # Теперь регистрация callback-а authd. factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, authd) # И последнее: # Создание главного реактора для клиентского TCP соединения reactor.connectTCP("swissjabber.ch", 5222, factory) # Запуск реактора reactor.run() }}}