php+微信开发实现微信图书馆图书查询

article/2025/10/9 7:33:23
  1. 先贴效果图片
    适合学过php基础和微信开发的朋友共同学习

这里写图片描述
这里写图片描述

这里写图片描述

第1步.微信配置接口url
<?php
//必须写这一句 token可以任意,但必需和微信那里填写的token一致
define("TOKEN","weixin");
if(isset($_GET['echostr'])){$echoStr = $_GET["echostr"];if(checkSignature()){echo $echoStr;//成功则返回exit;}
}
function checkSignature(){$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = "weixin";$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;echo "成功";}else{return false;echo "失败";}}checkSignature();
?>

第二步:开始写爬虫代码爬数据啦
先看一下,我们要爬的界面是长这个样子的
这里写图片描述
输入的关键字是微信:
拦截到的查询图书的请求长这样:
http://.../searchresult.aspx?anywords=%ce%a2%d0%c5&ecx=1&efz=0&dt=ALL&cl=ALL&dp=20&sf=M_PUB_YEAR&ob=DESC&sm=table&dept=ALL&code=gb2312
可以看到anywords 后面的不是中文的微信,而是gbk编码的文字再经过urlencode编码后得到的
直接贴爬虫代码:

//获取书列表------------------------------------------------------------------header("Content-type: text/html; charset=utf-8");//根据搜索关键字和页码返回图书数据----------------------------------------function all($key,$page){$key = iconv("utf-8","gb2312",$key); $key = urlencode($key);$url = "http://***.**.**.**/searchresult.aspx?anywords=$key&page=$page&dp=4";$ch = curl_init($url);     curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: zh-CN,zh",  ));  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$con =  curl_exec($ch);

结果如下:
这里写图片描述
接着是用正则表达式匹配出图书的id,图书名称,图书名,图书责任者,图书出版者,图书出版年,图书索取号,图书馆藏,图书可借

f12查看源代码:
这里写图片描述

消除换行后:
这里写图片描述

正则匹配开始~:

$str1=preg_replace("/\s+/", "", $con); //过滤多余回车
//这个正则有点长。。。。
$preg = "/ctrlno=(.*)\"target=\"_blank\">(.*)<\/a><\/span><\/td><td>([^<input].*)<\/td><td>(.*)<\/td><td>(.*)<\/td><tdclass=\"tbr\">(.*)<\/td><tdclass=\"tbr\">(.*)<\/td><tdclass=\"tbr\">(.*)<\/td>/U";

结果图如下:
这里写图片描述

这里写图片描述

这里写图片描述

接下来计算总页数

//获取图书结果数计算出页数-------------------------------------------------------//这里看源代码里显示的是总记录数$preg = "/<fontcolor=\"Red\">(.*)<\/font>/U";preg_match($preg,$str1,$num);//根据总记录数/页面条数 然后向上取整 就得到总页数啦$num = ceil($num[1]/4);//另外判断如果用户输入的页数大于总页数,则返回空数组if($page>$num){$arr = array();return $arr;}

接下来将获得的数据拼接成一本书一本书的数据(不知道怎么说,就大白话说啦)

