+ -
当前位置:首页 → 问答吧 → 用QQ机器人实现网站与QQ整合方案

用QQ机器人实现网站与QQ整合方案

时间:2010-07-11

来源:互联网

我开发了一个IM机器人平台(目前仅实现了QQ机器人),你可以在这个平台上用你的IM账号运行IM机器人,并通过Web管理这些机器人。

这个机器人平台提供API和事件回调机制。你可以使用API来管理和控制你的机器人,当机器人接收到用户消息等事件发生时,会将事件以HTTP POST的方式通报到你的网站,由你的网站做出进一步处理。

API文档:http://im.jecat.cn/?c=APIDocument
一个简单的PHP网站演示:http://im.jecat.cn/demo

这个项目刚刚完成,还在内测调整中,欢迎参与测试,我期待大家能够基于这个平台开发出各种有趣的功能 :D

作者: alee   发布时间: 2010-07-11

简单的演示代码:

  1. <?php
  2. ignore_user_abort(true) ;  // ignore_user_abort()不是必须的,但可以使你的网站不会因为响应缓慢,漏掉消息处理

  3. //////////////////////////////////////////////////////////////////////////////////////////////////
  4. // description
  5. /*
  6. 这个演示程序实现了以下功能:
  7. 接收用户发送给 im机器人 的消息,将消息简单处理后,在 im 上返回给用户

  8. 部署步骤:
  9. 1、你需要在 http://im.jecat.cn 上建立服务,并添加一个 qq 机器人。
  10. 2、在这个文件中设置好 服务ID/密码 ,上传到你的网站。
  11. 3、将这个文件的url ,做为 im.jecat.cn 服务的“事件接口”。

  12. 处理流程:
  13. 在 im.jecat.cn 平台的管理界面启动机器人后,用另一个账号,加机器人为好友。
  14. 向机器人发送消息,机器人会将消息POST到这个文件。
  15. 在这里接收到消息后,不做处理,简单地将消息原文返回给用户。

  16. */

  17. //////////////////////////////////////////////////////////////////////////////////////////////////
  18. // configure
  19. if(!defined('IMJECATCN_SID'))
  20. {
  21.     define('IMJECATCN_SID','您在im.jecat.cn的服务ID') ;
  22.     define('IMJECATCN_SPWD','您在im.jecat.cn的服务密码') ;
  23.      
  24.     define('IMJECATCN_HOST','im.jecat.cn') ;
  25.     define('IMJECATCN_PORT',80) ;
  26.     define('IMJECATCN_API_BASE','http://'.IMJECATCN_HOST.'/api/?sSId='.IMJECATCN_SID.'&sSPwd='.IMJECATCN_SPWD) ;
  27. }


  28. //////////////////////////////////////////////////////////////////////////////////////////////////
  29. // execute
  30. if( $_REQUEST['sEvent']=='receive_msg' )
  31. {
  32.     if($_REQUEST['sSId']==IMJECATCN_SID and $_REQUEST['sSPwd']==IMJECATCN_SPWD)
  33.     {
  34.         // 通过 qq 发送消息给指定用户
  35.         IM_Post_Data('SendMessage',array(
  36.             'sIM'=>$_REQUEST['sIM'] ,
  37.             'sIMId'=>$_REQUEST['sIMId'] ,
  38.             'sRId'=>$_REQUEST['sRId'] ,
  39.             'sMsg'=>"收到了您的消息:".$_REQUEST['sMsg']
  40.         )) ;
  41.     }
  42.     else  
  43.     {
  44.         echo "service id or password wrong" ;
  45.     }
  46. }
  47. else  
  48. {
  49.     echo "anything to do ... " ;
  50. }


  51. //////////////////////////////////////////////////////////////////////////////////////////////////
  52. // Library
  53. function _im_post_data_make_stream($arrData,$sParentKey=null)
  54. {
  55.     $arrElements = array() ;
  56.     foreach($arrData as $sKey=>$Data)
  57.     {
  58.         $sKey = urlencode($sKey) ;
  59.         if($sParentKey)
  60.         {
  61.             $sKey = "{$sParentKey}%5B{$sKey}%5D" ;
  62.         }

  63.         if( is_array($Data) or is_object($Data) )
  64.         {
  65.             _im_post_data_make_stream($Data,$sKey) ;
  66.         }

  67.         else
  68.         {
  69.             $arrElements[] = $sKey.'='.urlencode(strval($Data)) ;
  70.         }
  71.     }

  72.     return implode('&',$arrElements) ;
  73. }

  74. /**
  75. * 将数据 post 到 im.jecat.cn  
  76. * 如果需要取得 api 的返回结果,使用 file_get_contents
  77. *
  78. * @return    string, bool
  79. */
  80. function im_post_data($sApi,$arrData,$bAsync=true)
  81. {
  82.     if( !isset($arrData['sSId']) )
  83.     {
  84.         $arrData['sSId'] = IMJECATCN_SID ;
  85.     }
  86.     if( !isset($arrData['sSPwd']) )
  87.     {
  88.         $arrData['sSPwd'] = IMJECATCN_SPWD ;
  89.     }
  90.     if($sApi)
  91.     {
  92.      
  93.         $arrData['api'] = $sApi ;
  94.     }
  95.      
  96.     $sBody = _im_post_data_make_stream($arrData) ;

  97.     // header
  98.     $sHttpStream = "POST /api/ HTTP/1.1\r\n" ;
  99.     $sHttpStream.= "Host: im.jecat.cn\r\n" ;
  100.     $sHttpStream.= "User-Agent: imjecatcn-lib\r\n" ;
  101.     $sHttpStream.= "Accept: text/html,application/xhtml+xml,application/xml\r\n" ;
  102.     $sHttpStream.= "Accept-Language: zh-cn,zh\r\n" ;
  103.     $sHttpStream.= "Accept-Charset: utf-8\r\n" ;
  104.     $sHttpStream.= "Connection: close\r\n" ;
  105.     $sHttpStream.= "Content-Length: ".strlen($sBody)."\r\n" ;
  106.     $sHttpStream.= "Content-Type: application/x-www-form-urlencoded\r\n" ;
  107.     $sHttpStream.= "\r\n" ;

  108.     // body
  109.     $sHttpStream.= $sBody ;

  110.     // post
  111.     $nErr = $sErr = 0 ;
  112.     if( !$hSock=fsockopen(IMJECATCN_HOST,IMJECATCN_PORT,$nErr,$sErr,5) )
  113.     {
  114.         // echo "链接 im.jecat.cn 出错" ;
  115.         return false ;
  116.     }

  117.     $nSend=fwrite($hSock, $sHttpStream) ;

  118.      
  119.     // POST 发送完毕,立刻断开,不用等待读取 api 的处理结果
  120.     if($bAsync)
  121.     {
  122.         // 关闭连接
  123.         fclose($hSock);
  124.          
  125.         return true ;
  126.     }
  127.      
  128.     // 同步访问,等待 im.jecat.cn 返回回应
  129.     else
  130.     {
  131.         $sResponse = '' ;
  132.         while(!feof($hSock))
  133.         {
  134.             $sResponse.= fread($hSock,10240) ;
  135.         }
  136.          
  137.         list(,$sHttpBody) = explode("\r\n\r\n",$sResponse,2) ;
  138.         return $sHttpBody ;
  139.     }
  140.      
  141.     return true ;
  142. }
  143. ?>
