免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19824 | 回复: 14

【教程】模拟登陆百度之Java代码版 [复制链接]

论坛徽章:
0
发表于 2013-09-17 20:39 |显示全部楼层
本帖最后由 crifan 于 2013-09-17 20:40 编辑

原发于:
【教程】模拟登陆百度之Java代码版



【背景】
之前已经写了教程,分析模拟登陆百度的逻辑:
【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
然后又去用不同的语言:
Python的:
【教程】模拟登陆网站 之 Python版(内含两种版本的完整的可运行的代码)
C#的:
【教程】模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码)
去实现对应逻辑。
此处,继续尝试,用Java代码,实现这套,模拟登陆百度,的逻辑。
【折腾过程】
1.之前已经整理了一些Java代码:
http://code.google.com/p/crifanlib/source/browse/trunk/java/crifanLib.java
现在是:
继续去丰富此套库。
然后把模拟登陆百度的逻辑模拟出来。
2.期间,想要实现Java的函数的默认参数,结果却发现不支持:
【已解决】Java中函数的默认参数
3.然后就是一点点去写代码,去调试了。
4.期间,出错了:
【基本解决】java中没法new:Cannot instantiate the type HttpParams
5.再去搞懂参数配置:
【整理】关于Java中的httpClient中可以传入的参数
6.再继续写代码,期间遇到各种问题,基本都解决了:
【已解决】Java代码中new List时出错:Cannot instantiate the type List<NameValuePair>
【已解决】实现Java中控制台中输入字符串
【无需解决】Java代码new BasicNameValuePair时出错:The constructor BasicNameValuePair(String, boolean) is undefined
【已解决】Java中实现{String, boolean}类型的字典Dict变量
【已解决】Eclipse中用java代码去new Date结果出错:The constructor Date(String) is deprecated
【暂未解决】Eclipse中调试Java代码期间如何修改值
【已解决】Java中的new Date所得的年份异常:传入2043年结果却是3943年