//用数组拼接数据---------------------------------------------------------------
$arr = array();
//遍历四次,将数据装入四个数组里面,一个大数组装四本书的小数组
for($i=0;$i<4;$i++){//获取图书的馆藏地,因为图书室通过索取号拼的链接另外拿的,不清楚的看下面的方法getAddress$bookAddr=getAddress($mesArr[1][$i]);//0=>书名   1=>出版社   2=>馆藏  3=>可借 4=>作者 5=>出版年  6=>索取号  $arr[$i] = array("0"=>$mesArr[2][$i],"1"=>$mesArr[4][$i],"2"=>$mesArr[7][$i],"3"=>$mesArr[8][$i],"4"=>$mesArr[3][$i],"5"=>$mesArr[5][$i],"6"=>$mesArr[6][$i],"7"=>$bookAddr);}

结果图:吼吼~ 出现啦:
这里写图片描述

//根据书ctrlno获取藏书点-------------------------------------------------------function getAddress($id){//这个ctrlno就是在匹配图书的详情链接时就有匹配到$url = "http://***.**.**.**/bookinfo.aspx?ctrlno=$id";$ch = curl_init($url);curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept-Language: zh-CN,zh",));curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$con =  curl_exec($ch);//echo $con;$preg = "/onclick='showLibInfo\(\"[0-9]+\"\)'>(.*)<\/a>/";preg_match_all($preg,$con,$a);//return $a[1];$str = "";//将匹配到的数组生成一个字符串for($i=0;$i<count($a[1]);$i++){$str.=$a[1][$i]."-";}$str = substr($str,0,strlen($str)-1);//$str = str_replace("-", "\n",$str );return $str;}

馆藏地结果图如下:
这里写图片描述

接下来是细活啦:拼接返回微信的图文里的图书标题,考虑到标题太长不美观,所以只拼接书名,出版社,馆藏还有可借

还是直接贴代码:

//将大数组中的每一个图书小数组转成字符串-------------------------------------------function makeMess($arr,$i,$str){$str = "";$key = "";for($j=0;$j<4;$j++){switch($j){case 0:$key = "书名";break;case 1:$key = "\n"."出版社";break;case 2:$key = "\n"."馆藏";break;case 3:$key = "     可借";break;}$str.= $key.":".$arr[$i][$j];    }return $str;}

另外,点击多图文里的每一个小图文时,要跳到详情页显示所有图书信息给用户看,但如果再用正则匹配一遍明显很费时,所以我决定用url后带参数的方法提交过去,很懒的做法有木有,所以接下来是拼接多图文里面图文的超链接啦,将第一次查询图书时匹配到的图书信息拼在url后面带过去给详情页

一言不合又是贴代码:

//拼接每本书的详情页url---------------------------------------------------------function makeUrl($arr,$i,$str){//这个是我自己做的简单响应式页面,跳转到这里显示图书详细信息啦$url = "http://www.kimtaeyoen.com/library/bookDetail.php?";$str = "";$key = "";for($j=0;$j<8;$j++){switch($j){case 0:$key = "书名";break;      case 1:$key = "&出版社";break;case 2:$key = "&馆藏";break;             case 3:$key = "&可借";break;case 4:$key = "&责任者";break;case 5:$key = "&出版年";break;case 6:$key = "&索取号";break;case 7:$key = "&馆藏地";break;}$str.= $key."=".$arr[$i][$j];}return $url.$str;} 

最后返回微信客户端那边的格式大概是这样的:
这里写图片描述

没错,不是json格式。。。没打算做成接口,没打算考虑扩展。。


原理如下:
当用户第一次关注时,将用户的openid存入数据表book(字段:openid[与当前公众号联系的唯一标示],book[搜索关键字])中,为什么要存,因为当用户选择页数时候,我们可以通过用户的openidbook表中查出刚才他查的是什么书,当用户输入另外的关键字时,则更新book表里用户对应的book字段为用户当前输入的关键字工具类tool.php的代码如下:
//当用户关注公众号时插入book表openid
function insertuser($openid){//连接数据库$link = mysql_connect("localhost","root","123");//选择数据库mysql_select_db("weixin");$sql = "insert into book(openid) values ('$openid')"; mysql_query($sql);}//当用户非第一次输入搜索关键字时更新book表的book属性function updateSerch($openid,$book){//连接数据库$link = mysql_connect("localhost","root","123");//选择数据库mysql_select_db("weixin");$sql = "update book set book='$book' where openid='$openid'";mysql_query($sql);}//当用户选择页数时查出用户之前输入的查询关键字bookfunction findSerch($openid){//连接数据库$link = mysql_connect("localhost","root","123");//选择数据库mysql_select_db("weixin");$sql = "select book from book where openid='$openid'";$result = mysql_query($sql);if($mess = mysql_fetch_assoc($result)){return $mess['book'];}}

接下来是写微信的接口页面,这个比较简单,

<?php$wechatObj = new Wechat();//如果没有通过GET收到echostr字符串, 说明不是再使用token验证if (!isset($_GET['echostr'])) {//调用wecat对象中的方法响应用户消息$wechatObj->responseMsg();}else{//调用valid()方法,进行token验证if($wechatObj->valid()){echo $echoStr;exit;}}//声明一个Wechat的类, 处理接收消息, 接收事件, 响应各种消息, 以及token验证class Wechat {//相应消息处理public function responseMsg(){//接收微信传过来的xml消息数据$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//如果接收到了就处理并回复if(!empty($postStr)){//将接收到德xml字符串写入日志,用R标记表示接收到消息$this->logger("R \n".$postStr);//将接收到的消息处理返回一个对象$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$keyword = trim($postObj->Content);$time = time();$RX_TYPE = trim($postObj->MsgType);//消息类型分离,通过RX_TYPE类型作为判断,每个方法都需要将对象$postObj传入switch($RX_TYPE){case "event":$this->receiveEvent($postObj);break;case "text":$this->receiveText($keyword, $fromUsername, $toUsername, $time);break;default:break;}}}//接收事件消息private function receiveEvent($object){//临时定义一个变量, 不同的事件发生时, 给用户反馈不同的内容$content = "";//通过用户发过来的不同事件做处理switch ($object->Event){//用户一关注 触发的事件case "subscribe":include "tool.php";insertuser($object->FromUserName);$content = "欢迎关注图书馆图书查询!";break;//取消关注时触发的事件case "unsubscribe":$content = "取消关注";break;}$result = $this->transmitText($object, $content);echo $result;}//整理好回复图书多图文的回复格式private function getBook($keyword, $fromUsername, $toUsername, $time,$pagesize){// 回复图文的模板$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>5</ArticleCount><Articles><item><Title><![CDATA[%s]]></Title><Description><![CDATA[4]]></Description><PicUrl><![CDATA[http://img3.imgtn.bdimg.com/it/u=3937886759,1529255090&fm=21&gp=0.jpg]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[2]]></Description><PicUrl><![CDATA[]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[3]]></Description><PicUrl><![CDATA[]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[4]]></Description><PicUrl><![CDATA[]]></PicUrl><Url><![CDATA[%s]]></Url></item><item><Title><![CDATA[%s]]></Title><Description><![CDATA[5]]></Description><PicUrl><![CDATA[]]></PicUrl><Url><![CDATA[%s]]></Url></item></Articles><FuncFlag>1</FuncFlag></xml>";include "WelibrarySUC.php";$arr = all($keyword,$pagesize);$point = ($arr==null)? "当前页已经没有图书啦~ 点图有放送~" : "第$pagesize/{$arr[0][4]}页  回复数字选页 点图有放送~";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time,$point,"http://bd.kuwo.cn/yinyue/6421359?from=baidu",$arr[0][0],$arr[1][0],$arr[0][1],$arr[1][1],$arr[0][2],$arr[1][2],$arr[0][3],$arr[1][3]);return $resultStr;}//接收文本消息并准备文本信息private function receiveText($keyword, $fromUsername, $toUsername, $time){include "tool.php";//从接收到德消息中获取用户输入的文本内容,作为一个查询的关键字,使用trim()函数去掉两边的空格$keyword = trim($keyword);if(is_numeric($keyword)){$book = findSerch($fromUsername);echo $this->getBook($book, $fromUsername, $toUsername, $time,$keyword);}else{updateSerch($fromUsername,$keyword);echo $this->getBook($keyword, $fromUsername, $toUsername, $time,1);}}//整理好回复文本的回复格式private function transmitText($object,$content){$xmlTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";$result = sprintf($xmlTpl,$object->FromUserName,$object->ToUserName,time(),$content);return $result;}}

接下来就是那个所谓的图书详情页了:

<?php 
error_reporting(E_ALL^E_NOTICE^E_WARNING);$b_name = $_GET["书名"];$b_publish = $_GET["出版社"];$b_holding = $_GET["馆藏"];$b_borrow = $_GET["可借"];$b_author = $_GET["责任者"];$b_published = $_GET["出版年"];$b_number = $_GET["索取号"];$b_address = $_GET["馆藏地"];$b_address = str_replace("-", "<br/>",$b_address);//echo $b_name;
?><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>图书详情页</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><link href="css/bootstrap.min.css" rel="stylesheet" type="text/css"/><style type="text/css"> 
body{ align:center;margin:0;}</style>
</head>
<body background="13.jpg"><!--用户列表--><div class="container" id="user_list"><h2 align=center>图书详情</h2><div  class="table-responsive"><table class="table    table-bordered ">                    <tbody id="user_list_tbody"><tr><td>书 名</td><td><?php echo $b_name?></td></tr><tr><td>责任者</td><td><?php echo $b_author?></td></tr><tr><td>出版者</td><td><?php echo $b_publish?></td></tr><tr><td>出版年</td><td><?php echo $b_published?></td></tr><tr><td>索取号</td><td><?php echo $b_number?></td></tr><tr><td>馆 藏</td><td><?php echo $b_holding?></td></tr><tr><td>可 借</td><td><?php echo $b_borrow?></td></tr><tr><td>馆藏地</td><td><?php echo $b_address?></td></tr></tbody></table>                </div></div><script src='js/jquery.min.js'></script><script src='js/bootstrap.min.js'></script><script src="js/common.js"></script><!-- <script src="js/userList.js" type="text/javascript" charset="utf-8"></script> -->
</body></html>

结束、效果图如顶图所示~ 好了,菜鸟一枚,各位道友不喜勿喷,


http://chatgpt.dhexx.cn/article/BYUmwOhR.shtml

相关文章

PHP实现图书借阅

一 代码 <html><head><title>图书借阅</title></head><body><form name"form1" method"post" action"index.php"><table width"738" border"0" align"center" cell…

基于ThinkPhp框架的高校图书馆藏书借阅系统

一、概述 使用了ThinkPHP&#xff0c;虽然本人觉得该框架实在有点反人类&#xff0c;但是也算是第一次使用PHP的框架。可以对于MVC有更深的理解。 前端界面 后台界面 登录后台的默认管理员是&#xff1a;2333333333&#xff0c;密码&#xff1a;admin。 二、功能设计 2.1 数…

(php毕业设计源码)基于php图书馆预约选座管理系统源码

基于php图书馆预约选座管理系统 项目获取请看文章最底下官网 本设计是采用了php编程语言和mysql数据库开发的图书馆预约选座系统&#xff0c;解决大学生再图书馆选座难的问题&#xff0c;本设计采用学生和管理员两个角色&#xff0c;其中学生可以在线选座&#xff0c;进行预约&…

php做评价页面_php如何实现评论功能?

php实现评论功能的方法:1、设置发布评论文本域,代码为【 type="submit" value="评论" />】;2、在评论一条后面跟着回复,代码为【type=submit value=回复】。 php实现评论功能的方法: 1.发布评论 这是评论的文本域 评论后的内容要存到数据库去处理 …

PHP实现一个简单的图书管理系统

刚收到了一个消息&#xff0c;老师竟然布置了一个课设 &#xff0c;要求做一个后台管理系统。做归做&#xff0c;但是&#xff01;本着为老师节省时间的心态&#xff0c;我花了大量的时间&#xff0c;消耗了无数脑细胞扫描了一遍老师给的课题&#xff0c;最终掐指一算选了一个最…

php图书借阅管理系统前台,PHP开发简单图书借阅系统之主页借书功能

如图所示 在主页面的操作栏下有个操作目录显示“我要借书” 点击后则可以开始实现借书功能。如果现有数量显示为0时&#xff0c; 此栏目为“该书已借完”。则不能点击选择该项。 首先判断图书编号id有没有填写&#xff0c;没有则提示用户<?php $book_id $_GET[book_id]; …

图书馆管理系统(PHP期末报告)

文章目录 一项目概述 二 图书管理系统描述 2.1 课题简介 2.2 模块简介 2.3 数据库结构设计 三 主要模块的详细设计 3.1 主要技术点说明 3.2 结果展示 总结与反思 一项目概述 进入21世纪以来&#xff0c;信息技术从根本上推动了图书馆的飞速发展&#xff0c;计算机和计算机管理系…

php+mysql 图书管理系统

1、实验目的 设计并实现一个精简的图书管理系统&#xff0c;要求具有图书入库、查询、借书、还书、借书证管理等功能。 2、实验平台 WAMPwin 10mysqli 3、系统需求分析 基本数据对象 书(书号、类别、书名、出版社、年份、作者、价格、总藏书量、库存)借书证(卡号、姓名、…

PHP图书管理平台课程报告

图书管理平台 1 项目概述 进入21世纪以来&#xff0c;信息技术从根本上推动了图书馆的飞速发展&#xff0c;计算机和计算机管理系统已成为图书馆进行图书管理的主要设备和系统。虽然目前很多大型的图书馆已经有一整套比较完善的管理系统&#xff0c;但是在一些中小型的图书馆…

jquery的$.ajax()利用FormData数据类型与php后台交互

可能孤陋寡闻&#xff0c;现在才知道MDN的存在&#xff1a;https://developer.mozilla.org/zh-CN/ 的MDN全名容易理解他是什么意思&#xff1a;MDN Web Docs 好了&#xff0c;自行学习&#xff0c;上一篇讲了jquery的$.ajax()利用json数据类型与php后台交互 那么从MDN上了解到…

微信公众号发送模板消息 -- PHP后台

微信公众号发送模板消息 – PHP后台 注意&#xff1a;这里的用户openid必须是和你的appid&#xff0c;appsecret是一整套的&#xff0c;所谓一整套的意思就是&#xff0c;openid是通过你当前的这个appid获取到的&#xff0c;如果是通过其他appid获取到的用户openid&#xff0c…

微信小程序获取openid(php后台)

微信小程序已经开放了越来越多的功能&#xff0c;所能实现的用户需求也越多了&#xff0c;但是微信提供的wx.getUserInfo()只能获取用户的表面信息&#xff0c;想要是先发送模板消息或者支付功能&#xff0c;就需要获取用户的openid&#xff08;微信提供给每个微信用户独一无二…

搭建一个PHP后台的开发环境你所需要配置东西都有哪些?XAMPP问题

安装的工具&#xff1a; 1. Mysql workbench / Navicat 2. Postman 3. Visual Studio Code / Sublime Text 4. PHP开发环境 5. Nodejs开发环境 6. xampp 注意&#xff08;mysql版本 5.7以上 php版本&#xff1a;7.0以上&#xff09;/wampserver 工具下载地址&#xff…

PHP后台管理登录界面代码

1&#xff0c;自学PHP&#xff0c;编写一个简单的后台登录管理系统&#xff1b; 2&#xff0c;代码中少部分借用网上开源代码&#xff0c;如有不规范的地方请指正&#xff0c;如有更好的方法&#xff0c;多谢分享&#xff1b; 3&#xff0c;享受编程的乐趣并得到知识的提高&a…

php后台登录,实现后台管理员登录功能

上一章节我们选择了后台登录页面,并且将验证码成功的加入到了登录页 login.html 文件中。并且创建了数据库表admin,加入一条用户名和密码的测试数据。这一节我们就来实现登录功能。 先看一个简单功能实现流程图: 有了流程图就有了思路,顺着思路就知道自己一步一步需要做什么…

微信小程序之from表单提交数据到PHP后台

主要内容&#xff1a;实现微信小程序与PHP后台之间的数据传递 本文通过from表单提交到后台存入数据库来展现 需要注意的有&#xff1a; 勾选 代码如下&#xff1a; demo1.wxml <!--pages/demo1/demo1.wxml--> <form bindsubmitformSubmit bindresetformReset>…

PHP后台发送微信小程序订阅信息(较详细)

最近微信小程序甲方需新增下单提醒功能&#xff0c;于是我去微信文章看接入模板信息&#xff0c;但是看到最新公告&#xff08;模板消息接口将下线&#xff0c;推荐使用订阅信息&#xff09;官方通知&#xff1a; 1. 小程序订阅信息分为一次性订阅信息和长期性订阅信息&#x…

php后台框架整理

1、 fastadmin FastAdmin是一款基于ThinkPHPBootstrap开发的快速后台开发框架。FastAdmin基于Apache2.0开源协议发布&#xff0c;免费且不限制商业使用&#xff0c;目前被广泛应用于各大行业应用后台管理。 官网地址&#xff1a;FastAdmin – 基于ThinkPHP和Bootstrap的极速后…

【OpenCV】在Python环境下安装OpenCV并检测是否安装成功

一、OpenCV概述 OpenCV是一个开源的计算机视觉库&#xff0c;可以在Windows、Linux、MacOS等操作系统上运行。它起源于英特尔性能实验室的实验研究&#xff0c;由俄罗斯的专家负责实现和优化&#xff0c;并以为计算机视觉提供通用性接口为目标。 1.1、计算机视觉 计算机视觉…

安装CV2,安装opencv

几经尝试&#xff0c;发现并没有所谓的"cv2"包&#xff0c; 需要安装的是opencv这个包&#xff0c;安装后就可以import cv2了。方法如下&#xff1a; 方法一&#xff1a; 直接用pip安装&#xff0c;按windows r 输入cmd&#xff0c;在cmd环境下输入&#xff1a; …