I am LAZY bones? AN ancient AND boring SITE

2010年 04月 27日 的归档

通过Dbus控制pidgin

介绍两个通过Dbus控制pidgin的例子,为了方便,采用python实现。
第一个例子来自官方文档,代码如下:

#!/usr/bin/env python
 
def my_func(account, sender, message, conversation, flags):
    print sender, "said:", message
 
import dbus, gobject
from dbus.mainloop.glib import DBusGMainLoop
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
 
bus.add_signal_receiver(my_func,
                        dbus_interface="im.pidgin.purple.PurpleInterface",
                        signal_name="ReceivedImMsg")
 
loop = gobject.MainLoop()
loop.run()

这个比较简单,就是监视收到消息的信号,一收到消息就调用 my_func 把发送者和消息体打印出来。

另一个是我自己写的,目的是放到crontab里,每天定时通过鸡脱壳给某人发送一句话,哈哈,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import dbus, gobject
bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")
 
for account in purple.PurpleAccountsGetAllActive():
    if '我自己的GTalk' == purple.PurpleAccountGetUsername(account):
        conv = purple.PurpleConversationNew(1, account, '对方的GTalk')
        purple.PurpleConvImSend(purple.PurpleConvIm(conv), u"要发送的内容")

大致就是:首先在pidgin的活动账户里面,找到自己的鸡脱壳的账户ID,然后调用 PurpleConversationNew 建立一个新的对话tab页,再在这个tab页里发送指定消息给某人。也是超简单。

其实pidgin提供的dbus接口非常丰富,丰富到什么程度呢?就是用dfeet打开那方法树的时候,都会觉得很卡,呵呵。看了下,几乎所有在界面能完成的操作都可以通过dbus接口来实现。所以,要折腾的话,还可以折腾出很多复杂的应用来的,比如做个bot什么的,唉,早知道当时就不去搞什么gloox了,直接挂个purple,用dbus就什么都搞定了嘛,还支持xmpp、msn、yahoo等N多协议,多好啊,呵呵~

========20100428 update========
呃,昨天说要把程序放到crontab里定时执行的来着,结果,今天时间到了,一看,却并没有执行成功,手工一执行,又立马成功了。于是就我就纳闷了,google一搜索,马上发现原因了,原来cron里启动的进程和shell里启动的进程,是不在一个dbus session里面的,也就是说 bus = dbus.SessionBus() 就会给报错。再深究其原因,是因为cron启动的进程里面没有 DBUS_SESSION_BUS_ADDRESS 这个环境变量,于是,参照这里的解决办法,X启动的时候,导出这变量到一个文件里,然后cron里启动进程前,source一下这个文件,终于大功告成了,哈哈。