Airmole / ShellBox

贝壳小盒子Wechat微信小程序,高校微信小程序,集课表查询、成绩查询、电费查询、图书查询等功能于一体。

Home Page:https://shellbox.ustb.tj.cn

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

小程序后台问题

1097872822 opened this issue · comments

我想请问的是“高校图书资源馆藏位置”的接口怎么实现的

我想请问的是“高校图书资源馆藏位置”的接口怎么实现的

图书馆藏信息来源于本校图书馆书目检索系统(http://opac2.airmole.cn:808/opac/),经本程序后端PHP项目处理HTML数据后格式化转换为JSON输出给小程序端渲染出来。

那请问程序后端PHP项目是否可以参考或者开源?

那请问程序后端PHP项目是否可以参考或者开源?

有开源计划,但是目前最近还没有精力整理文档出来。

那可否给出后端参考,我先自己琢磨琢磨 我的个人小程序也有类似功能需要参考作者的小程序

那可否给出后端参考,我先自己琢磨琢磨 我的个人小程序也有类似功能需要参考作者的小程序

可参考此代码https://github.com/dpu/libsysHelper/blob/master/libsysHelper.php

参考小程序获取高校图书馆藏信息的功能,您看可否提供相关后端实现

好的好的 感谢作者~ 我先看看

[](我看了下上面您给出的php文件,可能对我个人参考意义不大;我的项目若想将您上面提到“

(图书馆藏信息来源于本校图书馆书目检索系统(http://opac2.airmole.cn:808/opac/),经本程序后端PHP项目处理HTML数据后格式化转换为JSON输出给小程序端渲染出来)_。

”这里我想换成我们学校的,即可以返回我校图书馆的馆藏位置,作者此项目的这一小部分是否可以提供借鉴参考代码呢?

[](我看了下上面您给出的php文件,可能对我个人参考意义不大;我的项目若想将您上面提到“

(图书馆藏信息来源于本校图书馆书目检索系统(http://opac2.airmole.cn:808/opac/),经本程序后端PHP项目处理HTML数据后格式化转换为JSON输出给小程序端渲染出来)_。%EF%BC%8C%E7%BB%8F%E6%9C%AC%E7%A8%8B%E5%BA%8F%E5%90%8E%E7%AB%AFPHP%E9%A1%B9%E7%9B%AE%E5%A4%84%E7%90%86HTML%E6%95%B0%E6%8D%AE%E5%90%8E%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BD%AC%E6%8D%A2%E4%B8%BAJSON%E8%BE%93%E5%87%BA%E7%BB%99%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%AB%AF%E6%B8%B2%E6%9F%93%E5%87%BA%E6%9D%A5)_%E3%80%82)

”这里我想换成我们学校的,即可以返回我校图书馆的馆藏位置,作者此项目的这一小部分是否可以提供借鉴参考代码呢?

你可以提供一下你们学校图书馆的系统网站吗?我可以帮你写一段示例代码

@Airmole 这是我校图书馆的网站,有:
http://opac.lib.ctgu.edu.cn:8081/ctgu#/Home
http://opac.lib.ctgu.edu.cn:8081/ctgu/#/searchList
一个是主页,一个是查询页~ 有劳您了,再次感谢!

@Airmole 这是我校图书馆的网站,有:
http://opac.lib.ctgu.edu.cn:8081/ctgu#/Home
http://opac.lib.ctgu.edu.cn:8081/ctgu/#/searchList
一个是主页,一个是查询页~ 有劳您了,再次感谢!

以检索图书《追风筝的人》为案例,经过抓包分析,得到如下信息:

1. 图书检索API接口

打开Google Chrome,F12开发者工具检查网络请求发现得出图书检索HTTP请求结构如下图所示:

图书检索HTTP请求结构

由上图请求结构则可知,HTTP接口请求URL为http://opac.lib.ctgu.edu.cn:8081/find/unify/search,请求类型为POST请求,发送数据为形如以下结构的JSON数据:

{
  "docCode": [
    null
  ],
  "searchFieldContent": "追风筝的人",
  "searchField": "keyWord",
  "matchMode": "2",
  "resourceType": [],
  "subject": [],
  "discode1": [],
  "publisher": [],
  "libCode": [],
  "locationId": [],
  "eCollectionIds": [],
  "curLocationId": [],
  "campusId": [],
  "kindNo": [],
  "collectionName": [],
  "author": [],
  "langCode": [],
  "countryCode": [],
  "publishBegin": null,
  "publishEnd": null,
  "coreInclude": [],
  "ddType": [],
  "verifyStatus": [],
  "group": [],
  "sortField": "relevance",
  "sortClause": "asc",
  "page": 1,
  "rows": 10,
  "onlyOnShelf": null,
  "searchItems": null
}

显而易见的,可以看出,JOSN结构中的searchFieldContent值即为我们检索图书的关键字。那么,我们原理上我们只需要按照以上HTTP请求的参数结构发起大致相同的HTTP请求便可获取到所需的图书检索数据:

在此处,我以PHP作为后端开发语言,进行构造发起HTTP请求操作,示例编码如下:

<?php

$keyword = '追风筝的人';
$url = 'http://opac.lib.ctgu.edu.cn:8081/find/unify/search';   // 图书检索请求URL
// POST发送的JSON请求数据
$postData = '{"docCode":[null],"searchFieldContent":"' . $keyword . '","searchField":"keyWord","matchMode":"2","resourceType":[],"subject":[],"discode1":[],"publisher":[],"libCode":[],"locationId":[],"eCollectionIds":[],"curLocationId":[],"campusId":[],"kindNo":[],"collectionName":[],"author":[],"langCode":[],"countryCode":[],"publishBegin":null,"publishEnd":null,"coreInclude":[],"ddType":[],"verifyStatus":[],"group":[],"sortField":"relevance","sortClause":"asc","page":1,"rows":10,"onlyOnShelf":null,"searchItems":null}';

$result = sendPost($url, $postData);   // 向图书馆系统发起POST请求
$result = json_decode($result, true);   // 将JSON字符串解析为PHP数组,再次赋值给$result变量
print_r($result);  // 打印输出查看获取到的图书检索信息数组结构

// 封装好的POST请求发送函数
function sendPost(string $url, string $postData)
{
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => $postData,
      CURLOPT_HTTPHEADER => array(                             // HTTP Header信息
        'Host:  opac.lib.ctgu.edu.cn:8081',
        'Connection:  keep-alive',
        'Pragma:  no-cache',
        'Cache-Control:  no-cache',
        'Accept:  application/json, text/plain, */*',
        'mappingPath:  ctgu',
        'groupCode:  800008',
        'x-lang:  CHI',
        'User-Agent:  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
        'Content-Type:  application/json;charset=UTF-8',
        'Origin:  http://opac.lib.ctgu.edu.cn:8081',
        'Referer:  http://opac.lib.ctgu.edu.cn:8081/ctgu',
        'Accept-Encoding:  gzip, deflate',
        'Accept-Language:  zh,zh-CN;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6'
      ),
    ));
    
    $response = curl_exec($curl);
    
    curl_close($curl);
    return $response;  // 返回图书馆响应的HTTP JSON数据

}

在线执行以上示例代码:http://www.dooccn.com/php7.4/#id/04538092356dfb11739fe811a3dc697b

图书检索请求运行结果

2. 馆藏信息查询API接口

同样的,通过上个案例中的方法,我们最终分析得到以下HTTP结构:

图书馆藏状态信息接口请求结构

请求获得的响应JSON数据

分析汇总得出以下要点:

  • 请求接口URL:http://opac.lib.ctgu.edu.cn:8081/find/physical/groupitems

  • 请求方法类型:POST

  • 请求参数:

{
  "page": 1,
  "rows": 20,
  "entrance": null,
  "recordId": "497962",
  "isUnify": true
}

很显然,recordId的值即为上一步图书检索结果中包含的recoedId的值。其余参数可以继续使用默认参数。

recoedId

因为同样是发起POST请求,且HTTP结构中的Header参数相同,那么我们之前封装好的sendPost函数方法仍可继续用来发起POST请求,以获取该图书的馆藏信息,示例代码如下:

<?php

$recordId = '497962';
$url = 'http://opac.lib.ctgu.edu.cn:8081/find/physical/groupitems';   // 图书检索请求URL
// POST发送的JSON请求数据
$postData = '{"page":1,"rows":20,"entrance":null,"recordId":"' . $recordId . '","isUnify":true}';

$result = sendPost($url, $postData);   // 向图书馆系统发起POST请求
$result = json_decode($result, true);   // 将JSON字符串解析为PHP数组,再次赋值给$result变量
print_r($result);  // 打印输出查看获取到的图书馆藏状态信息

// 封装好的POST请求发送函数
function sendPost(string $url, string $postData)
{
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => $postData,
      CURLOPT_HTTPHEADER => array(                             // HTTP Header信息
        'Host:  opac.lib.ctgu.edu.cn:8081',
        'Connection:  keep-alive',
        'Pragma:  no-cache',
        'Cache-Control:  no-cache',
        'Accept:  application/json, text/plain, */*',
        'mappingPath:  ctgu',
        'groupCode:  800008',
        'x-lang:  CHI',
        'User-Agent:  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36',
        'Content-Type:  application/json;charset=UTF-8',
        'Origin:  http://opac.lib.ctgu.edu.cn:8081',
        'Referer:  http://opac.lib.ctgu.edu.cn:8081/ctgu',
        'Accept-Encoding:  gzip, deflate',
        'Accept-Language:  zh,zh-CN;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6'
      ),
    ));
    
    $response = curl_exec($curl);
    
    curl_close($curl);
    return $response;  // 返回图书馆响应的HTTP JSON数据

}

在线执行以上示例代码:

http://www.dooccn.com/php7.4/#id/5cda5874939a79269cd4fb7c6220b06a

图书馆藏状态信息

其他更多请求接口请自己探索。

如果以上的扩展资料还是不能解决您的疑惑和问题,您可能需要更深入的学习计算机网络HTTP协议相关内容,或使用搜索引擎获取更多扩展资料。

祝成功!