于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
看文章的时候如果,对你有那么一点点的启发,记得要鼓励一下我啊,因为我是一个爱古力少年。。