7.最终,完成了,主体代码为:
  1. /**
  2. * [File]
  3. * EmulateLoginBaidu.java
  4. *
  5. * [Function]
  6. * Use Java code to emulate login baidu
  7. *
  8. * 【教程】模拟登陆百度之Java代码版
  9. * http://www.crifan.com/emulate_login_baidu_use_java_code
  10. *
  11. * [Version]
  12. * v1.0, 2013-09-17
  13. *
  14. * [Note]
  15. * 1. need add apache http lib:
  16. * 【已解决】Eclipse的java代码出错:The import org.apache cannot be resolved
  17. * http://www.crifan.com/java_eclipse_the_import_org_apache_cannot_be_resolved/
  18. * 2.need crifanLib.java
  19. * http://code.google.com/p/crifanlib/source/browse/trunk/java/crifanLib.java
  20. *
  21. * [History]
  22. * [v1.0]
  23. * 1. initial version, finally successfully emulate login baidu using java code.
  24. */

  25. //import java.io.IOException;
  26. import java.util.ArrayList;
  27. //import java.util.Calendar;
  28. //import java.util.Date;
  29. //import java.util.GregorianCalendar;
  30. import java.util.HashMap;
  31. //import java.util.Hashtable;
  32. import java.util.List;
  33. //import java.util.Map;
  34. import java.util.Scanner;
  35. import java.util.regex.Matcher;
  36. import java.util.regex.Pattern;

  37. import org.apache.http.HttpResponse;
  38. import org.apache.http.NameValuePair;
  39. import org.apache.http.cookie.Cookie;
  40. //import org.apache.http.impl.cookie.BasicClientCookie;
  41. //import org.apache.http.impl.cookie.BasicClientCookie2;
  42. import org.apache.http.message.BasicNameValuePair;

  43. //import crifanLib;

  44. /**
  45. * @author CLi
  46. *
  47. */
  48. public class EmulateLoginBaidu {
  49.     static crifanLib crl;

  50.     /**
  51.      * @param args
  52.      */
  53.     public static void main(String[] args) {
  54.         crl = new crifanLib();
  55.                  
  56.         // TODO Auto-generated method stub
  57.         EmulateLoginBaiduUsingJava();
  58.     }

  59.     // emulate login baidu using java code  
  60.     public static void EmulateLoginBaiduUsingJava()
  61.     {
  62.         System.out.println("============ 程序说明 ============");
  63.         System.out.println("功能:本程序是用来演示使用Java代码去实现模拟登陆百度");
  64.         System.out.println("注意事项:部分百度账户,在登陆时会出现:");
  65.         System.out.println("1.部分百度账户,在登陆时会出现:");
  66.         System.out.println("系统检测到您的帐号疑似被盗,存在安全风险。请尽快修改密码。");
  67.         System.out.println("此时,本程序,无法成功模拟登陆,请自行按照提示去修改密码后,就可以了。");
  68.          
  69.         boolean bLoginBaiduOk = false;
  70.         List<Cookie> curCookieList;
  71.          
  72.         //step1: login baidu, got cookie BAIDUID
  73.         System.out.println("====== 步骤1:获得BAIDUID的Cookie ======");
  74.         String strTokenValue = "";
  75.         boolean bGotCookieBaiduid = false;
  76.         String strBaiduUrl = "http://www.baidu.com/";
  77.         HttpResponse baiduResp = crl.getUrlResponse(strBaiduUrl);
  78.          
  79.         curCookieList =crl.getCurCookieStore().getCookies();
  80.         crl.dbgPrintCookies(curCookieList, strBaiduUrl);
  81.         for(Cookie ck : curCookieList)
  82.         {
  83.             String cookieName = ck.getName();
  84.             if(cookieName.equals("BAIDUID"))
  85.             {
  86.                 bGotCookieBaiduid = true;
  87.             }
  88.         }
  89.         if (bGotCookieBaiduid)
  90.         {
  91.             System.out.println("正确:已找到cookie BAIDUID");
  92.         }
  93.         else
  94.         {
  95.             System.out.println("错误:没有找到cookie BAIDUID !");
  96.         }
  97.          
  98.         //step2: login, pass paras, extract resp cookie
  99.         System.out.println("====== 步骤2:提取login_token ======");
  100.         boolean bExtractTokenValueOK = false;
  101.         if(bGotCookieBaiduid)
  102.         {
  103.             //https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true
  104.             String getapiUrl = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true";
  105.             String getApiRespHtml = crl.getUrlRespHtml(getapiUrl);
  106.             
  107.             curCookieList =crl.getCurCookieStore().getCookies();
  108.             crl.dbgPrintCookies(curCookieList, getapiUrl);

  109.             //bdPass.api.params.login_token='3cf421493884e0fe9080593d05f4744f';
  110.             Pattern tokenValP = Pattern.compile("bdPass\\.api\\.params\\.login_token='(?<tokenVal>\\w+)';");
  111.             Matcher tokenValMatcher = tokenValP.matcher(getApiRespHtml);
  112.             //boolean foundTokenValue = tokenValMatcher.matches(); // will not match, but can search to find it
  113.             boolean foundTokenValue = tokenValMatcher.find();
  114.             if(foundTokenValue)
  115.             {
  116.                 strTokenValue = tokenValMatcher.group("tokenVal"); //3cf421493884e0fe9080593d05f4744f
  117.                 System.out.println("正确:找到 bdPass.api.params.login_token=" + strTokenValue);
  118.                  
  119.                 bExtractTokenValueOK = true;
  120.             }
  121.             else
  122.             {
  123.                 System.out.println("错误:没找到bdPass.api.params.login_token !");
  124.             }
  125.         }
  126.          
  127.         //step3: verify returned cookies
  128.         if (bGotCookieBaiduid && bExtractTokenValueOK)
  129.         {
  130.             System.out.println("======步骤3:登陆百度并检验返回的Cookie ======");
  131.             
  132.             /*
  133.             //Note:
  134.             //here, has verify, not manually update some cookie's domain and expiry
  135.             //also can emulate baidu successfully
  136.             
  137.             //do some workaround to makesure here cookie H_PS_PSSID not expire
  138.             //[version: 0][name: H_PS_PSSID][value: 3359_3341_2776_1424_2981][domain: .baidu.com][path: /][expiry: null]
  139.             
  140.             //Thu Sep 17 14:22:08 CST 2043
  141.             //Date newExpiryDate = new Date(2043, 9, 17);
  142.             Date newExpiryDate = new Date(143, 9, 17);
  143.             //Calendar newExpiryCalendar = new GregorianCalendar(2043, 9, 17, 14, 22, 8);
  144.             
  145.             BasicClientCookie hPsPssidCookie = null;
  146.             BasicClientCookie dbsvrtmCookie = null;
  147.             //int hPsPssidCookieIdx = 0;
  148.             
  149.             curCookieList = crl.getCurCookieList();
  150.             for(Cookie ck : curCookieList)
  151.             {
  152.                 if(ck.getName().equalsIgnoreCase("H_PS_PSSID"))
  153.                 {
  154.                     //hPsPssidCookieIdx = curCookieList.indexOf(ck);
  155.                     hPsPssidCookie = (BasicClientCookie) ck;
  156.                     hPsPssidCookie.setExpiryDate(newExpiryDate);
  157.                     ck = hPsPssidCookie;
  158.                     //break;
  159.                 }
  160.                  
  161.                 if(ck.getName().equalsIgnoreCase("BDSVRTM"))
  162.                 {
  163.                     dbsvrtmCookie = (BasicClientCookie) ck;
  164.                     dbsvrtmCookie.setDomain(".baidu.com");
  165.                     dbsvrtmCookie.setExpiryDate(newExpiryDate);
  166.                     ck = dbsvrtmCookie;
  167.                     //break;
  168.                 }
  169.             }
  170.             crl.setCurCookieList(curCookieList);
  171.             */

  172.             
  173.             String staticPageUrl = "http://www.baidu.com/cache/user/html/jump.html";

  174.             List<NameValuePair> postDict = new ArrayList<NameValuePair>();
  175.             //ArrayList<NameValuePair> headerDict = new ArrayList<NameValuePair>();
  176.             //postDict.add(new BasicNameValuePair("ppui_logintime", ""));
  177.             postDict.add(new BasicNameValuePair("charset", "utf-8"));
  178.             //postDict.add(new BasicNameValuePair("codestring", ""));
  179.             postDict.add(new BasicNameValuePair("token", strTokenValue));
  180.             postDict.add(new BasicNameValuePair("isPhone", "false"));
  181.             postDict.add(new BasicNameValuePair("index", "0"));
  182.             //postDict.add(new BasicNameValuePair("u", ""));
  183.             //postDict.add(new BasicNameValuePair("safeflg", "0"));
  184.             postDict.add(new BasicNameValuePair("staticpage", staticPageUrl));
  185.             postDict.add(new BasicNameValuePair("loginType", "1"));
  186.             postDict.add(new BasicNameValuePair("tpl", "mn"));
  187.             postDict.add(new BasicNameValuePair("callback", "parent.bdPass.api.login._postCallback"));
  188.             
  189.             //get input baidu username and password
  190.             String strBaiduUsername = "";
  191.             String strBaiduPassword = "";
  192.             Scanner inputReader = new Scanner(System.in);
  193.             System.out.println("Please Enter Your:" );
  194.             System.out.println("Baidu Username:" );
  195.             strBaiduUsername = inputReader.nextLine();
  196.             //System.out.println("You Entered Username=" + strBaiduUsername);
  197.             System.out.println("Baidu Password:" );
  198.             strBaiduPassword = inputReader.nextLine();
  199.             //System.out.println("You Entered Password=" + strBaiduPassword);
  200.             inputReader.close();

  201.             postDict.add(new BasicNameValuePair("username", strBaiduUsername));
  202.             postDict.add(new BasicNameValuePair("password", strBaiduPassword));
  203.             
  204.             postDict.add(new BasicNameValuePair("verifycode", ""));
  205.             postDict.add(new BasicNameValuePair("mem_pass", "on"));

  206.             String baiduMainLoginUrl = "https://passport.baidu.com/v2/api/?login";
  207.             String loginBaiduRespHtml = crl.getUrlRespHtml(baiduMainLoginUrl, null, postDict);
  208.             
  209.             //Map cookieNameDict = new Map();
  210.             //Map cookieNameDict = new Hashtable();
  211.             HashMap<Object, Boolean> cookieNameDict = new HashMap<Object, Boolean>();     
  212.             cookieNameDict.put("BDUSS", false);
  213.             cookieNameDict.put("PTOKEN", false);
  214.             cookieNameDict.put("STOKEN", false);
  215.             //Set-Cookie: SAVEUSERID=deleted; expires=Mon, 17-Sep-2012 09:45:03 GMT; path=/; domain=passport.baidu.com; httponly,
  216.             //cookieNameDict.put("SAVEUSERID", false);
  217.             
  218.             curCookieList = crl.getCurCookieList();
  219.             for(Object objCookieName : cookieNameDict.keySet().toArray())
  220.             {
  221.                 String strCookieName = objCookieName.toString();
  222.                 for(Cookie ck: curCookieList)
  223.                 {
  224.                     if(strCookieName.equalsIgnoreCase(ck.getName()))
  225.                     {
  226.                         cookieNameDict.put(strCookieName, true);
  227.                     }
  228.                 }
  229.             }
  230.             
  231.             boolean bAllCookiesFound = true;
  232.             for (Object  objFoundCurCookie : cookieNameDict.values())
  233.             {
  234.                 bAllCookiesFound = bAllCookiesFound && Boolean.parseBoolean(objFoundCurCookie.toString());
  235.             }

  236.             bLoginBaiduOk = bAllCookiesFound;
  237.                         
  238.             if (bLoginBaiduOk)
  239.             {
  240.                 System.out.println("成功模拟登陆百度首页!" );
  241.             }
  242.             else
  243.             {
  244.                 System.out.println("模拟登陆百度首页 失败!");
  245.                 System.out.println("所返回的HTML源码为:" + loginBaiduRespHtml);
  246.             }
  247.         }

  248.         return;
  249.     }
  250. }
