WDK集成示例

取自 WDKdoc

跳转到: 导航, 搜索

本站提供一个集成WDK站内聊天功能的最小演示系统,本演示系统功能是:

  • 为所有访问本demo站点的用户自动分配用户名和ID
  • 列出当前站内所有在线用户,即目前打开demo网站页面的用户,并在用户名旁边显示“与我聊天按钮”
  • 找到想要聊天的对象,点击“与我聊天按钮”按钮,弹出聊天窗口,发送消息
  • 接受方会直接弹出聊天窗口,如果窗口被浏览器阻止,会在页面内弹出提示窗口,用户点击“接受”后弹出聊天窗口,双方开始即时互通

demo网站下载地址:[wdk集成demo]

目录

[编辑] demo文件说明

imconfig.inc.php:与WDK集成相关的配置参数 imwebchat.php:一对一聊天页面 imxml.php:为WDK服务器提供查询服务,接口文件 imkeeponline.php:保持网站用户打开页面后处于在线状态,用户页面会定时访问该文件 getonlineuser.php:demo网站主页面,显示站内在线用户,将Presence功能嵌入用户前台页面,提供一对一聊天的进入链接;

[编辑] imconfig.inc.php

 //根据WDK提供的网站ID修改此配置
 $im_siteid = "wdk_demo";
 $im_keeponline_url = "http://localhost/wdk_site/wdkroom/imkeeponline.php";
 $im_keeponline_time = 30;
 //--------------以下配置无需修改-----------------
 $im_wdkresource_server = "wdkdown1.meebo.com.cn";
 $im_wdkcomm_server = "wdkserver2.meebo.com.cn";
 $im_presenceflash_url = "http://".$im_wdkresource_server."/impresence.swf";
 $im_buddyflash_url = "http://".$im_wdkresource_server."/imbuddylist.swf";
 $im_chatflash_url = "http://".$im_wdkresource_server."/imwebchat.swf";
 $im_imfunction_js = "http://".$im_wdkresource_server."/imfunction.js";
 $im_promptwindow_js = "http://".$im_wdkresource_server."/promptwindow.js";
 $im_openwindow_js = "http://".$im_wdkresource_server."/openimwindow.js";
 $im_flashobject_js = "http://".$im_wdkresource_server."/flashobject.js";
 $im_buddylistserver = "rtmp://".$im_wdkcomm_server."/flashIM";
 $im_webchatserver = "rtmp://".$im_wdkcomm_server."/freechat";

[编辑] imwebchat.php

关键代码如下,在Body标签里嵌入imwebchat为id的Div,嵌入相关脚本,嵌入聊天Flash:

   <script src="<?php echo($im_promptwindow_js); ?>" type="text/javascript"></script>
  	<script src="<?php echo($im_flashobject_js); ?>" type="text/javascript"></script>
 	<script type="text/javascript">
          var flashobj = new FlashObject("<? echo $im_buddyflash_url; ?>", "webchatflash", "100%", "100%", "9", "#ffffff", false, "best");
          flashobj.addParam("scale", "noscale");
          flashobj.addParam("menu", "false");
          flashobj.addParam("salign", "LT");
          flashobj.addParam("allowScriptAccess", "always");
          flashobj.addParam("wmode", "Window");
          flashobj.addVariable("sessionid", "demosid");
          flashobj.addVariable("userid", "<?php echo($uid); ?>");
          flashobj.addVariable("username", "<?php echo($username); ?>" );
          flashobj.addVariable("mytitle", "<?php echo(($titleparam)); ?>" );
          flashobj.addVariable("siteid", "<?php echo($im_siteid); ?>" );
          flashobj.addVariable("destuid", "<?php echo($destuid); ?>" );
          flashobj.addVariable("destnick", "<?php echo($destnick); ?>" );
          flashobj.addVariable("buddyserver", "<?php echo(urlencode($im_buddylistserver)); ?>" );
          flashobj.addVariable("chatserver", "<?php echo(urlencode($im_webchatserver)); ?>" );
          flashobj.write("imwebchat");
   var promptwindow = new PromptWindow();
   promptwindow.init();
   window.onbeforeunload = function(){
      var flashobj = document.getElementById("webchatflash");
   	 if(flashobj && flashobj.closeTTW){
   	 	   //alert("closeTTW");
   	 	   flashobj.closeTTW();
   	 }
   }
   </script>

