关于闲聊么
之前的文章早已有介绍,详见“闲聊么”给你的网站加上一个聊天框。
不过啊,它有一个致命的弱点,必须注册登录才能参与聊天。对于小网站来说,很是鸡肋。一般人看到这么麻烦就放弃参与聊天了。
好在,它提供了一个接入用户体系的API,利用这个API,可以模拟出一个“已登录用户”,以此实现免登录匿名聊天。
接入文档
先仔细研究一下闲聊么的接入文档,这里拿相对简单的移动版接入方式来开刀
要想接入移动版,只需调用以下链接即可:
https://xianliao.me/s/10708?mobile=1&uid={登录用户的ID}&username={登录用户的用户名,需要做URI encode}&avatar={登录用户的头像URL,需要做URI encode}&ts={当前的Linux timestamp}&token={xlm_hash}
其中,ID、用户名、用户名都很好伪造,弄一个数组,然后从中随机抽取即可。
用 PHP 获取 Linux 时间戳也不难,直接使用time()
函数就行。
关键点在于xlm_hash
的合成。
官方给出的xlm_hash
合成方法是这样的:
将字符串 '[网站ID]_[用户ID]_[当前的Linux timestamp]_[SSO密匙]' 用SHA512加密生成
例如:
用户ID为: 1; 现在时刻是: 1481673726; 那么要加密的字符串是:
10708_1_1481673726_TvFfXfTgKJXfoYucFwVqzqU7dwKFnbdL
使用SHA512加密后生成的xlm_hash是:
750825d2ae30419526d47db7bd2f49bd0abdf89f5b2f6591bad5b484e1c9ac56f3a23ac5a521f3eec4e73bfc3aea8d815d7a20964f4eac93dfa44d1e3e975f0e
(注意全为小写)
非常浅显易懂有木有
在 PHP 中,SHA512加密的方法如下:
hash('sha512', '原始字符串')
完整代码
这里随机的用户信息来自第三方 API(https://uinames.com/)用以确保“随机”出来的用户不会产生重复。
为了方面访客在下次打开时还以之前的随机身份参与聊天,可以将生成的用户信息存储到浏览器 COOKIE 中。
完整的代码如下:
<?php
/**
* 将“闲聊么”改造成匿名聊天室
* 作者:孟坤博客
* 原文地址:https://mkblog.cn/1523/
* !!!转载请务必保留以上信息!!!
*/
$web_id = '请在此处填写闲聊么网站 ID'; // 网站ID
$sso_key = '请在此处填写闲聊么网站 SSO_KEY'; // SSO_KEY
/***************************************************************/
// 检测网站ID以及SSO_KEY是否设置
if(!$web_id || !$sso_key) die('请设置网站ID以及SSO_KEY!');
// 获取模拟用户信息
if(isset($_COOKIE['xlm_uid'])) { // 从 COOKIE 中读取到了用户信息
$uid = $_COOKIE['xlm_uid'];
$uname = isset($_COOKIE['xlm_uname'])? $_COOKIE['xlm_uname']: '匿名_'.$uid;
$upic = isset($_COOKIE['xlm_upic'])? $_COOKIE['xlm_upic']: 'https://unsplash.it/100/100?random';
} else {
// 获取随机的用户名、性别、头像等信息(利用第三方 API)
$uinfo = file_get_contents('https://uinames.com/api/?region=england&ext');
$uinfo = json_decode($uinfo, true);
$uname = $uinfo['name'];
$upic = $uinfo['photo'];
$uid = rand(1, 999999999); // 随机生成用户ID
// 存储获取的用户信息到 COOKIE 中
setcookie('xlm_uid', $uid, 0, '/');
setcookie('xlm_uname', $uname, 0, '/');
setcookie('xlm_upic', $upic, 0, '/');
}
// 过滤特殊字符
$uid = urlencode(htmlspecialchars($uid));
$uname = urlencode(htmlspecialchars($uname));
$upic = urlencode(htmlspecialchars($upic));
// 获取时间戳
$time = time();
// 合成 Token
$token = $web_id.'_'.$uid.'_'.$time.'_'.$sso_key;
// 加密 Token,获得 xlm_hash
$xlm_hash = hash('sha512', $token);
// 合成聊天地址
$chat_url = 'https://xianliao.me/s/'.$web_id.'?mobile=1&uid='.$uid.'&username='.$uname.'&avatar='.$upic.'&ts='.$time.'&token='.$xlm_hash;
// 重定向至聊天页面地址
header('Location: '.$chat_url);
die();
?>
网站ID和SSO_KEY需要去官网注册获取(官网地址:https://www.xianliao.me)
调用方法
将上述代码保存至 PHP 文件中,然后用 iframe 的方法嵌入即可。
例如——
<iframe src="http://你的网站.com/xianliaome.php" height="500" width="100%" frameborder="0"></iframe>