复制代码

正常,成功模拟登陆百度的输出为:

emulate-login-baidu-normal-output_thumb.png

8.完整的Eclipse下面的代码下载:
EmulateLoginBaidu_java_2013-09-17_crifanLibVersion.7z (14.29 KB, 下载次数: 194)

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2013-09-19 18:30 |显示全部楼层
用HttpClient就方便许多

论坛徽章:
0
发表于 2013-09-20 20:46 |显示全部楼层
本帖最后由 crifan 于 2013-09-20 20:47 编辑

回复 2# rover12421


   1.我本来就是用的HttpClient
   2.不知道高手有何更好的建议,如何"更方便"?

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2013-09-21 15:35 |显示全部楼层
1.第一次还真没看出你用了httpclient,原来是自己封装了一层
2.httpclient本身就维护了cookies,根本不需要自己处理
3.crifanLib里每次请求都new一个httpClient,根本就不合理,难怪你要自己维护cookies
4.建议你看看xmlrpc对httpclient的封装,那个才叫漂亮,你这样封装还不如不封装,用起来比原来还累.httpclient直接post String,在很多情况下不需要自己那么累的构建一个list,很多时候也使用者也不太愿意把一个post的string变成list来用
5.校验也可以不用从cookies里判断,既然已经的到了请求的html,为何不从html里找特征校验呢

