姓名测试
姓名测试是指根据姓名的笔画数以及一定规则数理关系,运用阴阳五行相生相克的道理,来预测姓名的吉凶好坏。
数据获取
姓名测试“
打分手机版网站
”提供姓名测试服务。
地址为:http://m.1518.com/
经过检验与分析,其实际查询接口地址如下:
http://m.1518.com/xingming_view.php?word=%D5%C5%C8%FD&submit1=%C8%B7%B6%A8&FrontType=1
上述接口在浏览器中打开如下图示:
查看该网页源代码,内容部分代码显示如下:
<div id="detail" style="margin-top:0px;">
<h3>张三<span style="float:right;"><a href="qiming/"><img src="images/bbqm_shouji_small.jpg" border="0"></a></span></h3>
<dl>
<dt>得分:<u><strong>96分</strong></u></dt>
<dd>
<div>(评分由数理文化得出,仅供娱乐参考)</div>
</dd>
<dd>天格:<font color=red>凶</font>
人格:<font color=red>大吉</font>
地格:<font color=red>大吉</font><br>
外格:<font color=red>大吉</font>
总格:<font color=red>大吉</font><br>
五行:火 金 </dd>
</dl>
<dl>
<dt>概述:</dt>
<dd>
得上级提拔,享父母余德,易成功,心身健全,得长寿享荣誉。 </dd>
</dl>
<dl>
<dt>总论:</dt>
<dd>有良好的发展运势,得到意外之助而成功发展,身心健康,家庭幸福,但发展有限,财运不稳之兆。</dd>
</dl>
<dl>
<dt>性格:</dt>
<dd>
为人谦和有礼,遵守公共道德及信用,做事稳重且踏实,对待部属宽厚大方,受到尊敬与欢迎,是一位很好的领导人才。</dd>
</dl>
<dl>
<dt>意志:</dt>
<dd>
意志尚称坚定,但耐力不够,处事有喜新厌旧之象,大都有无法坚持到底。</dd>
</dl>
<dl>
<dt>事业:</dt>
<dd>
任何事业对您都适合,碰到任何困难都有贵人相助,让您一展抱负。</dd>
</dl>
<dl>
<dt>家庭:</dt>
<dd>
一家老幼和乐融洽,子女又孝顺,夫妻亦能和睦相处。</dd>
</dl>
<dl>
<dt>婚姻:</dt>
<dd>
男娶贤淑之妻,婚后感情美满;女嫁谦恭才干之夫,婚后家庭幸福。</dd>
</dl>
<dl>
<dt>子女:</dt>
<dd>
子女都谦恭有礼且有责任感,长大后事业成功并能孝顺父母。</dd>
</dl>
<dl>
<dt>社交:</dt>
<dd>
人缘很好,性情明朗愉快不拘小节,受到人家的欢迎及异性的接近。适合领导及管理之工作。</dd>
</dl>
<dl>
<dt>精神:</dt>
<dd>
生活很愉快,内外圆满,诸事一帆顺。</dd>
</dl>
<dl>
<dt>财运:</dt>
<dd>
所做之事都有成功之象,财源可得,天运五行属水,劳多利少。</dd>
</dl>
<dl>
<dt>健康:</dt>
<dd>
身心健全,少灾。注意血压即可。</dd>
</dl>
<dl>
<dt>老运:</dt>
<dd>
晚景尚称如意,可享清福。</dd>
</dl>
</div>
可以看出,事件内容都放置在div区块下的dl标签中。我们可以通过循环遍历的的方式将相应数据取出来。
开发实现
我们使用
simple_html_dom
来抓取所需要的页面,相应代码如下
fortune.php整体代码如下:
<?php
function getFortuneInfo($keyword)
{
if ($keyword == ""){
return "请发送算命+人名,例如“算命张三”";
}
if ((strlen($keyword) < 6) || (strlen($keyword) > 12)){
return "人名长度为2到4个汉字";
}
try {
//引用HTML解析器库文件
//定义要访问的网址URL,使用函数 mb_convert_encoding() 将“张三”从UTF-8编码转换为GB23121编码,再将字符串以URL编码
$url = "http://m.1518.com/xingming_view.php?word=".urlencode(mb_convert_encoding($keyword, 'gb2312', 'utf-8'))."&submit1=%C8%B7%B6%A8&FrontType=1";
//从页面地址中创建文档对象模型
$html_fotune = file_get_html($url);
//判断模型是否创建成功
if (!isset($html_fotune)){
$html_fotune->clear();
return "程序检索出错!\n如果经常这样,百度一下。";
}
//定义变量,用于保存最终返回内容
$infomation = "";
//查找 id 为 “detail”的div元素,并在该元素下找dl元素,符合这样条件的均为解析内容,通过循环遍历的方式来获取,取其纯文本内容。使其正则表达式替换掉空格等内容。最后,判断长度是否超过2000,若超过,则直接退出。
foreach($html_fotune->find('div[id="detail"] dl') as $item) {
$curText = $item->plaintext;
$curText = preg_replace('/\s{2,}/i', ' ', $curText);
$curText = preg_replace('/\t{2,}/i', ' ', $curText);
$curText = preg_replace('/:\s/i', ':', $curText);
$infomation .= trim($curText)."\n";
if (strlen($infomation) > 2000){break;}
}
//清理文档对象,释放资源
$html_fotune->clear();
//使用字符串替换等方式继续删除空格等内容
$infomation = str_replace("\r\n", "\n", $infomation);
$infomation = str_replace("天格", "\n天格", $infomation);
//返回文本消息
return trim($infomation);
}catch (Exception $e){
}
}
?>
index.php整体代码如下:
<?php
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE)
{
case "text":
$resultStr = $this->receiveText($postObj);
break;
case "event":
$resultStr = $this->receiveEvent($postObj);
break;
default:
$resultStr = "";
break;
}
echo $resultStr;
}else {
echo "";
exit;
}
}
private function receiveText($object)
{
$keyword = trim($object->Content);
if (substr($keyword, 0, 6) == "算命"){
$keyword = trim(substr($keyword, 6, strlen($keyword)));
include("fortune.php");
$contentStr = getFortuneInfo($keyword);
}
$resultStr = $this->transmitText($object, $contentStr);
return $resultStr;
}
private function receiveEvent($object)
{
$contentStr = "";
switch ($object->Event)
{
case "subscribe":
$contentStr = "欢迎关注,请发送算命+人名,例如“算命张三 ";
}
$resultStr = $this->transmitText($object, $contentStr);
return $resultStr;
}
private function transmitText($object, $content, $flag = 0)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
return $resultStr;
}
private function transmitNews($object, $arr_item)
{
if(!is_array($arr_item))
return;
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($arr_item as $item)
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";
$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
return $result;
}
}
?>