复制代码

作者: alee   发布时间: 2010-07-11

好东西,不得不顶

作者: solo91   发布时间: 2010-07-11

这个东西 不错。 我试着看看能不能整合一下“围脖”。

作者: php_lw   发布时间: 2010-07-11

看看

作者: fkj   发布时间: 2010-07-11

ignore_user_abort(true) ;

当流程有出错时, 那就只有杀死php进程才可以恢复了, 建议不要使用.

作者: spser   发布时间: 2010-07-12

不错!!!!

作者: wu1990   发布时间: 2010-07-12

那些C语言的文件,也要在自己的服务器上运行起来?

作者: quanhaier   发布时间: 2010-07-12

太牛了呀 膜拜中

作者: niceup   发布时间: 2010-07-12

那些C语言的文件,也要在自己的服务器上运行起来?
quanhaier 发表于 2010-7-12 11:12



如果你有自己的服务器,可以运行在自己的服务器上。没有自己的服务器,可以在 im.jecat.cn 上启动。

作者: alee   发布时间: 2010-07-12

膜拜

作者: lezu   发布时间: 2010-07-12

很不错啊。。

作者: cslgpl   发布时间: 2010-07-12

听起来很神奇.,看看.

作者: kenus   发布时间: 2010-07-12

有意思啊!

作者: naodai   发布时间: 2010-07-14

很强大

作者: lcbzai4   发布时间: 2010-07-14

这个有点意思,,不知道怎么编译的。。楼主是否写个编译过程。。。

作者: kth007   发布时间: 2010-07-14

回复 kth007
编译太简单,根据你的gcc环境,用不同的 makefile 文件make 以下就好了,实在没啥可说的,写教程有点小题大作了,呵呵 。

作者: alee   发布时间: 2010-07-22