论坛徽章:
0
发表于 2013-09-22 09:38 |显示全部楼层
回复 4# rover12421


    1.第一次还真没看出你用了httpclient,原来是自己封装了一层
2.httpclient本身就维护了cookies,根本不需要自己处理
有空再去看看,httpClient是如何自动处理cookie的。

3.crifanLib里每次请求都new一个httpClient,根本就不合理,难怪你要自己维护cookies
谢谢批评,抽空去研究研究。

4.建议你看看xmlrpc对httpclient的封装,那个才叫漂亮,你这样封装还不如不封装,用起来比原来还累.httpclient直接post String,在很多情况下不需要自己那么累的构建一个list,很多时候也使用者也不太愿意把一个post的string变成list来用
post data,是list而不是处理后的xxx=yyy&xxx=yyy,目的就是减少用户手动处理。
“很多时候也使用者”
可否给出一些比较经典的用例,供偶参考看看?

5.校验也可以不用从cookies里判断,既然已经的到了请求的html,为何不从html里找特征校验呢
校验的思路,从html找特征和cookie中找cookie,理论上,都是可以的。
但是个人觉得cookie更靠谱。
另外,库中提供了get和set cookie的功能,目的是为了有些特殊情况下,需要用户手动修改cookie,比如更改domain,供访问另外一个url使用。
所以才有操作cookie的功能。
而此处,正好就可以用得上获得当前cookie的功能。
到底是用html还是cookie去校验,纯属个人偏好。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2013-09-22 12:21 |显示全部楼层
回复 5# crifan


    4.很多时候都是先截包,但是截包工具能直接复制出来的肯定是String,如果需要修改的很多,肯定是希望直接使用string,而不是拆分成list.如果每一个都要参数都要该,那当然是list比较好,但是就封装而言.就算是需要list.那应该也要做到,用户直接给一个hashmap就能完成的动作,而不是让用户自己主动去做一个BasicNameValuePair的list,这样的封装意义不大.建议这样的直接传里一个hashmap.至于hashmap怎么变成一个BasicNameValuePair的list才是你封装要做的事.
      怎么post一个string,给你一个例子:
  1. StringEntity entity = new StringEntity(string, charset);
  2.                 entity.setContentType("application/x-www-form-urlencoded; charset=" + charset);

  3. post.setEntity(entity);
