`

基于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。

 

5
0
分享到:
评论

相关推荐

    httpclient4之百度模拟登陆,回复与58同城自动登陆

    总的来说,HttpClient4提供了一个强大而灵活的框架,可以用来模拟登录各种网站,包括百度和58同城。然而,每个网站的登录机制都有所不同,所以需要根据具体情况进行调整和优化。在开发过程中,务必遵守网站的使用...

    基于httpclient的文件可配置的心跳检测应用

    【标题】"基于httpclient的文件可配置的心跳检测应用"是关于利用Apache HttpClient库进行网络连接健康检查和文件变化监控的技术实现。该应用适用于分布式系统中,确保服务间的通信可靠性,同时也关注本地或远程文件...

    HttpClient模拟登陆方正系统

    在本文中,我们将深入探讨如何使用HttpClient来模拟登录方正系统,以及在此基础上开发类似“课程格子”这样的应用。 一、HttpClient简介 HttpClient是一个支持HTTP协议的客户端编程工具,支持HTTP/1.1及其后续版本...

    HttpClient 4.5 封装的工具类 HttpUtil 可用于爬虫和模拟登陆

    基于Apache HttpClient 4.5.2 封装的工具类 HttpUtil 可用于爬虫和模拟登陆。使用新的语法后比3.*版本的速度感觉有提升。使用后注意资源的释放 pom 部分,应该不全,需要用的根据代码的import去找maven资源即可。 ...

    httpclient4.3登陆人人

    通过学习和理解`LoginRR.java`的代码,我们可以了解到如何利用HttpClient来模拟用户登录行为,包括发送登录请求、处理服务器响应等步骤。而`注意.txt`和`lib`目录则提供了代码使用和运行的上下文信息。对于想要学习...

    用HttpClient来模拟浏览器的GET,POST

    在本文中,我们将深入探讨如何使用HttpClient来模拟浏览器的GET和POST操作,以及相关的源码分析和工具使用技巧。 首先,让我们了解GET和POST请求的基本概念。GET是HTTP协议中最常见的请求方法,通常用于获取服务器...

    httpclient测试登录并提交表单功能

    本文将详细介绍如何使用Apache HttpClient库进行模拟登录以及提交表单数据的操作。通过一个具体的示例程序来演示这一过程,帮助读者理解整个流程。 #### 使用场景 在Web应用开发过程中,常常需要模拟用户的登录行为...

    基于HttpClient与HTMLParser 的网页正文提取

    3. 网页抓取和分析方法的实现:文章中提出的基于HttpClient与HTMLParser的网页抓取解析方法,结合了两者的优点,实现了快速且有效的网页内容抓取和正文提取。该方法能够针对特定的网页内容进行深入分析,并能够应对...

    全栈自动化测试实战 基于testng,httpclient,selenium.appium

    在自动化测试中,HttpClient可以帮助我们模拟用户与服务器之间的网络交互,例如登录、注册、数据查询等操作。通过设置不同的请求方法(GET、POST、PUT等)、头信息和请求体,我们可以实现对Web服务的全面测试。...

    java模拟淘宝登录源码

    总结来说,"java模拟淘宝登录源码"是一个基于HTTPClient的项目,用于模拟用户在淘宝网的登录流程。通过分析HTML、构造和发送HTTP请求,以及管理Cookie,我们可以实现与真实浏览器类似的登录体验。然而,这种模拟登录...

    httpclient3 自动登陆淘宝, 开心网

    标题中的“httpclient3 自动登陆淘宝, 开心...由于没有具体的博客内容,以上都是基于HttpClient的一般性介绍和自动登录的通用步骤。要获取具体实现细节,建议参考提供的博客链接或进行网络搜索以找到更多示例和教程。

    httpClient4.1入门教程.pdf

    进一步,文档讲解了模拟表单登录的方法,这是在进行Web应用开发时常见的需求。文档还介绍了如何让HttpClient连接到SSL安全的服务器,这涉及到生成密钥库和配置服务器支持SSL连接的具体操作。 最后,文档还演示了...

    用httpclient-4.0-alpha2 打造基于http协议的网站分析器

    6. **Cookie管理**:如果需要模拟登录或保持会话,需要理解如何使用HttpClient处理Cookie。 7. **URL编码和解码**:在发送URL参数或表单数据时,需要进行正确的编码和解码操作。 8. **网页解析**:可能使用到DOM或...

    httpclient4.5.5所有包

    例如,开发人员可以使用 HttpClient 进行 RESTful API 的调用,获取 JSON 数据,或者进行自动化测试中的 HTTP 请求模拟。 6. **注意事项** - 使用 HttpClient 时,需注意连接管理和资源释放,避免内存泄漏和连接...

    基于java httpclient的12306 买票软件, 仅供学习使用.zip

    对于12306购票的实现,可以研究其API接口文档,以及已有的开源项目,如"基于java httpclient的12306 买票软件",从中学习如何将HttpClient应用于实际场景。 通过以上内容,我们可以了解到Java HttpClient在实现...

    HttpClient_学习整理.

    - **需要登录才能访问的服务**:处理登录流程和Cookie管理。 - **HTTPS加密通信**:支持安全的数据传输。 - **文件上传**:实现通过HTTP协议的文件上传功能。 #### 六、总结 通过以上介绍可以看出,HttpClient为...

    基于SSM和HttpClient的在线选课辅助系统的设计与实现

    1. 用户认证:通过HttpClient实现模拟登录,需要处理好Cookie和Session,确保用户身份的正确识别。 2. 数据获取:使用HttpClient获取课程列表,解析HTML或JSON数据,提取所需信息。 3. 选课逻辑:根据用户需求,制定...

    socket httpclient

    本文将深入探讨基于Socket实现的HttpClient,以及它如何处理GET和POST协议。 首先,Socket是TCP/IP协议族中的一个概念,它提供了一种进程间通信(IPC)机制,允许两台计算机上的应用程序通过网络进行数据交换。在C...

Global site tag (gtag.js) - Google Analytics