Twisted - Событийно-ориентированный сетевой фреймворк
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-сервера
1 # Эти модули понадобятся.
2 from twisted.words.protocols.jabber import client, jid, xmlstream
3 from twisted.words.xish import domish
4 from twisted.internet import reactor
5
6 # Для JID-а используем специальный Twisted-класс
7 me = jid.JID("greutly@swissjabber.ch/TwistedWords")
8
9 # Так как бот -- это клиентское приложение, то и factory (см глоссарий)
10 # тоже будет клиентским. Библиотека twisted.words.protocols.jabber.client
11 # предоставляет класс для создания factory Jabber-клиентов.
12 factory = client.basicClientFactory(me, "password")
13
14 # FSM полностью строится на callback-ах. Ждать нельзя. Поэтому писать
15 # что-то вроде "открыть сокет, подождать ответ, послать логин/пароль,
16 # подождать и т.д." тоже нельзя. Для того, чтобы выполнить какие-то
17 # определенные действия после авторизации, необходимо создать callback:
18 def authd(xmlstream):
19 # создание XML элемента presence.
20 presence = domish.Element(('jabber:client', 'presence'))
21 presence.addElement('status').addContent('Online')
22
23 # отправка в xmlstream. Обратите внимание, что это безопасная отправка,
24 # так как эта функция вызывалась из главного цикла и в данный момент мы
25 # единственные, кто сейчас работает с потоком. Остальные, если есть, ждут.
26 xmlstream.send(presence)
27
28 # Установка обработчика на входящие XML-элементы message. Первый
29 # параметр -- это XPath
30 xmlstream.addObserver('/message', gotMessage)
31
32 # сам обработчик. параметр message -- XML-элемент
33 # основная функция обработчика -- печатать то, что
34 # пришло.
35 def gotMessage(message):
36 # sorry for the str(), makes unicode happy
37 print u"from: %s" % message["from"]
38 for e in message.elements():
39 if e.name == "body":
40 print unicode(str(e))
41 break
42
43 # Теперь регистрация callback-а authd.
44 factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, authd)
45
46 # И последнее:
47 # Создание главного реактора для клиентского TCP соединения
48 reactor.connectTCP("swissjabber.ch", 5222, factory)
49 # Запуск реактора
50 reactor.run()