微信开发纪实之微信数字图书馆服务.docx
《微信开发纪实之微信数字图书馆服务.docx》由会员分享,可在线阅读,更多相关《微信开发纪实之微信数字图书馆服务.docx(37页珍藏版)》请在冰豆网上搜索。
微信开发纪实之微信数字图书馆服务
微信开发纪实之数字图书馆服务
最近在做微信的后台开发,看到有些高校的微信公众平台上有查询借阅和续借的功能,自己闲来无事也瞎鼓捣了一个,现在把成果贴出来和大家一起分享。
由于本人在武汉大学,故以武汉大学图书馆为例。
思路:
1.模拟登陆
2.抓取数据
语言:
java
代码:
DigitalLibraryService.java
packagecom.wdyx.weixin.service;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Set;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.entity.BufferedHttpEntity;
importorg.apache.http.impl.client.CloseableHttpClient;
importorg.apache.http.impl.client.HttpClients;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Document;
importorg.jsoup.nodes.Element;
importorg.jsoup.select.Elements;
/**
*数字图书馆服务
*功能:
查询个人信息、借阅信息、借阅历史,以及进行续借操作
*@author帮杰
*/
publicclassDigitalLibraryService{
//主机地址
publicstaticfinalStringHOST="";
//登陆页面地址
publicstaticfinalStringLOGIN_URL="
//表单post地址
publicstaticfinalStringPOST_URL=":
80/pds";
//借阅者信息
privateStringborrowerInfo=null;
//借阅信息
privateStringborrowInfo=null;
//借阅历史
privateStringborrowHistory=null;
//储存登录页,以备续借之需
privateStringrenewPage=null;
//每一个客户即为一个HttpClient对象
privateCloseableHttpClienthttpclient=null;
//构造函数,以用户名和密码作为参数
publicDigitalLibraryService(Stringusername,Stringpassword)throwsClientProtocolException,IOException{
//初始化HttpClient对象
httpclient=HttpClients.createDefault();
//解析登录页
Documentdoc=Jsoup.parse(login(username,password,httpclient));
//“我的借阅信息”所对应的url
StringBorrowerInfoUrl=doc.getElementsContainingOwnText("我的借阅信息").first().attr("href");
//据观察有重定向;获得重定向地址
StringRelocatedBorrowerInfoUrl=HttpUtil.getHtml(BorrowerInfoUrl,httpclient).split("\'")[1];
//重定向页
StringRelocatedBorrowerInfoHtml=HttpUtil.getHtml(RelocatedBorrowerInfoUrl,httpclient);
//借阅者信息页
StringBorrowerInfoHtml=HttpUtil.getHtml(HOST+HtmlUtil.getLinks(RelocatedBorrowerInfoHtml).get(0),httpclient);
//通过抓取获得借阅者信息
borrowerInfo=getBorrowerInfo(BorrowerInfoHtml);
doc=Jsoup.parse(BorrowerInfoHtml);
//"当前借阅数:
"后面的数字链接指向借阅信息页,故此处取得该链接
StringBorrowInfoUrl=doc.getElementsContainingOwnText("当前借阅数:
").parents().select("a").attr("href").split("\'")[1];
//借阅历史页面链接
StringBorrowHistoryUrl=doc.getElementsContainingOwnText("借阅历史").attr("href");
//借阅信息页
StringBorrowInfoHtml=HttpUtil.getHtml(BorrowInfoUrl,httpclient);
//借阅历史页
StringBorrowHistoryHtml=HttpUtil.getHtml(BorrowHistoryUrl,httpclient);
//借阅信息
borrowInfo=getBorrowInfo(BorrowInfoHtml);
//借阅历史
borrowHistory=getBorrowHistory(BorrowHistoryHtml);
//借阅信息即为能进行续借操作的页面
renewPage=BorrowInfoHtml;
}
//得到借阅者信息
publicStringgetBorrowerInfo(){
returnborrowerInfo;
}
//得到借阅信息
publicStringgetBorrowInfo(){
returnborrowInfo;
}
//得到借阅历史
publicStringgetBorrowHistory(){
returnborrowHistory;
}
//续借,返回续借结果
publicStringrenew(){
returnrenewBook(renewPage,httpclient);
}
/**
*初始化POST表单参数
*
*@paramusername
*@parampassword
*@returnList
*@throwsIOException
*@throwsClientProtocolException
*/
privatestaticListinitialLoginFormData(Stringusername,Stringpassword)
throwsClientProtocolException,IOException{
Listnvps=newArrayList();
HashMapparmasMap=HtmlUtil.getLoginFormData(LOGIN_URL);
SetkeySet=parmasMap.keySet();
for(Stringtemp:
keySet){
if(temp.contains("bor_id")){
parmasMap.put(temp,username);
}elseif(temp.contains("bor_verification")){
parmasMap.put(temp,password);
}
nvps.add(newBasicNameValuePair(temp,parmasMap.get(temp)));
}
returnnvps;
}
/**
*登陆图书馆主页
*
*@paramusername
*@parampassword
*@parampost_url
*@return登陆后的图书馆主页
*@throwsIOException
*@throwsClientProtocolException
*/
privatestaticStringlogin(Stringusername,Stringpassword,CloseableHttpClienthttpclient){
Stringhtml="";
try{
Listnvps=initialLoginFormData(username,password);
HttpPostpost=newHttpPost(POST_URL);
post.setEntity(newUrlEncodedFormEntity(nvps));
HttpResponseresponse=httpclient.execute(post);
HttpEntityentity=newBufferedHttpEntity(response.getEntity());
html=EntityUtils.toString(entity,HtmlUtil.getCharset(EntityUtils.toString(entity)));
StringmainUrl=HOST+HtmlUtil.getLinks(html).get(0);
html=HttpUtil.getHtml(mainUrl,httpclient);
}catch(ClientProtocolExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnhtml;
}
/************************抽取数据**************************/
/**
*抽取借阅者信息
*@paramBorrowerInfoHtml
*@returnBorrowerInfo
*/
privatestaticStringgetBorrowerInfo(StringBorrowerInfoHtml){
StringBufferbuffer=newStringBuffer();
try{
Listkey=newArrayList();
Listval=newArrayList();
Documentdoc=Jsoup.parse(BorrowerInfoHtml);
Elementselements=doc.select("table").select("tr");
Elementscol1=elements.select("td.td4");
Elementscol2=elements.select("td.td1");
for(Elementtmp:
col1){
key.add(tmp.text());
}
for(Elementtmp:
col2){
val.add(tmp.text());
}
buffer.append("------------您的个人信息------------\n\n");
for(inti=0;iif(i!
=3)
buffer.append(key.get(i)).append(val.get(i)).append("\n\n");
}
}catch(Exceptione){
e.printStackTrace();
}
return(null==buffer)?
null:
buffer.substring(0,buffer.lastIndexOf("\n\n"));
}
/**
*抽取借阅信息
*@paramusername
*@parampassword
*@paramlogin_url
*@return
*/
privatestaticStringgetBorrowInfo(StringBorrowInfoHtml){
StringBufferbuffer=newStringBuffer();
try{
Listkey=newArrayList();
Listval=newArrayList();
Documentdoc=Jsoup.parse(BorrowInfoHtml);
Elementsth=doc.select("th.text3");
Elementstd=doc.select("td.td1");
for(Elementtmp:
th){
key.add(tmp.text());
}
for(Elementtmp:
td){
val.add(tmp.text());
}
buffer.append("------------您的借阅信息------------\n\n");
intitemCounts=key.size();
intgroupCounts=val.size()/itemCounts;
for(inti=0;ifor(intj=0;jif(j!
=1)
buffer.append(key.get(j)+(j==0?
"":
":
")).append(val.get(i*itemCounts+j)).append("\n\n");
}
buffer.append("-----------------------------------\n\n");
}
}catch(Exceptione){
e.printStackTrace();
}
return(buffer==null)?
null:
buffer.substring(0,buffer.lastIndexOf("-----------------------------------\n\n"));
}
/**
*抽取借阅历史
*@paramusername
*@parampassword
*@paramlogin_url
*@return
*/
privatestaticStringgetBorrowHistory(StringBorrowHistoryHtml){
StringBufferbuffer=newStringBuffer();
try{
Listkey=newArrayList();
Listval=newArrayList();
Documentdoc=Jsoup.parse(BorrowHistoryHtml);
Elementsth=doc.select("th.text3");
Elementstd=doc.select("td.td1");
for(Elementtmp:
th){
key.add(tmp.text());
}
for(Elementtmp:
td){
val.add(tmp.text());
}
buffer.append("------------您的借阅历史------------\n\n");
val.remove(0);
intitemCounts=key.size();
intgroupCounts=val.size()/itemCounts;
for(inti=0;ifor(intj=0;jbuffer.append(key.get(j)+(j==0?
"":
":
")).append(val.get(i*itemCounts+j)).append("\n\n");
}
buffer.append("-----------------------------------\n\n");
}
}catch(Exceptione){
e.printStackTrace();
}
return(buffer==null)?
null:
buffer.substring(0,buffer.lastIndexOf("-----------------------------------\n\n"));
}
/**
*续借
*@paramrenewHtml
*@paramhttpclient
*@return续借结果
*/
privatestaticStringrenewBook(StringrenewHtml,CloseableHttpClienthttpclient){
StringBufferbuffer=newStringBuffer();
try{
Documentdoc=Jsoup.parse(renewHtml);
Stringurl=doc.getElementsContainingOwnText("全部续借").attr("href").split("\'")[1];
StringresultPage=HttpUtil.getHtml(url,httpclient);
doc=Jsoup.parse(resultPage);
Elementsth=doc.select("tr.tr1").select("th");
Elementstd=doc.select("td.td1");
Listkey=newArrayList();
Listval=newArrayList();
for(Elementtmp:
th){
key.add(tmp.text());
}
for(Elementtmp:
td){
val.add(tmp.text());
}
buffer.append("------------您的续借结果------------\n\n");
intitemCounts=key.size();
intgroupCounts=val.size()/itemCounts;
for(inti=0;ifor(intj=0;jbuffer.append(key.get(j)+":
").append(val.get(i*itemCounts+j)).append("\n\n");
}
buffer.append("-----------------------------------\n\n");
}
}catch(Exceptione){
e.printStackTrace();
}
return(buffer==null)?
null:
buffer.substring(0,buffer.lastIndexOf("-----------------------------------\n\n"));
}
//测试
publicstaticvoidmain(String[]args)throwsException{
Stringusername="*************";
Stringpassword="******";
DigitalLibraryServicemyDigitalLibraryService=newDigitalLibraryService(username,password);
//System.out.println("---------------------------------个人信息