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);
?>