复制代码
HttpEntity有很多继承类,可以多看看

---------------
httpclient的本身就支持cookies的设置和修改.而且我并没看出的你对cookies的封装比httpclient的好,对用户来说,从你的封装操作cookies和直接对httpclient上操作cookies步骤是一样的,而对httpclient来说,你却反而多了一步,并且你并没给用户带来直接对httpclient更方便和快捷的一面,这样的封装有必要吗?
如果要封装cookies操作,当然是要提供直接针对"key","vaule"的操作(添加,删除,修改),这是httpclient原本没有的,而且能大大方便用户为达到此目的代码复杂度.
--------------
封装固然是好,但是要先对封装的对象做一个比较深入一点的了解.不要为了封装而封装.

论坛徽章:
0
发表于 2013-09-22 15:36 |显示全部楼层
回复 6# rover12421


    "很多时候都是先截包,但是截包工具能直接复制出来的肯定是String,如果需要修改的很多"
我之前所了解到的:
肯定不建议,去直接拷贝出来从抓包工具分析出来的post data的string
因为:
我所遇到的,更多的时候,key和value中,key虽然不变,
但是value往往和你当前的上下文相关。
所以,最好还是:
通过抓包工具分析该value是如何获得的
然后再写代码去模拟。

对于不建议直接拷贝出来的内容,之前还写了个,供之前有人直接拷贝粘贴cookie值或者其他值,但是程序不工作的人的一些提示:
【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得
中的“写程序模拟执行过程时,不能直接拷贝分析而得的数据,而要自己用程序模拟出来

"肯定是希望直接使用string,而不是拆分成list."
对此,我个人不是很赞同:
我倒是觉得,至少我个人觉得,对于post string的话
正常的用户的用法,都是:
通过key和value去设置对应的值

而设置完毕后,再调用
Python中的urllib.urlencode
C#中的HttpUtility.UrlPathEncode
java中的UrlEncodedFormEntity
go语言中的url.Values
去进行相关的encode,才得到对应post data的string的。
在这点上,个人认为,先拿到key,value的键对再去encode为post string,更加符合http领域,通用的做法。
否则,各种语言的http的库,就至少没有必要再提供相关的encode的了。

“用户直接给一个hashmap就能完成的动作,而不是让用户自己主动去做一个BasicNameValuePair的list,”
至于key,value的键对,
由于个人不是很熟悉java
虽然之前也用过hashmap,但是此处是参考别人的做法,觉得用上BasicNameValuePair的list。
此点,经过你这个提醒,我也觉得,用hashmap可能更合适。
其也是我的本意:
就像Python中的dict,本来就应该是字典类的变量,保存这样的信息,更合适。

“HttpEntity有很多继承类,可以多看看”
是的,抽空再好好研究。谢谢提醒。

“httpclient的本身就支持cookies的设置和修改.”
我后来才看懂你的意思:
你是说,我封装后,手动操作了cookie?
实际上不是,我只是:
提供给外接get或set cookie的接口
方便用户,如果有需要的话,去操作cookie而已。
并没有额外进行cookie的管理。
因为就像你说的,httpClient本身就已经管理了cookie了。

“封装固然是好,但是要先对封装的对象做一个比较深入一点的了解.不要为了封装而封装.”
关于你这个理念,完全赞同。
我不会去为了什么而什么的。
只是,至少以自己要是一个普通用户的角度出发,觉得有封装的必要,才会去封装。
目前来说,对于java版本的getUrlRespHtml等函数来说,
自己对自己的评价是:
还是值得封装的,只是个别做法,还有待商榷和优化而已。

无论如何,欢迎继续探讨。谢谢提醒。

