本文来自依云's Blog,转载请注明。
目录
功能要点
- 自由开放的即时聊天协议。XMPP 服务和邮件服务一样,有服务器就可以搭建,服务器间可以相互通信。世界上有不少免费的 XMPP 服务器(列表、Arch Linux CN、DuckDuckGo)。
- 多人实时文本聊天。因为群组的实现由开发者完成,所以开发者可以附加上各种功能,比如暂时接收消息等。
- 因为是开放的协议,各种平台上都有不少客户端可用:Windows:Miranda IM;Linux/BSD:Pidgin、Empathy、kopete、kde-TelePathy、finch(终端);Android:xabber、jabiru;Mac OS X:Adium 等;Web:jappix。
- 因为是开放的协议,有各种编程语言的程序库,可方便、高效、光明正大地编写新的客户端或者聊天机器人。
一些缺陷
- XMPP 只适合传输文本。图片通常需要手工或者使用客户端插件贴到图床上,以链接的方式分享。
- 这是一个通过机器人(由程序控制的聊天客户端)模拟的群组。查看群成员信息等需要向群里发送特殊的命令。
- 暂不支持富文本(HTML)消息。这意味着你消息中的颜色、字体变化不会呈现给其他人。同时也意味着带链接的文本无法正常传输。通常,客户端会把链接地址写在相应的文本之后。不幸的是,从诸如维基百科直接复制的富文本包含大量链接,在「纯文本」化后的文本相当混乱。因此,多于一个的这样的链接会被 xmpptalk 去除。
- 群管理命令尚不完善,比如添加管理员需要直接修改数据库。
- 搭建过程比较麻烦和山寨。
- 目前仅支持在 Linux 系统上运行。
关于 Google Talk 及 Hangout
- Google Talk(Gtalk)是由 Google 公司提供的带自己的修改的 XMPP 服务,以及其 Windows 客户端和 Gmail 中内嵌聊天工具。它可以与 XMPP 群等通常使用非 Google 服务器的用户通讯
- Google Hangout (中文称「环聊」)是最近 Google 在配合 Google+ 服务推出的一种即时聊天服务,有 Google+ 网页版、Gmail 内嵌版(新版)、Android 客户端、iOS 客户端等。Hangout 不是 XMPP 服务。非 Google 用户能够看到使用 Hangout 在线的用户,但是发送的消息不会被 Hangout 接收到,只有当用户使用 XMPP 客户端登录时才能收到这些消息(如果用户没有禁用消息历史记录的话)。Google 用户之间发送的离线消息只会在 Hangout 和 Gmail 的聊天记录中出现,即使双方都使用 XMPP 客户端登录也不会收到这些离线消息。
- 「环聊」的意思就是,Google 画了个圈,圈子里边的 Google 用户才能够如预期地相互通信。「Hangout」的意思是,把不愿意使用 Hangout 的用户都「挂出去」,不缠他们玩儿了。
关于 Google 的 XMPP 服务的注意事项
- Google Apps 域名只能使用 Google 提供的 XMPP 服务。另建的 XMPP 服务会被 Google 拒绝建立服务器间连接。
- Google Apps 域名关于 XMPP 服务的设置页只说明了服务器间通讯(s2s)的 DNS 设置,缺乏 XMPP 客户端所需要的 DNS 设置。
- Google 的 XMPP 服务的设计目的是给人用的,不是给机器人用的。如果一个帐号在短时间内向单一联系人发送大量消息(上次测定是一分钟15条以上),那么之后的消息会被忽略。过一段时间后恢复。如果消息中包含链接或者「@」符号(邮件地址会包含的字符),那么限制更加严格,一分钟内只能外发几十条这样的消息(向任何数量的目标)。
- Google 的 XMPP 服务不允许用户向未订阅用户(互加好友的用户)发送消息。而一般 XMPP 服务允许此类消息,就像你有了对方的邮件地址就可以向其发送邮件一样。
- Google Talk 软件的「Remove」操作仅仅从好友列表中移除好友,并不会向对方发送取消订阅的消息。所以,Google Talk 用户在退出 xmpptalk 群时请使用专门的「-quit」命令。
- Google Talk 105 及以上版本(包括从官网下载的中文版、通过升级得到的中文版)实质使用的是 HTTP 协议明文传输数据。Google Talk 104 版本才会真正地使用加密版的 XMPP 协议。
搭建前的准备工作
- 需要一个给群机器人使用的 XMPP 帐号。基于已述的理由,强烈反对使用 Google 帐号搭建 XMPP 群。如果有自己的服务器,可自行搭建。推荐的 XMPP 服务端软件是 Prosody。
- 需要一个长期在线的服务器或者 VPS。此服务器不需要能够响应外网请求。至少 50M 的空闲内存,以及约几百兆的磁盘空间。
软件安装
暴力安装法
运行 xmpptalk 中的scripts/quickinstall.sh
即可。如果它没有中途出错而停下的话就恭喜你了!需要 root 权限,会从官方下载源码编译安装,东西会全部往/usr/local
下装。不喜勿用,仅作参考。
MongoDB
MongoDB 是 xmpptalk 所使用的数据库。从软件源或者官方下载安装即可。
如果是从官方直接下载的,其配置可参考scripts/mongodb.conf.example
文件。给mongod
传递--fork
参数作为服务在后台运行,传递--repair
参数来从非正常关闭中恢复。
Python 及相关库
xmpptalk 需要 Python 3.2 或者以上版本。如果软件源中没有合适的版本,可从源码安装。编译方式可参考scripts/quick_install.sh
脚本。
xmpptalk 依赖以下 Python 库。如果是手动安装,请使用准备运行 xmpptalk 的那个版本的 Python 来安装。注意手工安装的 Python 的话,你需要首先安装 distribute。手工安装时,可通过 easy_install(-3.2/-3.3) 来安装,也可手工安装。
- pyxmpp2
- dnspython
- pymongo
- mongokit
比如:
easy_install-3.3 pyxmpp2 easy_install-3.3 dnspython easy_install-3.3 pymongo easy_install-3.3 mongokit
MongoKit 不支持 Python 3,但是可以通过2to3
程序来转换。在其安装目录执行2to3 -w .
命令即可。例如:
dir=$(python3 -c 'import imp; print(imp.find_module("mongokit")[1])') cd "$dir" 2to3 -w .
xmpptalk 的安装
xmpptalk 暂时还不支持安装 -_-|||
从仓库取回其源码即可使用。源码主页地址:github, bitbucket, geakit。
直接克隆或者下载:
git clone https://github.com/lilydjwg/xmpptalk.git # 或者 git clone https://geakit.com/lilydjwg/xmpptalk.git # 或者从 github 下载源码包 wget https://github.com/lilydjwg/xmpptalk/tarball/master
配置和运行
请将 xmpptalk 源码中的config.py.example
文件复制为config.py
,然后使用文本编辑器修改。搜索「TODO」字样来寻找你非常可能需要修改的配置项。
在第一次运行前,需要对数据库进行初始化。首先启动 MongoDB,然后运行以下命令(该命令可反复运行,因此如果出错,在修正错误后再次运行即可):
python3 dbman.py
运行 xmpptalk 群。如果你不介意它占据一个终端的话(比如你有 tmux 或者 screen),可直接运行主文件。此种情况你可以看到日志消息,所以第一次运行使用此种方式以确定配置无误:
python3 main.py
如果需要后台运行,只需要加上--fork
参数。
在它运行起来后,你就可以将群(使用你配置的 Jabber ID(JID))添加为好友啦。添加好友后请同意机器人添加你为好友,就会收到欢迎消息了,不需要发送任何额外的消息。让你的朋友们也加入进来吧!
常用命令简介
群使用一些减号「-」开头的字符串来进行一些操作。注意:减号前一定不能有空白字符。不小心忘了这些命令也没关系,大喊一声「help」群就会救你了 :-)
-
-nick XXX
:将你自己在群里的昵称修改为XXX
。直接发送-nick
来查看自己当前的昵称。 -
-online
:有哪些人在线呢? -
-longhelp
:查看完整的命令列表。
彩蛋:
-
test
:测试群和你还能正常通信不(也许你已经掉线了?) -
ping
:类似test
消息,但是同时还会告诉你当前(服务器的)日期和时间。如果暂停接收消息了,此消息会导致暂停状态被取消。
更多的内容就留给读者自行探索吧 ^_^
test@vim-cn.com
这个是 vim-cn 的技术群,讨论 Vim 或者编程技术,或者程序员的喜怒哀乐都可以来的哦 ^_^ (之所以叫「test」,是因为它最开始是 xmpptalk 的测试用群)
Jun 23, 2013 06:58:43 PM
哈哈,我暑假要重构我的 chatlist,要实现很多以前从未有过的功能哦!(比如机器人协议)
Jun 23, 2013 10:27:40 PM
现在突然发现仙子的博文不是全文输出~~
Jun 23, 2013 10:35:31 PM
同发现。我在用 InoReader 阅读器。
Jun 23, 2013 10:56:37 PM
是只有目录么?我觉得这么长放在首页太碍眼了,于是在目录后加了个 <!-- more --> 标记……
Jun 23, 2013 11:01:25 PM
原来如此。我是RSS阅读的,只显示目录部分。
Jun 23, 2013 11:35:11 PM
用的feedly,只有目录部分~~~
Jun 24, 2013 04:38:41 AM
feedbin.me 也是,打开 "view original inline" 才显示出正文,但是目录又没了。
Jun 24, 2013 11:15:34 AM
那个难道是它自己抓取的正文?然后抓取的时候我还没做目录所以就没了?
May 20, 2014 04:28:41 PM
終於看懂此文了,噢耶!
XMPP 比 IRC 還小衆冷門難用。