Отправка сообщений в Jabber

Суббота, Март 20, 2010 г.
Я думаю, многие знакомы с Jabber (xmpp). Я не буду в рамках этой статьи описывать многочисленные достоинства этого протокола. Вряд ли у меня получиться лучше чем в других более популярных источниках. Давайте лучше на простом примере попробуем разобраться с отправкой сообщений на произвольный jid с программы на языке python.
Некоторые могут задаться вопросом: "А зачем это нужно?". Я использую это решение для отправки отчётов себе на jid из разных программ автоматически выполняющих какие либо действия. Возможно кто-то найдёт другие применения, но это уже не столь важно. Главное создать работающий код.
В языке python для работы с xmpp есть одноимённая библиотека xmpp. Подключим её стандартным способом, а также другие которые нам понядобятся для работы.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import xmpp
import time

Основной код оформим в виде функции, аргументами которой будут jid получателя и сам текст сообщения.

def jsend(toJID, text):
    """Отправка сообщений на jid - jsend(toJID, text)"""

Это необходимо для того, чтобы данный код можно было использовать не только как самостоятельную программу, но и подключать в виде библиотеки. Далее нам необходимо определить jid от имени которого будут отправляться сообщения. Я для этой цели зарегистрировал отдельный, специально для рассылки уведомлений. Указываем jid и пароль к нему.
    fromJID = 'piggy@support-pc.ru'
    password = '********'

Создаём подключение, или выходим из программы с ошибкой если подключиться к серверу не удалось.
    fromJID = xmpp.protocol.JID(fromJID)
    client = xmpp.Client(fromJID.getDomain(),debug=[])

    conn = client.connect()
    if not conn:
        sys.exit(1)

Далее пробуем авторизироваться, и также выходим в случае неудачи.
    auth = client.auth(fromJID.getNode(), password, resource=fromJID.getResource())
    if not auth:
        sys.exit(1)

Отправляем сообщение.
    mesID = client.send(xmpp.protocol.Message(toJID, text))

    time.sleep(1)
    client.disconnect()
    
    return mesID

Закрываем соединение после короткого ожидания, необходимого для того чтобы сообщение успело уйти до закрытия. Возвращаем из функции id сообщения.
    time.sleep(1)
    client.disconnect()
    
    return mesID

Дальнейший код отработает только если использовать этот скрипт как самостоятельную программу. При запуске jid назначения и само сообщение будут передаваться в виде аргументов. Получим абсолютный путь до скрипта для вывода подсказки к использованию, если он был запущен без необходимых аргументов.
if __name__ == "__main__":
    
    name = os.path.basename(sys.argv[0])

    if len(sys.argv) < 2:
        print name+" JID сообщение"
        sys.exit(0)

Если количество аргументов 2 и более то получаем jid назначения из первого, а само сообщение из последующих. Для удобства реализуем возможность брать текст сообщения из стандартного вывода, для этого в качестве второго аргумента передадим символ '-'.
    toJID = sys.argv[1]
    if sys.argv[2] == '-':
        text = sys.stdin.read()
    else:
        text = ' '.join(sys.argv[2:])

Теперь когда у нас есть необходимые для отправки данные вызовем функцию.
    jsend(toJID, text)

Работа со скриптом как с подключаемой библиотекой также проста. Скрипт должен находится в одной директории с вызываемой программой. Подключаем файл, импортируем функцию и используем её.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from jabbersender import jsend #jabbersender.py имя файла с кодом описанным выше

jid = 'vasya@support-pc.ru'
mess = 'Привет Вася!!!'
jsend(jid, mess)


А вот и сам скрипт.
Теги: PythonJabberxmpp
 
   
Комментарии (1)
Александр
13.03.2012 в 15:02
Не плохая статья, но хотел спросить, а можно ли как нибудь сделать авторизацию на pidgin? Роюсь в интернете найти не могу ничего толкового.
Оставить комментарий   Нажмите, чтобы отменить ответ.
Доступен html впределах разумного. Для цитирования используйте <blockquote></blockquote>, для отрисовки программного кода [code][/code].
Для всяких хакеров и прочих: комментарии проходят санитизацию, всё лишнее будет вырезано. Так что не тратьте своё драгоценное время.
Имя (обязательно)
E-Mail (Не будет опубликован , обязательно)
Сайт (необязательно)