- 浏览: 309248 次
- 性别:
- 来自: 广州
博客专栏
-
多线程深入浅出
浏览量:48619
文章分类
最新评论
-
buffon918:
撸主1024
DB2 SQLSTATE 及其含义 -
学海无涯_小波:
我也在考驾照 累死了,不错 来几篇线程池的
Java线程及线程池专题 -
operthing:
operthing 写道
多线程——同步(synchronized)下 -
operthing:
...
多线程——同步(synchronized)下 -
ciding:
Jacarri_Chan 写道你觉得hibernate的优势和 ...
Hibernate-01-持久层发展过程
基于HttpClient 4模拟登录论坛
- 博客分类:
- java
package server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import java.util.ArrayList; import java.util.List; /** * DZ 登录与发贴 实例 * * @author Administrator aizili.com创建人 * */ public class LoginDZ extends Thread{ static final String domainurl = "http://www.aizili.com/"; //原始地址 static final String loginurl = "http://www.aizili.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes";//登录地址 static final String loginUsername = "username"; // 登录用户名 static final String loginPassword = "password"; // 密码 static final String username = "admin"; // 登录用户名(自己改) static final String password = "123456"; // 登录密码(自己改) /** * 状态码对应 HttpServletResponse 的常量详细描述 * * @author Administrator * @time 2012-4-8 12:24 */ static class HttpStatus { static int SC_MOVED_TEMPORARILY = 301; // 页面已经永久移到另外一个新地址 static int SC_MOVED_PERMANENTLY = 302; // 页面暂时移动到另外一个新的地址 static int SC_SEE_OTHER = 303; // 客户端请求的地址必须通过另外的 URL 来访问 static int SC_TEMPORARY_REDIRECT = 307; // 页面暂时移动到另外一个新的地址 } /** * 获取 formhash 值value * * @param url * @return * @throws IOException * @throws ClientProtocolException * @throws IOException * @throws ClientProtocolException */ public String getFormhash(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException { HttpGet httpGet = new HttpGet(url); HttpResponse response = httpclient.execute(httpGet); HttpEntity entity = response.getEntity(); StringBuffer sb = null; // 输出页面内容 if (entity != null) { String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(is, charset)); String line = null; while ((line = br.readLine()) != null) { sb.append(line); } is.close(); } int pos = sb.indexOf("name=\"formhash\" value="); // 找出这个 formhash 的内容,这是登录用的 formhash String login_formhash = sb.substring(pos + 23, pos + 23 + 8); return login_formhash; } /** * 登录 * @param httpclient * @param user 用户名 * @param pass 密码 * @param formhash 提交的表单formhash值 * @throws ClientProtocolException * @throws IOException */ public boolean logicDz(DefaultHttpClient httpclient,String formhash) throws ClientProtocolException, IOException{ /* 创建post连接 */ HttpPost httpPost = new HttpPost(loginurl); /* 创建登录条件 */ List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("username", username)); nvps.add(new BasicNameValuePair("password", password)); nvps.add(new BasicNameValuePair("formhash", formhash)); /* 添加到httpPost提交的内容中 */ httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk")); /*执行并打印登录后内容显示情况*/ // printHttpGet(httpclient.execute(httpPost)); HttpResponse response = httpclient.execute(httpPost);//不打印登录情况 /*判断登录是否成功*/ HttpEntity entity = response.getEntity(); StringBuffer sb = null; // 输出页面内容 if (entity != null) { String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(is, charset)); String line = null; while ((line = br.readLine()) != null) { sb.append(line+"\t\n"); } is.close(); } if(sb.indexOf("title=\"访问我的空间\"") != -1){ int pos = sb.indexOf("title=\"访问我的空间\""); String username =sb.substring(pos+15, pos+50); username = username.substring(0, username.indexOf("<", 1)); System.out.println("登录时的 用户名为:"+username); System.out.println("################################# 登录成功 ############################"); return true; }else{ return false; } /*释放资源*/ // httpPost.abort(); } /** * 发贴 成功后返回页面内容 * @param httpclient * @param url * @param message * @param subject * @param login_formhash * @return HttpResponse * @throws ClientProtocolException * @throws IOException */ public HttpResponse postMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{ HttpPost httpPost = new HttpPost(url); HttpResponse response = null; List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("message", message)); //内容 nvps.add(new BasicNameValuePair("subject", subject)); //标题 nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的) /*以下的可以不设置,看了一下论坛中,这两个都有值的*/ nvps.add(new BasicNameValuePair("allownoticeauthor", "1")); nvps.add(new BasicNameValuePair("wysiwyg", "1")); httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk")); response = httpclient.execute(httpPost); /*释放资源*/ httpPost.abort(); return response; } /** * 回复 * @param httpclient * @param httpost * @param message * @param subject * @param login_formhash * @return * @throws ClientProtocolException * @throws IOException */ public HttpResponse postReMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{ HttpResponse response = null; /*提交的url,需要加上domainurl的地址*/ url = getReMessageUrl(url,httpclient); System.out.println("回复提交表单地址 url="+url); HttpPost httpPost = new HttpPost(url); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("message", message)); //内容 nvps.add(new BasicNameValuePair("subject", subject)); //标题 nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的) /*以下的可以不设置,看了一下论坛中,这两个都有值的*/ nvps.add(new BasicNameValuePair("allownoticeauthor", "1")); nvps.add(new BasicNameValuePair("wysiwyg", "1")); httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk")); response = httpclient.execute(httpPost); /* 释放资源 */ httpPost.abort(); return response; } /** * 获取回复的url * @param url * @param httpclient * @return * @throws ClientProtocolException * @throws IOException */ public String getReMessageUrl(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException { HttpGet httpGet = new HttpGet(url); // Invalid use of SingleClientConnManager: connection still allocated. HttpResponse response = httpclient.execute(httpGet); HttpEntity entity = response.getEntity(); StringBuffer sb = null; // 输出页面内容 if (entity != null) { String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(is, charset)); String line = null; while ((line = br.readLine()) != null) { sb.append(line+"\t\n"); } is.close(); } int pos = sb.indexOf("id=\"fastpostform\" action="); int pos_end = sb.indexOf("fastpost\""); System.out.println(sb.length()+" pos="+pos+" pos_end="+pos_end); // 找出这个 reMessageUrl 的内容 String reMessageUrl = domainurl + sb.substring(pos+26, pos_end+8); //去除amp; reMessageUrl = reMessageUrl.replaceAll("amp;", ""); //释放资源 httpGet.abort(); return reMessageUrl; } /** * 获取重定向的url * @param httpclient * @param response * @return 返回url地址 */ public String redirectHttp(DefaultHttpClient httpclient,HttpResponse response) { Header header = response.getFirstHeader("location"); String urlRedirect = ""; if(!header.getValue().contains(domainurl)){ urlRedirect = domainurl+header.getValue(); } else { urlRedirect = header.getValue(); } return urlRedirect; } /** * 根据HttpResponse对象 打印页面内容 * @param response * @throws IOException * @throws IllegalStateException */ public void printHttpGet(HttpResponse response) throws IllegalStateException, IOException{ HttpEntity entity = response.getEntity(); StringBuffer sb = null; // 输出页面内容 if (entity != null) { String charset = EntityUtils.getContentCharSet(entity); InputStream is = entity.getContent(); sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(is, charset)); String line = null; while ((line = br.readLine()) != null) { sb.append(line+"\t\n"); } is.close(); System.out.println(sb.toString()); } } /** * 主函数 main() * @param args * @throws IOException * @throws InterruptedException */ public static void main(String args[]) throws IOException, InterruptedException { LoginDZ loginDZ = new LoginDZ(); // connectionManager DefaultHttpClient httpclient = new DefaultHttpClient();// 得到httpclient实例 /* 登录论坛 */ System.out.println("################################# 开始登录 ############################"); String login_formhash = loginDZ.getFormhash(domainurl,httpclient);//获取formhash if(!loginDZ.logicDz(httpclient,login_formhash)){ System.out.println("################################# 登录失败 ############################"); return; } /* 开发发贴 */ System.out.println("################################# 开发发贴 ############################"); String url = null; //发贴的url String message = null; //发贴的内容 String subject = null; //发贴的标题 // /* 这个就是发贴机了 自己去加吧,可以用线程多个一起发,不用等 其中fid不同而已,可从1开始到50*/ // for(int i=0;i<1;i++){ // /* 发贴参数 */ // url = "http://www.aizili.com/forum.php?mod=post&action=newthread&fid=24&extra=&topicsubmit=yes"; // message = "最近组建创业团队,搞IT行业,欢迎加入,请留下你的联系方式"; // subject = "最近组建创业团队,搞IT行业,欢迎加入"; // login_formhash = loginDZ.getFormhash(url,httpclient); // // /* 调用发贴方法 四个参数,其中最后一个为form提交的hash值 */ // HttpResponse response = loginDZ.postMessage(httpclient, url, message, subject, login_formhash); // /* 测试看看内容 */ // System.out.println("################################# 发贴完成后 内容如下 ############################"); // loginDZ.printHttpGet(response); //打印发贴后的页面看看 // // System.out.println("################################# 重定向跳转页面 ############################"); // /* 获取重定向标识码 */ // int statuscode = response.getStatusLine().getStatusCode(); // if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) // || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) // || (statuscode == HttpStatus.SC_SEE_OTHER) // || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) { // System.out.println("################################# 开始发表回复 ############################"); // /* 发表回复 */ // url = loginDZ.redirectHttp(httpclient, response); // message = "最好介绍一下自己,我会选择性的加大家的,最好加上联系的QQ之类的"; // subject = "最近组建创业团队,搞IT行业,欢迎加入"; // login_formhash = loginDZ.getFormhash(url,httpclient); // // for(int j=0;j<1;j++){ // //可以多次对一个帖子回复 // } // // sleep(10000);//等10秒再回复 // // response = loginDZ.postReMessage(httpclient,url, message, subject, login_formhash); // // /*打印页面内容*/ // loginDZ.printHttpGet(response); // } // } url = "http://www.aizili.com/thread-264893-1-1.html"; message = "这个真不敢乱留联系方式,怕!好怕"; subject = "最近组建创业团队,搞IT行业,欢迎加入"; login_formhash = loginDZ.getFormhash(url,httpclient); for(int i=15;i<20;i++){ System.out.println(message+" 现在是" + i); loginDZ.postReMessage(httpclient,url, message, subject, login_formhash); sleep(10000); } /* 关闭连接管理器 */ httpclient.getConnectionManager().shutdown(); } }
代码就上面的,原理就不说了,备注那么多,相信你可以看的懂。
以上也是我写代码的一般风格,还有很多不好的地方,请指出,谢谢!
欢迎朋友们一起讨论。
如果想做相关的一些发贴器,登录机的,请联系我QQ:402027721,说明来意。
另外这个程序的目的不是登录论坛,是登录cmcc,这只是做为测试,家里没有cmcc的ap。
发表评论
-
mina框架 出现BufferUnderflowException异常的解决办法
2012-04-18 16:03 9106背景:使用mina进行socket编程,而传输数据大小会出现比 ... -
Java集合框架——ArrayList与LinkedList
2011-12-29 11:16 0Java集合框架——ArrayList与LinkedList ... -
Java集合框架——HashMap与Hashtable
2011-12-22 11:12 4743Java集合框架——HashMap ... -
Java集合框架——基础接口
2011-12-21 12:23 5068Java集合框架专题(学习的那个过程,请指教) ... -
Java集合框架专题(学习的那个过程,请指教)
2011-12-19 15:02 2288Java集合框架专题 在这里提醒一下自己深入的思路,如 ... -
从JVM类加载的角度分析new String("")问题
2011-12-16 17:09 6007回来写博客了,还好,没有失言。 先告诉一下读者,也许我 ... -
多线程——休眠(sleep)
2011-12-14 10:46 18414先抛出一问题? 都说sleep与yield有哪些哪些的区 ... -
多线程——锁(lock)
2011-12-13 09:16 17221上一讲《多线程——同步(synchronized)下》 ... -
多线程——同步(synchronized)下
2011-12-12 16:12 4110接着上一讲《多线程— ... -
多线程——同步(synchronized)上
2011-12-12 12:20 4966多线程——同步(synchro ... -
多线程——状态转换
2011-12-11 12:18 3908多线程——状态转换 线程可以分为4个状态: New( ... -
实现一个简单的多线程
2011-12-11 10:55 5193一、定义线程 1、扩 ... -
Java线程及线程池专题
2011-12-09 17:18 10015Java多线程及线程池专题 第一部分:介绍多线程 ... -
(更新时间18号10:42)(原创)移动系统上线,全程经验分享
2011-10-17 12:22 2917移动系统上线,全程经验分享 时间:2011-10-18到20 ... -
(转载)Weblogic 各种版本下载
2011-10-16 23:09 4922Weblogic 各种版本下载 http://dev2d ... -
(入门培训)第一章:java开发工具与环境搭建
2011-10-16 22:36 1474java开发工具汇总 开发工具表: JDK 核心包 J ... -
我的Java学习推荐书目(转载)
2011-06-22 17:15 1033一直有这么个想法,列 ...
相关推荐
总的来说,HttpClient4提供了一个强大而灵活的框架,可以用来模拟登录各种网站,包括百度和58同城。然而,每个网站的登录机制都有所不同,所以需要根据具体情况进行调整和优化。在开发过程中,务必遵守网站的使用...
【标题】"基于httpclient的文件可配置的心跳检测应用"是关于利用Apache HttpClient库进行网络连接健康检查和文件变化监控的技术实现。该应用适用于分布式系统中,确保服务间的通信可靠性,同时也关注本地或远程文件...
在本文中,我们将深入探讨如何使用HttpClient来模拟登录方正系统,以及在此基础上开发类似“课程格子”这样的应用。 一、HttpClient简介 HttpClient是一个支持HTTP协议的客户端编程工具,支持HTTP/1.1及其后续版本...
基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...
通过学习和理解`LoginRR.java`的代码,我们可以了解到如何利用HttpClient来模拟用户登录行为,包括发送登录请求、处理服务器响应等步骤。而`注意.txt`和`lib`目录则提供了代码使用和运行的上下文信息。对于想要学习...
在本文中,我们将深入探讨如何使用HttpClient来模拟浏览器的GET和POST操作,以及相关的源码分析和工具使用技巧。 首先,让我们了解GET和POST请求的基本概念。GET是HTTP协议中最常见的请求方法,通常用于获取服务器...
本文将详细介绍如何使用Apache HttpClient库进行模拟登录以及提交表单数据的操作。通过一个具体的示例程序来演示这一过程,帮助读者理解整个流程。 #### 使用场景 在Web应用开发过程中,常常需要模拟用户的登录行为...
3. 网页抓取和分析方法的实现:文章中提出的基于HttpClient与HTMLParser的网页抓取解析方法,结合了两者的优点,实现了快速且有效的网页内容抓取和正文提取。该方法能够针对特定的网页内容进行深入分析,并能够应对...
在自动化测试中,HttpClient可以帮助我们模拟用户与服务器之间的网络交互,例如登录、注册、数据查询等操作。通过设置不同的请求方法(GET、POST、PUT等)、头信息和请求体,我们可以实现对Web服务的全面测试。...
总结来说,"java模拟淘宝登录源码"是一个基于HTTPClient的项目,用于模拟用户在淘宝网的登录流程。通过分析HTML、构造和发送HTTP请求,以及管理Cookie,我们可以实现与真实浏览器类似的登录体验。然而,这种模拟登录...
标题中的“httpclient3 自动登陆淘宝, 开心...由于没有具体的博客内容,以上都是基于HttpClient的一般性介绍和自动登录的通用步骤。要获取具体实现细节,建议参考提供的博客链接或进行网络搜索以找到更多示例和教程。
进一步,文档讲解了模拟表单登录的方法,这是在进行Web应用开发时常见的需求。文档还介绍了如何让HttpClient连接到SSL安全的服务器,这涉及到生成密钥库和配置服务器支持SSL连接的具体操作。 最后,文档还演示了...
6. **Cookie管理**:如果需要模拟登录或保持会话,需要理解如何使用HttpClient处理Cookie。 7. **URL编码和解码**:在发送URL参数或表单数据时,需要进行正确的编码和解码操作。 8. **网页解析**:可能使用到DOM或...
例如,开发人员可以使用 HttpClient 进行 RESTful API 的调用,获取 JSON 数据,或者进行自动化测试中的 HTTP 请求模拟。 6. **注意事项** - 使用 HttpClient 时,需注意连接管理和资源释放,避免内存泄漏和连接...
对于12306购票的实现,可以研究其API接口文档,以及已有的开源项目,如"基于java httpclient的12306 买票软件",从中学习如何将HttpClient应用于实际场景。 通过以上内容,我们可以了解到Java HttpClient在实现...
- **需要登录才能访问的服务**:处理登录流程和Cookie管理。 - **HTTPS加密通信**:支持安全的数据传输。 - **文件上传**:实现通过HTTP协议的文件上传功能。 #### 六、总结 通过以上介绍可以看出,HttpClient为...
1. 用户认证:通过HttpClient实现模拟登录,需要处理好Cookie和Session,确保用户身份的正确识别。 2. 数据获取:使用HttpClient获取课程列表,解析HTML或JSON数据,提取所需信息。 3. 选课逻辑:根据用户需求,制定...
本文将深入探讨基于Socket实现的HttpClient,以及它如何处理GET和POST协议。 首先,Socket是TCP/IP协议族中的一个概念,它提供了一种进程间通信(IPC)机制,允许两台计算机上的应用程序通过网络进行数据交换。在C...