论坛徽章:
39
白银圣斗士
日期:2015-11-24 10:40:40酉鸡
日期:2015-03-20 14:15:44寅虎
日期:2015-03-20 14:13:59午马
日期:2015-03-20 14:13:16白羊座
日期:2015-03-20 14:12:54金牛座
日期:2015-03-20 14:12:09双子座
日期:2015-03-20 14:11:57巨蟹座
日期:2015-03-20 14:11:44狮子座
日期:2015-03-20 14:11:29亥猪
日期:2015-03-20 14:16:24戌狗
日期:2015-03-20 14:16:40申猴
日期:2015-03-20 14:17:05
发表于 2013-09-22 16:27 |显示全部楼层
本帖最后由 rover12421 于 2013-09-22 16:28 编辑

说实话,你的封装已经算不上封装了,因为你已经把原本httpclient提供的强大功能给禁锢起来只能适用你需要的情况了.
就因为你把原有的功能禁锢起来,才有了,为了提供原本已经有cookies获取和设置功能,你为了能的到这个功能不的不自己再写一个设置和获取的函数

封装很多时候是为了减少重复代码,精简代码而做的,比如你写的getUrlRespHtml,就想一步获取源码,downlodFile也是一样,想一步做到下载.但如果你熟悉httpclient你会封装的更好.
像设置header的地方.其实封装很简单,没必要让用户提供一个key-value的链,只要提供一个简单的设置头部key-value的方法既可.设置一个key-value是一行代码,往key-value的链里添加一行,也是一行代码,有时候还往往多出new这个链的一行代码.这样的封装就没必要.
而且前一种会更清晰,下一步的方法也少了一个参数.
我看你的crifanLib.java里原本打算使用外部传来的key-value的链的,不知道为后来又不用了呢?

论坛徽章:
0
发表于 2013-09-22 16:46 |显示全部楼层
本帖最后由 crifan 于 2013-09-22 16:53 编辑

回复 8# rover12421


    "我看你的crifanLib.java里原本打算使用外部传来的key-value的链的,不知道为后来又不用了呢?"
你指的是“headerDict”?
简答:
是想要用到的,只是暂时没时间,没精力,去完善这个库函数而已。

详解:
1.我此处的,java版本的getUrlRespHtml(以及还没来得及写的getUrlResponse)
都还是未完成的版本,算是初级版本,从功能角度来说,只算0.2这种级别的,里1.0的完善的功能,差很多。
像getUrlRespHtml这样的函数,对于java版本,其实还需要添加太多功能
比如:
支持(多种格式类型的)压缩
代理
设置各种默认的常用的header参数:什么user-agent等等
和用户手动设置的header参数:除了常见之前的,运行用户手动添加别的
允许用户操作cookie(以便实现更改domain等动作,实现后续访问不同的url可以真正实现发送cookie等等)
支持手动设置charset或默认自动解码为unicode
支持各种timeout的设置
等等等等。。。。
等以后有空,会继续更新的。

2. 你要是感兴趣,可以去看看我的:
v8.5的crifanLib.cs
和:
v4.7的:crifanLib.py
里面都有类似的:
getUrlRespHtml
getUrlResponse
等函数的。
那些,是已经完善(经过N次修补bug,功能增加的)更新后的。
而且还是,又额外花了很多精力,去写教程,说明如何使用该库:
详解crifan的Python库:crifanLib.py
详解crifan的C#库:crifanLib.cs

3.除此之前,还有其他语言的各种库函数,以及C#,Python等出了crifanLib的函数,都早已放出:
crifanLib
总体算上,java版本的crifanLib.java
只算功能或代码量上的,5%左右(应该是不到10%)的。
而我折腾java,也只算业余的业余,但是尽量是,接触到了,就整理出来,我认为有用的功能。
更多功能,只能等我有空再更新。

其他我写的很多东西,比如:
crifanLibAws.cs
算属于:domain lib,属于某个特定领域的,这些东西,只有用到人,才知道其价值,才知道可以帮其省多少精力的。


4.总之:
(1)当前的java版本的getUrlRespHtml,很不完善,有待后续更新。
(2)估计,只有等我的crifanLib.java,发展到1.0之后,你才能明白,我为何要封装:
保证绝大多数人的,绝大多数复杂的请求,只需通过调用getUrlRespHtml或getUrlResponse,即可完成其目的(获得需要的html或response)。

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
发表于 2013-11-29 12:44 |显示全部楼层
话说前几天用java写了投票程序。
还是比之前用c++写快的多。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP