查看文章 |
[创亿无限]关于可定制的im机器人的想法
2008-04-15 22:53
目前有一些网站推出了一些im机器人 比如注明的twitter和国内的饭否之类的网站 当然这个不是我的重点 我说的是一些提供msn和gtalk群服务器的 像小i什么的 我想靠网站自身并不能完全服务大众的需求 何况现在还有这种或那种的小众群体 需求各不相同 网站没有精力 也没有必要专门为他们去开发应用 但是需求总是要满足的 如果网站自身不想动手服务 那完全可以把任务放出去 由用户自己定制 因为开放api已经成了流行 当然我本身也是支持开放api的 开放api能最大限度的服务大众 能更 大程度的满足一些小众的需求 比如许多程序员 完全有能力利用api来进行二次开发 具体到im机器人这块 因为运行im机器人需要服务器的 而且需要24小时不间断的在线的 还有就是 贷宽问题 如果是个人pc运行自己做的机器人 经常不在线不说 带宽也很低 无法响应更多的用户 基于此 我提出了可定制的im机器人的想法 具体是 提供服务的网站提供im机器人账户 或者msn 或gtalk 或any other im的机器人 开发者可以 注册一个自己专有的im机器人 可以在线配置机器人运行的时间段 签名 等等静态的东西 然后 开发者自己写一个hook 事件的列表 机器人接受到用户输入的信息后 用自己的hook事件 列表去匹配用户输入的信息 如果符合 那就触发扩展命令 由于直接让用户上载自己的程序有很 大的安全问题 因此我的设计是 让 每个 hook事件对应一个web地址 这个地址是用户的web程序地址 可以是各种动态语言的地址 比如 php perl python什么的 当触发hook事件后 比如我的规则文件里写着 /help http://xxx.com/xx.php 意思是如果用户输入了/help 那么运行机器人的那台服务器访问http://xxx.com/xx.php 在这里 机器人所在的服务器 设其名字为 A 而我的http://xxx.com/xx.php这里的php程序设其名字 为B A用post方法访问B,提交一个xml字符串 里面包含一些环境信息 比如 <用户账户>提交请求的用户名,即与机器人对话的用户名</用户账户> <用户昵称>同上用户的昵称</用户昵称> <用户签名>同上用户的签名</用户签名> <用户输入信息>同上用户输入的信息</用户输入信息> 基本上im机器人获取的有用信息也就这几个了有用的了 当然具体传送还可以再商榷 而我的B程序根据这传来的信息 进行分析后 做一些处理 比如我这个示范的是 /help 那么我可以返回一个信息给A <do> <to>要发送的用户,这里自然是刚才那个与机器人对话的用户了</to> <msg>返回信息,这里可以返回一些帮助命令之类的信息</msg> </do> 当然还有一些对机器人的命令 比如 用户usr1想通过机器人中转给用户usr2发送一条信息 他对机器人输入 /msg user2@xxx.com 测试信息 这里要分两步处理了 首先A根据触发规则访问B B分析出这个是一个/msg命令(也许有bt的人一个命令对应一个页面 那就不用分析了)这个命令必须 回复给机器人两个指令信息 <system> <add>usr2的账户</add> <system> <do> <to>usr2</to> <msg>测试信息</msg> <to>usr1</to> <msg>您的用户已发往usr2</msg> </do> 这种是纯xml的实现 add是系统命令要求机器人加usr2为好友 然后给usr2发送信息 再然后给usr1返回信息 告诉他已经发送成功了 但是有个问题 就是如果usr2不在线呢 而且他加好友要求是通过以后才能发信息给他 这个就比较麻烦 靠纯xml没法解决 我想可以用两种办法解决 一种是增加session功能 当然based on xml的 就是允许程序B向机器人返回指令 并且机器人知道这是一个连续的过程 这样程序向机器人发挥的指令 查询 账户上是否有这个usr2 如果没有 就加好友 加好友成功后 机器人再次访问程序B 告诉他 已经加过好友啦 然后程序B再返回命令 要求机器人发送信息给usr2 以后发送信息给usr1告诉他成功了 另外一种解决办法是机器人所在的服务器提供公用的web api 程序B可以给那个web api发送一段xml <账户>xxx@xx.com</账户> <密码>加密过的密码</密码> <发送信息> <to>usr2的账户</to> <msg>测试信息</msg> </发送信息> 这段意思是提交自己的账户和密码通过验证后 要求服务器给指定的用户usr2发送一段信息 文本是 测试信息 服务器也返回一段xml 无非是成功或者失败 失败了给出原因 然后程序B根据这返回的提示信息给机器人返回指令 要求他发送信息给 usr1 告诉他成功或者失败 为何要使用服务器上的web api呢? 首先一个机器人账户上能添加的好友总是有上限的 但是用户的需求总是大大超过的 如果用机器人账户去添加好友 首要问题是 当好友数达到上限了怎么办? 而服务器运行了这么多机器人 他自然也维持了一个机器人的好友列表 因此他掌握的好友数远远比单个机器人的要多得多 而且重要的是 他知道哪个人在哪个机器人的好友里 他可以根据你要发送的用户帐户来调用相应的机器人给其发送信息 当然 其他操作也是可以的 而且使用服务器上的web api是一次性的 不需要session实现 这样设计也简单 负载也小多了 基本思路也就说到这里了 具体实现还可以继续探讨 其实im也就是个io而已 你可以把它看作一个终端 就如pda一样 他面向用户能做的就是接受信息 返回信息 也及时 in/out了 而我这个思路是把im的接受信息抓接为附加了特定信息的web访问 然后把返回的信息经过特定处理后返回给用户 因此你也可以把这个im机器人或者im本身当作一个特殊的web代理 经常有web代理给http请求附加一些标志头 这个也是差不多 只不过更特殊点罢了 选择web空间的理由是 web空间也可以24小时在线的 因为服务器是别人托管的 另外web空间各处都有 价格便宜 免费的也n多 而且web空间还可以被另外的人浏览到 很好 |
最近读者: