- 浏览: 585350 次
- 来自: 北京
文章分类
最新评论
-
lidi2011:
很通俗易懂的文章,很形象。
同步synchronized方法和代码块 -
inuyasha027:
领教了,谢谢。
Hadoop安装, Hive 安装。 -
xbmujfly:
好文 ,本人发现晚了
学习笔记 - java.util.concurrent 多线程框架 -
hanazawakana:
学习学习!
ANT-build.xml文件详解 -
david.org:
似乎还忽略一点,那就是cassandra不同数据中心的同步,H ...
Cassandra Vs HBase
用到的工具和技术,排名不分先后:
1.HttpClient Apache项目组开发的在Java中模拟浏览器行为的代码库。
2.Live Http Headers 插件 此插架是FireFox下查看Http协议头的数据。
备注: 使用WireShark也可以拦截Http协议的数据,具体使用方法和下载地址请自行搜索下载。
为防止程序的自动注册,现在不管是注册还是留言一般都需要使用验证码。 而我们要完成自动注册就需要分析验证码的生成和解析验证码这两个步骤。 解析验证码这个步骤很复杂,这个程序也没有实现这个功能,需要用户根据弹出的页面自己输入验证码。
开始分析:
Tom在线,注册页面:http://bjcgi.tom.com/cgi-bin/tom_reg.cgi。 通过对此页面源代码的查看可以发现验证码生成的地址。
<td><script src="http://login.tom.com/captcha/drawme.php?type=6"> </script><script> var d =new Date();d.setTime(d.getTime()+60*60*1000);document.cookie='post_key=dcf5e3a556853ef44529e00a09c7284c;expires='+d.toGMTString()+';domain='+_gg_dm();document.write("<img title='看不清?点击更换验证码!' alt='看不清?点击更换验证码!' id='v_i_0980t' onclick=\"rewriteimg();\" src=http://login.tom.com/captcha/draw.php?post_key=dcf5e3a556853ef44529e00a09c7284c&type=6>"); </script><img title="看不清?点击更换验证码!" alt="看不清?点击更换验证码!" id="v_i_0980t" onclick="rewriteimg();" src="http://login.tom.com/captcha/draw.php?post_key=dcf5e3a556853ef44529e00a09c7284c&type=6"> <a href="javascript:rewriteimg();" style="color: rgb(255, 0, 0); font-weight: bold;"> 看不清楚,换一张图片 </a></td>
这个地址既是Tom在线生成验证码的页面【如果你现在浏览可以看不到验证码】,其右两个参数: post_key 和 type 。其中Type应该是指生成验证码。而post_key是一个32位的Hash值。具体是如何Hash的不清楚,因为是写在draw.php文件中的。 post_key 是验证码之外的另一层验证系统,如果你想获得正确的验证码必须要有一个post_key分析网易,Google的注册行为也是同样的原理。
那么既然post_key是在draw.php页面中,那有如何找到这个key呢。答案在
http://login.tom.com/captcha/drawme.php?type=6
打开上面的连接【function rewriteimg() { var a=document.createElement('script'); document.body.appendChild(a); a.src='http://login.tom.com/captcha/reset.php?type=6'+'&'+Math.random(); } function _gg_dm() { var a = document.domain.split('.'); if(a.length>=2) { return a[a.length-2]+'.'+a[a.length-1]; } else { return document.domain; } } document.write(" <script>var d =new Date();d.setTime(d.getTime()+60*60*1000);document.cookie='post_key=f377fd6144b1aab847f416aa77741055;expires='+d.toGMTString()+';domain='+_gg_dm();document.write(\"<img title='¿´²»Çå?µã»÷¸ü»»ÑéÖ¤Âë!' alt='¿´²»Ç壿µã»÷¸ü»»ÑéÖ¤Âë!' id='v_i_0980t' onclick=\\\"rewriteimg();\\\" src=http://login.tom.com/captcha/draw.php?post_key=f377fd6144b1aab847f416aa77741055&type=6>\");</script> ");】
在上面的代码中有这个链接
http://login.tom.com/captcha/reset.php?type=6
打开上面的连接【var d =new Date();d.setTime(d.getTime()+60*60*1000);document.cookie='post_key=25630b8e96724532038103efb761b57e;expires='+d.toGMTString()+';domain='+_gg_dm(); document.getElementById("v_i_0980t").src='http://login.tom.com/captcha/draw.php?post_key=25630b8e96724532038103efb761b57e&type=6';】
在上面的内容中看到 【post_key=25630b8e96724532038103efb761b57e;】这一句了吧,对了这个就是我们要找的key。 只要我们分析这个页面【http://login.tom.com/captcha/reset.php?type=6】就可以找到这个key。
然后就可以通过下边这个链接来生成验证码,供用户输入。因为post_key与时间有关所以如果超过一定时间下边的连接就生成不了验证码。 就像这样。
http://login.tom.com/captcha/draw.php?post_key=dcf5e3a556853ef44529e00a09c7284c&type=6
至此Tom在线的验证码生成系统分析就完成了。
网易的邮箱系统与Google的邮箱系统与此都类似:
// 网易获取验证码的地址:
// http://reg.163.com/services/getid 获取ID的
// http://divs.reg.163.com/services/crtimg?id=4c3fd8fdc6c2eea1126077566f91876c95fdbc35 根据上边的ID生成验证码的。
HttpClient的使用方式请参照附件中的HttpClient的说明文档。
至于程序里边用到的HTTP Header 信息。请使用Live Http Header 插件在进行模拟注册的时候进行拦截,并记录。
完整的代码;
package com.cache.http; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import java.util.Scanner; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; /** * * #xiaobian.iteye.com * * @author phoenix_bian */ public class TomMail { public static void main(String[] args) throws IOException { HttpClient client = new HttpClient(); client.getHostConfiguration().setHost("bjcgi.tom.com", 80, "http"); client.getHostConfiguration().setProxy("63.208.180.6", 3128); int i = 0; while (i < 100) { i++; String userName = createUserName(); HttpMethod method = getPostMethod(userName); // 使用 POST 方式提交数据 // HttpMethod method = getGetMethod(); // 使用 Get 方式提交数据 client.executeMethod(method); // 打印服务器返回的状态 String response = new String(method.getResponseBodyAsString() .getBytes("ISO-8859-1")); // 打印返回的信息 // System.out.println(response); if (response.indexOf("" + userName + ",恭喜您成功注册TOM免费邮箱!") != -1) { System.out.println(userName + " 注册成功"); appendToFile("c:\\user.txt", userName + " " + "12345678\n"); } method.releaseConnection(); try { Thread.sleep(1000 * 60); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 使用 POST 方式提交数据 * * @return * @throws IOException * @throws HttpException */ private static HttpMethod getPostMethod(String userName) throws HttpException, IOException { // 要POST的URL PostMethod post = new PostMethod("/cgi-bin/tom_reg.cgi"); // 要POST的参数 NameValuePair[] values = new NameValuePair[15]; values[0] = new NameValuePair("funcid", "reguser"); values[1] = new NameValuePair("refer", "http://mail.tom.com/"); values[2] = new NameValuePair("year", "1980"); values[3] = new NameValuePair("month", "1"); values[4] = new NameValuePair("day", "1"); values[5] = new NameValuePair("argee", "1"); values[6] = new NameValuePair("idnum", "4401"); values[7] = new NameValuePair("uid", userName); values[8] = new NameValuePair("password", "12345678"); values[9] = new NameValuePair("confirm_password", "12345678"); values[10] = new NameValuePair("safemail", "abc@gmail.com"); values[11] = new NameValuePair("question", "My Mom's birthday"); values[12] = new NameValuePair("answer", "1951-11-11"); values[13] = new NameValuePair("argee_c", "on"); String post_key = getPostKey(); String address = "http://login.tom.com/captcha/draw.php?post_key=" + post_key + "&type=6"; open(address); Scanner scanner = new Scanner(System.in); System.out.print("请您输入验证码:"); String verifyCode = scanner.next(); values[14] = new NameValuePair("authcode", verifyCode); post.setRequestBody(values); post.setRequestHeader("Host", "bjcgi.tom.com"); post .setRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; CIBA)"); post .setRequestHeader( "Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash"); post.setRequestHeader("Accept-Language", "zh-cn"); post.setRequestHeader("Accept-Encoding", "gzip,deflate"); post.setRequestHeader("Referer", "http://bjcgi.tom.com/cgi-bin/tom_reg.cgi"); post.setRequestHeader("Cookie", "post_key=" + post_key + ""); post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 注册成功 <div // class="RegSuc_Info"><span>bianbian0202,恭喜您成功注册TOM免费邮箱!</span></div> return post; } private static String createUserName() { return "phoenix_" + String.valueOf(new Random().nextInt()); } public static final String randomString(int length) { Random randGen = null; char[] numbersAndLetters = null; Object initLock = new Object(); if (length < 1) { return null; } if (randGen == null) { synchronized (initLock) { if (randGen == null) { randGen = new Random(); numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz") .toCharArray(); } } } char[] randBuffer = new char[length]; for (int i = 0; i < randBuffer.length; i++) { randBuffer[i] = numbersAndLetters[randGen.nextInt(20)]; // randBuffer[i] = numbersAndLetters[randGen.nextInt(35)]; } return new String(randBuffer); } private static void open(String address) { Runtime rt = Runtime.getRuntime(); try { rt.exec("C:\\Program Files\\Internet Explorer\\iexplore.exe " + address); } catch (Exception e) { e.printStackTrace(); } finally { rt.gc();// 强制回收 } } // 获取Tom网的Post_Key private static String getPostKey() throws HttpException, IOException { HttpClient client = new HttpClient(); // 设置代理服务器地址和端口 // client.getHostConfiguration().setProxy("63.208.180.6", 3128); // 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https HttpMethod method = new GetMethod( "http://login.tom.com/captcha/reset.php?type=6"); // 使用POST方法 // HttpMethod method = new PostMethod("http://www.7y8.com/V/ip.asp"); client.executeMethod(method); // 打印服务器返回的状态 System.out.println(method.getStatusLine()); // 打印返回的信息 String result = method.getResponseBodyAsString(); // 释放连接 method.releaseConnection(); int beginIndex = result.indexOf("post_key=") + "post_key=".length(); int endIndex = result.indexOf(";expires"); String post_key = result.substring(beginIndex, endIndex); return post_key; } /** * * * @param fileName * @param content */ public static void appendToFile(String fileName, String content) { try { File f = new File(fileName); if (!f.exists()) { if (!new File(f.getParentFile().toString()).exists()) new File(f.getParentFile().toString()).mkdirs(); f.createNewFile(); } FileWriter writer = new FileWriter(fileName, true); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } }
- HttpClient库的使用.rar (15.4 KB)
- 下载次数: 260
评论
①client.getHostConfiguration().setHost("bjcgi.tom.com", 80, "http");中所设置的地址我可以如下设置:
PostMethod post = new PostMethod("http://bjcgi.tom.com/cgi-bin/tom_reg.cgi"); 我想问下它们到底有什么区别?一般情况下下用哪一种比较好些。
②“post.setRequestHeader”的目的是干嘛?是不是一定要对其进行设置,为什么有些我不设置它也能进行访问呢?
③我们知道点击“注册”之后都会进入一个访问后台的地址,为什么我们在不知道这个地址的情况下也能注册成功?
不好意思,由于本人是个初学者,还望您能替我解答这几个疑问,本人在此非常感谢!
发表评论
-
Cassandra Vs HBase
2011-03-31 17:27 2106Cassandra vs HBaseBy Vaibhav Pu ... -
Slope one:简单高效的推荐算法
2011-03-31 17:16 2696推荐系统最早在亚马逊的网站上应用,根据以往用户的购买行为, ... -
Hive 与 Hbase 的简单区别
2011-03-28 11:10 4157Hive是為簡化編寫MapReduce程序而生的,使用MapR ... -
Java对象缓存系统的实现,实现了LRU算法,并可以进行集群同步
2009-08-05 17:32 3686LRU算法实现: package com.javaeye.x ... -
Unsupported major.minor version 49.0
2009-07-14 16:03 1519http://www.blogjava.net/Unmi/ar ... -
Apache Commons Logging 是如何决定使用哪个日志实现类的
2009-07-14 16:01 1666http://www.blogjava.net/Unmi/ar ... -
Spring Quartz 任务调度
2009-07-07 10:22 2199要执行的任务类:CronTask pa ... -
利用java.util.concurrent包实现多线程开发
2009-06-23 16:09 2585有一个网站列表,我们分别使用单线程和多线程来测试这个网站是否允 ... -
Ngnix初探
2009-06-15 17:03 3176Nginx是什么? ... -
使用eclipse生成文档 javadoc
2009-06-15 10:20 13981,在项目列表中按右键,选择Export(导出),然后在Exp ... -
Java 日期类操作
2009-06-11 14:43 2278java之中操作日期的类分别为: #系统的日期时间类 ... -
留个记号。
2009-06-10 16:01 1015Comparable Comparator具体区别 h ... -
Java中java.io.Serializable接口的应用
2009-06-10 10:33 2534在Java中java.io.Serializable 用于实现 ... -
Java中的克隆功能的应用
2009-06-09 13:30 1633在JAVA中对象的克隆有的时候是必要的,克隆分两种:浅克隆、深 ... -
判断SQL注入的字符
2009-06-08 13:13 1434判断SQL注入的字符 public static bo ... -
ThreadLocal的设计与使用(原理篇)
2009-06-05 17:17 1072在jdk1.2推出时开始支持java.lang.ThreadL ... -
探索Java类加载机制
2009-06-05 10:34 1703java虚拟【java.dll】存在于JRE目中下的bin目录 ... -
Nagios介绍
2009-05-26 13:33 1670系统管理员如何能够监视大量的机器和服务以便提前解决问题防止人们 ... -
Memecached实现缓存系统搭建。
2009-05-25 17:51 28281.在windows系统或Linux系统上安装memecach ... -
Java动态代理实现。
2009-05-25 13:33 924HelloWorld.java 接口文件 public i ...
相关推荐
在Java编程中,HttpClient库是Apache提供的一款强大的HTTP客户端工具,用于执行HTTP请求,包括GET、POST、PUT等多种HTTP方法。在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站...
本文将深入探讨如何使用HttpClient库来实现一个自动注册网站的功能。这个“httpclient自动注册网站”的项目涉及了HTTP协议的理解、HttpClient库的使用,以及模拟POST请求进行数据提交等关键知识点。 首先,...
httpclient常用封装工具 doGet(String url, Map, String> param) doPost(String url, Map, String> param) doPostJson(String url, String json)
下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,我们需要导入必要的Apache HttpClient库,通常包含以下依赖: ```xml <groupId>org.apache.httpcomponents <artifactId>httpclient ...
Java HttpClient 是一个强大的HTTP客户端库,它允许Java开发者在应用程序中发送HTTP请求并接收响应,广泛应用于Web服务的调用、API接口测试以及自动化脚本等场景。在Java项目中,使用HttpClient可以实现与Web服务器...
综上所述,通过Java的HttpClient库,可以在Eclipse环境中编写程序,实现从指定URL下载文件到本地的功能。通过理解HttpClient的工作原理和提供的API,开发者可以构建出稳定、高效的文件下载解决方案。
1. JAVA HttpClient库的使用 2. HTTPS协议的使用 3. SSL/TLS证书的使用 4. X509TrustManager的使用 5. DefaultHttpClient类的使用 6. HttpClient的自定义 7. POST请求的发送 8. 请求头和请求体的指定 9. HTTPS服务器...
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 ...通过上述示例和解释,你应该能够理解和掌握如何使用Java HttpClient库来发送GET和POST请求,这对于开发Web应用程序或与API接口交互至关重要。
在Java编程中,HttpClient是一个非常重要的库,常用于执行HTTP请求。当涉及到HTTPS接口调用时,HttpClient可以处理加密通信,确保数据传输的安全性。在这个主题中,我们将深入探讨如何在Java中使用HttpClient来实现...
在 Arduino 开发环境中,HttpClient 库是一个非常重要的工具,它允许开发者通过 Arduino 板与互联网进行通信,执行 HTTP 请求,从而获取或发送...理解并熟练使用 HttpClient 库,将极大地扩展 Arduino 的网络通信能力。
Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理、重试策略、超时设置等,使得在Java中进行网络通信变得更加便捷。HttpClient库不仅支持基本的HTTP协议,还支持HTTPS以及一些...
java httpclient 所需要的包,都是最新版的 commons-logging-1.1.3.jar commons-codec-1.6.jar commons-httpclient-3.1.jar
请注意,HttpClient库在Java 11之后已被弃用,官方推荐使用Java的内置`java.net.http.HttpClient`。然而,由于HttpClient的广泛使用和丰富的功能,它仍然是许多项目的首选,特别是在Java 8及更早版本的项目中。 在...
用java实现httpclient请求的类
Java HttpClient 是一个强大的网络通信库,它允许Java开发者在应用程序中实现HTTP和HTTPS协议的请求。这个工具类在电商开发中特别有用,因为通常需要与各种Web服务进行交互,如商品信息抓取、订单同步、用户反馈处理...
在标题和描述中提到的"Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)",是使用HttpClient库时必须包含的三个关键依赖文件。 首先,`httpclient.jar`是Apache HttpClient的核心库...
这个样例项目旨在帮助初学者理解如何在Java中使用HttpClient来与Web服务器进行交互。 在JavaHttpProject这个项目中,你可以找到以下关键知识点: 1. **HttpClient的创建**:首先,你需要创建一个HttpClient实例。...
本实例将深入探讨如何在Java中使用HttpClient进行网络通信。 首先,你需要在项目中引入HttpClient的相关依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...
HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。它提供了一种简单而强大的方式来处理HTTP协议,包括发送GET、POST等请求以及管理持久性连接。在本例中,我们将探讨如何使用...
8. **示例代码与文档**:为了方便开发者使用,HttpClient库应该提供详细的API文档和使用示例,帮助他们快速上手。 在压缩包中的`HttpClient.cpp`和`HttpClient.h`文件,很可能是库的实际实现和头文件,包含了上述...