嗯。。。记录一下,别提自己有多菜了。太菜了,现阶段也就只是实现了,还没经过长时间测试。打算过年这两天学完ssm整合,给自己写的第一个爬虫配个页面,配两个数据库表什么的。
光是包就导了这么多,这还没ssm包呢,真的菜 ,先把功能实现再说,后期有时间再看哪个包不用吧
log4j.properties 放src根目录 run.log文件创建在项目根目录
log4j.rootLogger = DEBUG,Console,Stdout
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.appender.Stdout=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Stdout.File=./log/run.log
log4j.appender.Stdout.Append=true
log4j.appender.Stdout.Threshold = DEBUG
log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%p] %m%n
一个类(论写注释的必要性)
getUrlResponse方法(下面好几个方法都会调用这个方法来获取一个String 然后自己转成JSONObject)
/**
* 传入 url
* @param url
* @return json字符串只是字符串
*天知道我为什么不直接返回一个JSONObject或JSONArray
*/
public static String getUrlResponse(String url) {
System.out.println(url);
String json = null;
CloseableHttpClient client=null;
HttpEntity entity=null;
try{
//获取CloseableHttpClient对象
client=HttpClients.createDefault();
//创建httpPost对象
HttpPost post=new HttpPost();
post.setURI(new URI(url));
//执行client 获取response
HttpResponse response=client.execute(post);
entity=response.getEntity();
json=EntityUtils.toString(entity, "UTF-8");
//返回json字符串
return json;
}catch(ClientProtocolException e){
e.printStackTrace();
return "{\"data\":{\"sid\":\"异常:执行client抛出的异常\"}}";
}catch(URISyntaxException e){
e.printStackTrace();
return "{\"data\":{\"sid\":\"异常:URI抛出的异常,非要我处理,烦人\"}}";
}catch(UnknownHostException e){
e.printStackTrace();
return "{\"data\":{\"sid\":\"异常:没什么大毛病,可能是服务器崩了,可能是本地断网了,也可能是我把网址写错了\"}}";
}catch(IOException e){
e.printStackTrace();
return "{\"data\":{\"sid\":\"异常:居然真发生IO异常了?\"}}";
}finally{
if (entity != null) {
try {
EntityUtils.consume(entity);
} catch (IOException e) {
e.printStackTrace();
}
}
if (client != null) {
try {
//关闭连接
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}//finally的结束大括号
}//end getUrlResponse()
/**
* 传入 userName 和 用户密码 获取到sessionId
* @param userName
* @param pwd
* @return sid
*看看看 上面为啥不直接返回JSONObject
*/
public String getSessionId(String userName,String pwd) {
String url="http://******/portal/r/jd?userid="+userName+"&pwd="+pwd+"&rememberMeUid=on&rememberMePwd=on&lang=cn&cmd=CLIENT_USER_LOGIN&sid=&deviceType=pc";
JSONObject json=(JSONObject)JSONObject.fromObject(getUrlResponse(url));//
logger.info("不出意外的话是登陆成功了,当前用户:"+userName);
return json.getJSONObject("data").getString("sid");
}
/**
* 获取当前工单数
* @param userName
* @param pwd
* @return 工单数
*/
public Integer getCount(String userName,String pwd){
sid=getSessionId(userName,pwd);
// System.out.println(sid);
//嗯 不管下面发生了什么异常这里都有有sid 区别为是否为"异常:"开头,
//这里需要sessionId.indexOf(str)判断下是异常信息还是正常信息,或者这里可以写一个工具类,判断是否为异常信息
//工具类的话,下面这每一步都可以用,
String url="http://*********/portal/r/jd?cmd=com.actionsoft.apps.workbench_con_task&sid="+sid+"&runType=1";
JSONObject json=(JSONObject)JSONObject.fromObject(getUrlResponse(url));
int count=Integer.parseInt(json.getJSONObject("data").getString("count"));
logger.info("当前工单数:"+count);
return count;
}
/**通过sessionId 获取工单列表的json集
* 获取工单信息
* @return jsonArray
*/
public JSONArray getTask(){
String url="http://**************/portal/r/jd?cmd=com.actionsoft.apps.workbench_con_taskdata&sid="+sid;
JSONArray jsonArr= JSONArray.fromObject(getUrlResponse(url));
return jsonArr;
}
/**
* 遍历jsonArr判断社区信息
* @return List<UserLink>
*/
public List<UserLink> selectArray(JSONArray jsonArr,String sq){
//临时变量用
JSONObject ask=null;
List<UserLink> userList = new ArrayList<UserLink>();
UserLink userLink=new UserLink();
//遍历当前jsonArray
for(int i=0;i<jsonArr.size();i++){
ask=jsonArr.getJSONObject(i);
userLink.setOrderno(ask.getString("ORDERNO"));
userLink.setCommun(ask.getString("COMMUNITYNAME"));
userLink.setLink(ask.getString("LINKADDRESS"));
userLink.setTaskid(ask.getString("INSTANCEID"));
userLink.setTal(ask.getString("LINKTEL"));
userLink.setLinkMan(ask.getString("LINKMAN"));
userLink.setCustomerno(ask.getString("CUSTOMERNO"));
logger.info(userLink.toString());
//这里使用传入的正则匹配社区名称,满足添加到userList中
if(Pattern.matches(sq, userLink.getCommun())){
logger.info("社区名称:"+userLink.getCommun());
userList.add(userLink);
}
}
return userList;
}
/**
* 接单
* @return
*/
private String chackTask(UserLink userLink){
String url="http://******/portal/r/jd?cmd=com.actionsoft.apps.workbench_con_taskid&sid="+sid+"&taskid="+userLink.getTaskid();
String chackLog=getUrlResponse(url);
return chackLog;
}
//都导的什么包也记录下吧,毕竟我这么菜,是吧
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.regex.Pattern;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;
import org.junit.Test;
import *************************UserLink;
置于上面为啥sid直接用了? 我定了一个全局变量啊!哈!哈!哈!哈!咳!咯!
// run方法 正常当然不会跟上面的方法在同一个类中,但是测试嘛,今天先记录下,明天加到定时器里调行不?
private String sid="";
private Logger logger = Logger.getLogger("console");
@Test
public void run() throws Exception{
String userName="username";
String pwd="123456";
//选定社区的正则
String sq="****|****";
logger.info("------------------------------------------");
int count=getCount( userName, pwd);
//当前有工单
if(count>0){
List<UserLink> taskList = selectArray(getTask(),sq);
ListIterator<UserLink> tasIter=taskList.listIterator();
while(tasIter.hasNext()){
//一个UserLink对象
UserLink userLink = tasIter.next();
logger.info("懒得拆了,就这么存吧"+chackTask(userLink));
}
}
}
嗯。。还有个实体类
package **************.pojo;
public class UserLink {
//INSTANCEID
private String taskid;
//工单编号
private String orderno;
//社区
private String commun;
//详细地址
private String link;
//电话号
private String tal;
//用户名
private String linkMan;
//账号
private String customerno;
public UserLink(){
}
public UserLink(String taskid, String orderno, String commun, String link,
String sheq, String tal, String linkMan, String customerno) {
super();
this.taskid = taskid;
this.orderno = orderno;
this.commun = commun;
this.link = link;
this.tal = tal;
this.linkMan = linkMan;
this.customerno = customerno;
}
@Override
public String toString() {
return ", 工单编号=" + orderno +
", 用户名=" + linkMan +
", 账号=" + customerno +
", 社区="+ commun +
", 地址=" + link +
", 电话=" + tal+
"User [taskid=" + taskid +
"]";
}
public String getTaskid() {
return taskid;
}
public void setTaskid(String taskid) {
this.taskid = taskid;
}
public String getOrderno() {
return orderno;
}
public void setOrderno(String orderno) {
this.orderno = orderno;
}
public String getCommun() {
return commun;
}
public void setCommun(String commun) {
this.commun = commun;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getTal() {
return tal;
}
public void setTal(String tal) {
this.tal = tal;
}
public String getLinkMan() {
return linkMan;
}
public void setLinkMan(String linkMan) {
this.linkMan = linkMan;
}
public String getCustomerno() {
return customerno;
}
public void setCustomerno(String customerno) {
this.customerno = customerno;
}
}
定时器在这里,定时器的话,有个坑,定时器我试了好几个,都不行,都是最多运行一次就结束了,最后忽然想到时junit的锅
但是前面试过的定时器都删了只剩这个了
/**
* 定时器 这里无法使用junit测试
* 因为junit也是线程
* @param args
*/
public static void main(String args[]){
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// new testDingShiQi().test();
}
}, 0, 10, TimeUnit.SECONDS);//seconds 是秒
}
,还是存下连接吧
几种定时器