[编辑] imxml.php

   header( "Content-Type: text/xml; charset=utf-8" );
   echo( "<?xml version='1.0' encoding='utf-8'?>" );
   echo( "<imxml>" );
   $querytype = isset($_GET['query']) ? $_GET['query'] : null;
   $querysid = isset($_GET['sid']) ? $_GET['sid'] : null;
   $queryusername = isset($_GET['username']) ? $_GET['username'] : null;  
   $queryuserid = isset($_GET['uid']) ? $_GET['uid'] : null; 
   if(!$querytype){
       echo( "<error>no valid query param</error>" );
       echo( "</imxml>" );   
       return;
   };
   //imxml.php需要支持如下积累查询
   switch($querytype){
       case "login":
           getLogin($querysid, $queryuserid);
           break;
       case "buddylist":
           getBuddyList($querysid, $queryuserid);
           break;
       case "siteprofile":
           getSiteProfile();
           break;
       case "userprofile":
           getUserProfile($queryuserid, $querysid);
           break;
       default:
           echo( "<error>query param is not valide</error>" ); 
   }
   //获取网站的WDK配置,具体每个参数含义见WDK接口说明
   function getSiteProfile(){ 
       echo( "<allowCalls>setBlockedStatus,sendConnectionList,startConversation</allowCalls>" );
       echo( "<characterlimit>200</characterlimit>" );
       echo( "<forbiddenwordslist>ass,bitch</forbiddenwordslist>" );
       echo( "<maxvideobandwidth>20000</maxvideobandwidth>" );
       echo( "<domainlogolarge>".DISCUZ_ROOT."/images/logo.gif</domainlogolarge>" );
   }
   //获取用户个人信息
   function getUserProfile($queryuserid, $querysid){   
   	 $pos = strrpos($_SERVER['REQUEST_URI'], '/');
      if($pos>=0){
      	  $iconurl = substr($_SERVER['REQUEST_URI'], 0, $pos)."/default.PNG"; 
      	  if($_SERVER["SERVER_PORT"]=="80"){
      	 	   $iconurl = 'http://'.$_SERVER['SERVER_NAME'].$iconurl;
      	 	}
      	  else{
      	     $iconurl = 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$iconurl;
      	  }
      }
      else
          $iconurl = 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].'/default.PNG';
       echo "<userprofile>";
           echo "<uid>".$queryuserid."</uid>";
           echo "<name>用户".$queryuserid."</name>";
           echo "<nick>用户".$queryuserid."</nick>"; 
           echo "<icon>".$iconurl."</icon>"; 
           echo "<usergroup>".iconv("GBK","UTF-8",$usergroup)."</usergroup>"; 
       echo "</userprofile>";
   }
   //判断用户uid和sessionid是否有效,如果有效则WDK服务器认为该用户已经登陆合作网站,否则认为用户未登录
   function  getLogin($querysid, $queryuid){
      echo "<sessionvalide>true</sessionvalide>";  
      return true;
   }
   //判断用户的好友列表
   function getBuddyList($querysid, $queryuid) {
       echo "<buddylist>";
       echo "</buddylist>";
   }
  echo( "</imxml>" );

[编辑] getonlineuser.php

