1 switch($keyword){ 2 default: 3 include(‘get_baike.php‘); 4 $data = getEncyclopediaInfo($keyword); 5 if($data[0][‘Title‘]){ 6 $contentStr=$data[0][‘Title‘]."\n"; 7 $contentStr.=$data[1][‘Title‘]."\n"; 8 9 } 10 else{ 11 $contentStr="抱歉,没有找到与“".$keyword."”相关的百科结果。"; 12 } 13 $this->weixin_output($contentStr,$textTpl,$fromUsername,$toUsername,$time); 14 break;
get_baike.php
1 <?php 2 function getEncyclopediaInfo($name){ 3 //$name_gbk = iconv(‘utf-8‘, ‘gbk‘, $name); //互动百科的网页编码为utf-8所以我们就省去这一行。可直接删除 4 $encode = urlencode($name); //对字符进行URL编码,不然会出现乱码。 5 $url = ‘http://www.baike.com/gwiki/‘.$encode; //这行是我们输入的内容将在这个网页上进行内容采集 6 echo "url is $url <BR>"; 7 $get_contents2 = httpGetRequest_baike($url); //直接获取网页内容,我们省去了多行代码,因为$url己经是最终需要采集的网页了。 8 // echo htmlspecialchars($get_contents2); 9 10 preg_match(‘#\<div class="baiketitl"\>([\s\S]+?)(\<div id="custom_xinxi|\<div id="content"\>)#is‘, $get_contents2, $matchresult); //截取要采集的内容从<div class="baiketitl">开始到<div id="custom_xinxi或者<div id="content">结束。([\s\S]+?)为正则表达式。| 是或者的意思。为什么是<div id="custom_xinxi或者<div id="content">呢,因为我们只采集百科的简介部分。从网页源码我们可以看到。简介的部分是从<div class="baiketitl">到<div id="custom_xinxi结束,但是有一种情况是,没有简介,只有一个基本信息,那么我们就无法从源码里找到<div id="custom_xinxi,所以就会出错,但它会有一个基本信息,而它的结束为<div id="content"> 11 echo "<Pre>"; 12 print_r($matchresult); 13 echo "</pre>"; 14 $bt = cut($matchresult[1],‘<h1>‘,‘</h1>‘,false,false); //$matchresult[1]为采集内容字符串。从这个内容中采集出百科的标题赋值给$bt变量. $img = cut($matchresult[1],‘<img src="‘,‘"/>‘,false,false);//取出图片的链接,因为互动百科都有配图,所以这一步就轻松搞定。 15 $nr = cut($matchresult[1],‘</div><p>‘,‘</p>‘,false,false);//取出百科内容,从源码可以看到内容从</div><p>开始到</p>为一个段落的结束,由于微信只能接收2000个字以内,所以我们就直接取最一段的内容。 16 if(!trim($nr)){ 17 $c2=str_replace("<h1>$bt</h1>","",$matchresult[1]); 18 $nr = strip_tags($c2); 19 $nr = str_replace("\n","",$nr); 20 $nr = str_replace(" ","",$nr); 21 $nr = str_replace("\r","",$nr); 22 } 23 echo "title is $bt<BR>"; 24 echo "contnet is $nr<BR>"; 25 $content[] = array("Title" =>$bt,"Description" =>"", "PicUrl" =>$img, "Url" =>"");//配置微信接收格式。单图文 26 $content[] = array("Title" =>$nr, "Description" =>"", "PicUrl" =>"", "Url" =>""); 27 if (isset($bt) != ""){//判断$bt有没有被赋值,如果不为空就输出内容,如果为空就是没有采集到内容就输出没有找到相关百科结果。 28 return $content; //直接输出内容。 29 }else{ //否则 30 return ""; 31 } 32 } 33 //以下这个函数对于新手非常有用。因为截取内容只需要将字符前后的内容填入就可以了,不需要用到正则表达式。 34 function cut( $from, $start, $end, $lt = false, $gt = false ) 35 { 36 $str = explode( $start, $from ); 37 if ( isset( $str[‘1‘] ) && $str[‘1‘] != "" ) 38 { 39 $str = explode( $end, $str[‘1‘] ); 40 $strs = $str[‘0‘]; 41 } 42 else 43 { 44 $strs = ""; 45 } 46 if ( $lt ) 47 { 48 $strs = $start.$strs; 49 } 50 if ( $gt ) 51 { 52 $strs .= $end; 53 } 54 return $strs; 55 } 56 //以下这个函数原封不动。主要的作用应该就是告诉目标站,我们是从百度过来看你的,你不要屏蔽我哦。谢谢!可以用到其它地方。 57 function httpGetRequest_baike($url) 58 { 59 $headers = array( 60 "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1", 61 "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 62 "Accept-Language: en-us,en;q=0.5", 63 "Referer: http://www.baidu.com/" 64 ); 65 $ch = curl_init(); //初始化 66 curl_setopt($ch, CURLOPT_URL, $url);//设置选项 67 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 68 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);// 69 $output = curl_exec($ch); 70 curl_close($ch);//释放句柄,不然很占内存 71 72 if ($output === FALSE){ 73 return "cURL Error: ". curl_error($ch);//这是检查错误的 74 } 75 return $output; 76 }