于Java网络爬虫---模拟txt文件上传操作。

  业务需求是这样的,公司400业务中客户使用的,400电话号码,可以添加多个目的码你可以理解为转接号码;

这些配置的目的码我们会在网关服务器上配置成白名单,既拥有某些权限。先提出的要求是先添加或者变动目的码要及时同步到网关。

场景:

  1.我们的网关服务器接受的白名单(目的码)是已txt文件上传的,数据按照制定的格式保存在txt里面。

  2.利用Java网络爬虫模拟txt文件上传。------2018-4-7现在不写了,代码在公司电脑上明天总结一下在写。

 

public static void main(String[] args) throws IOException {
String urls="http://localhost:5080/9-6backup.php";
List<String> list= new ArrayList<String>();
list.add("0,0,0109999999");
list.add("0,1,0109999998");
Config400Util.postDestnum(urls, list, "admin:*******");

}
public static int postDestnum(String urls, List<String> listnum,String nameAndPass) throws IOException {
BaseLog.info("要上传到的目的地址为"+urls);
StringBuffer sb = new StringBuffer();
HttpURLConnection http = null; 
int numcode=0;
try { 
// boundary 分隔符用来分隔request请求头和请求参数,以及参数之间的分割
String boundary="----WebKitFormBoundary0bOet7zEnfvxZ9sO";
//设置代理来让fiddler监控
//Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,new InetSocketAddress("127.0.0.1", 8888));
URL url = new URL(urls);
http = (HttpURLConnection) url.openConnection(); 
http.setDoInput(true); 
http.setDoOutput(true); 
http.setUseCaches(false); 
http.setConnectTimeout(1000*20);//设置连接超时 
http.setReadTimeout(1000*60);//设置读取超时 
http.setRequestMethod("POST"); 
http.setRequestProperty("Connection", "Keep-Alive");
http.setRequestProperty("Host", "113.200.206.90:5080");
http.setRequestProperty("Accept", "text/plain, image/gif, image/jpeg, *; q=.2, */*; q=.2");
http.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary); 
http.setRequestProperty("Authorization", "Basic "+Base64.encode(nameAndPass.getBytes())); 
http.connect();
//将requestbody读取到流里面
OutputStream osw = new DataOutputStream(http.getOutputStream());
//-------------------以下是参数设置 
StringBuilder sb1 = new StringBuilder();
sb1.append("--"+boundary);
sb1.append("\r\n");
sb1.append("Content-Disposition: form-data; name=\"backupfile\"");//参数一 backupfile=0
sb1.append("\r\n");
sb1.append("\r\n");
sb1.append("0");
sb1.append("\r\n");
sb1.append("--"+boundary);
sb1.append("\r\n");
sb1.append("Content-Disposition: form-data; name=\"uploadfile\"" );//参数二 uploadfile=4
sb1.append("\r\n");
sb1.append("\r\n");
sb1.append("4");
sb1.append("\r\n");
sb1.append("--"+boundary);
sb1.append("\r\n");
sb1.append("Content-Disposition: form-data; name=\"upload\"");//参数三 upload="上传"
sb1.append("\r\n");
sb1.append("\r\n");
sb1.append("上传");
sb1.append("\r\n");
sb1.append("--"+boundary);
//-------------------以下是读取txt文件中的内容;
sb1.append("\r\n");
sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"t.txt\"");
sb1.append("\r\n");
sb1.append("Content-Type: text/plain");
sb1.append("\r\n");
sb1.append("\r\n");
byte[] three = sb1.toString().getBytes("utf-8");//前三个参数
byte[] txthead = { 0x20, 0x20, 0x20, 0x2C, 0x20, 0x20, 0x20, (byte) 0xDA, (byte) 0xB1, 0x20, 0x20, 0x2C, 0x20, 0x20, 0x20, (byte) 0xD0, (byte) 0xBA, 0x20, 0x20, 0x20, 0x0D, 0x0A };
osw.write(three); 
osw.write(txthead);
BaseLog.info("待上传目的码个数"+listnum.size()) ;
for(int i=0;i<listnum.size();i++){
String num=listnum.get(i);
//BaseLog.info("待上传目的码"+num) ;
byte[] destnum=num.getBytes("utf-8");
osw.write(destnum);
}

//----------------结尾
StringBuilder sb2 = new StringBuilder();
sb2.append("\r\n");
sb2.append("\r\n");
sb2.append("--"+boundary+"--");//结尾
sb2.append("\r\n");
byte[] foot = sb2.toString().getBytes("utf-8");
osw.write(foot); 
osw.flush(); 
osw.close(); 
BaseLog.info("访问网关返回的状态码"+http.getResponseCode()) ;
if (http.getResponseCode() == 200) { 
BufferedReader in = new BufferedReader(new InputStreamReader(http.getInputStream(), "utf-8")); 
String inputLine; 
while ((inputLine = in.readLine()) != null) { 
sb.append(inputLine); 
} 
in.close(); 
String respon= sb.toString();
if(respon.indexOf("文件上传成功")!=-1){ 
numcode=200;
BaseLog.info("要上传到的目的地址为--"+urls+"--号码上传成功!");
}else{

BaseLog.info("要上传到的目的地址为--"+urls+"--号码上传失败!");
}


} 
} catch (Exception e) { 
//BaseLog.error(e.toString());
} finally { 
if (http != null) http.disconnect(); 
}
return numcode;
}

说一下实现思路:

1.通过fiddler 抓包 获取请求头和参数,然后模拟将传递的内容拼接到字符串里面。

2.通过流读取到输出流里面模拟上传。

                            图中左侧是对应的字节码                                                                                                               图中右侧对应的是请求内容对应的字符串

  其中红线部分是对应的中文因为编码问题,导致  转化数据的时候异常 ;于是我就讲对应的字节码复制了出来

  

  然后读入流当中 哈哈问题解决!

3.调试的过程中多次上传失败,经过排查发现的多了两个空格0.0 。

4.排查错误的思路:

  首先利用fildder 来抓取正常的浏览器上传的数据--->然后对比Java模拟数据的差距!!!

怎样知道自己上java传的内容,和浏览器上传的内容是否一致呢。看下图

亲测可用!!!

使用时如果有问题可以联系我 微信 :980168808 

 

posted @ 2018-04-07 22:29  醉饮山河555  阅读(866)  评论(0编辑  收藏  举报