实现原理如下:

  • 为所有访问本演示网站的用户自动分配ID和用户名,信息存储在session中;
  • 为演示方便,不依赖于数据库或其他第三方库,用户简单部署后即可运行测试,采用了文件缓存方式来存储所有在线用户的信息,缓存库采用Cache_Lite 1.7.1版;
  • 每个用户访问页面时,查看Session数据中是否有用户数据,如果没有则随机分配一个ID号和用户名给该用户,并存入Session数据中;
  • 每次用户访问页面,存入该用户的访问时间,用于判断是否超时
  • 枚举缓存的用户列表,如果用户仍然在线,则显示"与我聊天"按钮,否则从缓存中删除该用户
  
  <?php
  //引用Cache_Lite缓存库
  require_once('Cache/Lite.php');
  //引用imconfig.inc.php有关WDK的配置参数
  require_once 'imconfig.inc.php';
  session_start();
  //如果访问用户没有Session数据,则分配ID和用户名
  if(!$_SESSION['username'] || strlen($_SESSION['username'])<=0){
      $chose="0123456789";
      $username = "0000";
      for($i=0; $i<4; $i++){
          $rand = rand(0, 9);
          $username[$i] = $chose[$rand];
      }
      $_SESSION['uid'] = $username;
      $_SESSION['username'] = "用户".$username;
  }
  if(empty($_SESSION['username'])){
    die("session 无效!");
  }
  $myuid = $_SESSION['uid'];
  $myusername = $_SESSION['username'];
  $now=time();
  //设置缓存参数,缓存目录为当前目录下tmp,请保证tmp目录可读写,缓存时间设为1天
  $options = array(
      'automaticSerialization' => 'true',
      'cacheDir' => './tmp/',
      'lifeTime' => 216000
  );
  $catchid = "onlineuserscache";
  $Cache_Lite = new Cache_Lite($options);
  if($usersdata = $Cache_Lite->get($catchid)) {//找到缓存对象,则从其中查找访问者数据
      if(isset($usersdata[$myuid])){//如果找到访问者ID对应的缓存数据,则更新访问时间参数
          $usersdata[$myuid]["updatetime"] = $now;
      }
      else{//如果没有找到访问者ID对应的缓存数据,则生成该用户数据,放入缓存
          $usersdata[$myuid] = array();
          $usersdata[$myuid]["uid"] = $myuid;
          $usersdata[$myuid]["username"] = $myusername;
          $usersdata[$myuid]["createtime"] = $now;
          $usersdata[$myuid]["updatetime"] = $now;
          $usersdata[$myuid]["userip"] = $_SERVER["REMOTE_ADDR"];
      }
  }else { //没有找到缓存数据,则生成缓存对象
    $usersdata = array();
    $usersdata[$myuid] = array();
    $usersdata[$myuid]["uid"] = $myuid;
    $usersdata[$myuid]["username"] = $myusername;
    $usersdata[$myuid]["createtime"] = $now;
    $usersdata[$myuid]["updatetime"] = $now;
    $usersdata[$myuid]["userip"] = $_SERVER["REMOTE_ADDR"];
  }
  ?>
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
  <title>WDK Room页面内一对一聊天演示</title>
  </head>
  <body>
  <!--在前台页面内加入WDK功能所需脚本的三个脚本文件,-->
  <script type="text/javascript" src="<?php echo($im_imfunction_js); ?>"></script>
  <script type="text/javascript" src="<?php echo($im_promptwindow_js); ?>"></script>
  <script type="text/javascript" src="<?php echo($im_openwindow_js); ?>"></script>
  <!--调用im_runPresence函数,访问者页面连接到WDK服务器,用户在WDK系统中处于在线状态,可以接受其他用户发送过来的消息-->
  <script language="javascript" type="text/javascript">
  	  <?php echo "im_runPresence('$im_presenceflash_url', '$im_siteid', '$myuid', '$myusername', 'asdfgh', '$im_buddylistserver', 'imwebchat.php', '$im_keeponline_url', $im_keeponline_time);";?>
  	  var promptwindow = new PromptWindow();
      promptwindow.init(); 
  </script>
  <center style="font-size:14px; ">演示网站当前有<?php echo(count($usersdata)); ?>个用户在线
  <?php
   if(count($usersdata)==1)
      echo ",请邀请您的朋友访问此页面,即可尝试一对一聊天。";
  ?>
  </center><br/>  
  <div style="text-align:center">
  <?php  
     //枚举当前站内所有用户列表
     foreach ($usersdata as $key => $userdata) {
     	 if($userdata["updatetime"]+$im_keeponline_time<$now){//删除已经掉线的用户
     	    unset($array[$key]);
     	 }
     	 else{//在先用户如果不是本人,则显示跟我聊天按钮
         $uid =   $key;
         $username =   $userdata['username'];
         $usernameencode =   urlencode($userdata['username']);
         $usernameencode = $username;
         echo "$username  ";
         if($username==$myusername)
            echo "(本人)  <br/>";
         else
            echo "<a class=\"bold\" align=\"right\" style=\"color: #0000ff; text-align:right; \" href=\"imwebchat.php?destuid=$uid&destnick=$usernameencode\" target=\"_blank\" onClick=\"javascript:  im_openWebChat('$uid', '$usernameencode'); return false;\">跟我聊天</a> <br/>";
       }
     }    
     //$usersdata = array_values($usersdata);
     //将缓存数据存入文件中
     $Cache_Lite->save($usersdata, $catchid);  
  ?>

个人工具