知识大全 利用httpclient模拟站点的登录发帖回复
Posted 知
篇首语:春衣少年当酒歌,起舞四顾以笑和。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 利用httpclient模拟站点的登录发帖回复相关的知识,希望对你有一定的参考价值。
HttpClient 是 Apache Jakarta Common 下的子项目 可以用来提供支持 HTTP 协议的客户端编程工具包 模拟浏览器的行为 它提供了很多的方法来简化网络的访问 虽然大部分的功能可以使用较底层的 HttpURLConnection 来实现 例如
实现了所有 HTTP 的方法( GET POST 等)
支持 HTTPS 协议
支持代理服务器
自动维护 Cookies 等
我们知道 协议是面向无连接的 要维持会话 现在基本上都是采用基于 Cookies 的方式( Session 机制也是通过 Cookies 实现的) 所以 HttpClient 的自动维护 Cookies 的方式对我们的登录发帖回复非常有用(一般网站都需要先登录再发帖回复)
下面的 例子都是采用 mons 包来实现的(虽然 mons 已经发布 但是代码发生了较大的重构 调用方式也发生了很大的改变)
下载 jar 包的路径为
由于 client 使用了 Apache Jakarta mon 下的子项目 logging 和 codec 所以也需要在 下载这两个包
mons logging jar
mons codec jar
为了更好地理解代码 设计的 UML 类图如下
方法调用的时序图如下
其中 BrowserContext 类代表浏览器上下文对象 维护 HttpClient 链接和 Cookies KaixinSitePost 是负责实现开心网的具体登录发帖回复逻辑的类
BrowserContext 的代码如下
/** */ /**
* Copyright (C):
* @author 陈新汉
* Aug : : PM
*/
/** */ /**
* 浏览器进程上下文
*/
public class BrowserContext
private HttpClient client; // 注意 每个站点和每个用户 对应一个单独的BrowserContext对象
private Cookie[] cookies = new Cookie[ ]; // 维护Cookies
private Proxyips proxyip = null ; // 当前的代理IP
private Siteusers user = null ; // 当前的登录用户
public Cookie[] getCookies()
return cookies;
public void setCookies(Cookie[] cookies)
okies = cookies;
public void addCookie(Cookie c)
if (cookies != null && cookies length > )
Cookie[] others = new Cookie[cookies length + ];
System arraycopy(cookies others cookies length);
others[others length ] = c;
cookies = others;
else
cookies = new Cookie[ ];
cookies[ ] = c;
public Proxyips getProxyip()
return proxyip;
public void setProxyip(Proxyips proxyip)
this proxyip = proxyip;
if ( this proxyip != null )
client getHostConfiguration() setProxy(proxyip getIp() proxyip getPort());
client getParams() setAuthenticationPreemptive( true );
// 如果代理需要密码验证 这里设置用户名密码
// client getState() setProxyCredentials(AuthScope ANY new UsernamePasswordCredentials( ));
public HttpClient getClient()
return client;
public Siteusers getUser()
return user;
public void setUser(Siteusers user)
this user = user;
private BrowserContext(Site site)
super ();
Protocol my = new Protocol( new MySecureProtocolSocketFactory() );
Protocol registerProtocol( my);
client = new HttpClient();
client getParams() setCookiePolicy(CookiePolicy BROWSER_PATIBILITY);
HttpConnectionManagerParams managerParams = client getHttpConnectionManager() getParams();
// 设置连接超时时间(单位毫秒)
// managerParams setConnectionTimeout( );
// 设置读数据超时时间(单位毫秒)
// managerParams setSoTimeout( );
initForSiteVisit(site getSite() site getPort() site getCharset());
public BrowserContext(Site site Proxyips proxyip)
this (site);
this setProxyip(proxyip);
private void initForSiteVisit(String siteurl int port String charset)
client getHostConfiguration() setHost(siteurl port );
// 解决中文乱码问题 和指定网站的页面编码一致
client getParams() setParameter(HttpMethodParams HTTP_CONTENT_CHARSET charset);
// 查看cookie信息
public void printCookies()
System out println( Cookie );
if (cookies != null )
for (Cookie c:cookies)
System out println(c getName() + : + c getValue());
else
System out println( 没有设置Cookies );
System out println( Cookie );
public void setCommonMethodRequestHeaders(HttpMethodBase method)
method setRequestHeader( Accept */* );
// method setRequestHeader( Accept Language zh cn );
// method setRequestHeader( Accept Encoding gzip deflate );
method setRequestHeader( User Agent Mozilla/ (patible; MSIE ; Windows NT ;) );
// 设置非常重要
method setRequestHeader( Connection Keep Alive );
public String redirectToURL(String url) throws IOException
if (url != null )
try
System out println( 页面重定向到 + url);
String responseString = this doCommonVisitWithURL(url);
// System out println(responseString);
return responseString;
catch (IOException e)
System out println( 重定向 + url + 出错 );
else
System out println( redirect url is null );
return null ;
public String doCommonVisitWithURL(String url) throws IOException
GetMethod get = new GetMethod(url);
return this doGet(get);
public String doPost(ExpectContinueMethod post) throws IOException
if (post == null )
return null ;
try
if (getCookies() != null )
// printCookies();
client getState() addCookies(cookies);
post addRequestHeader( Cookie getCookies() toString());
// System out println(post getRequestHeader( Cookie ) getValue());
setCommonMethodRequestHeaders(post);
int statusCode = client executeMethod(post);
cookies = client getState() getCookies();
System out println(statusCode);
// System out println(post getResponseHeader( Location ));
String responseString = post getResponseBodyAsString();
System out println(responseString);
printCookies();
post releaseConnection();
if (statusCode == || statusCode == )
redirectToURL(post getResponseHeader( Location ) getValue());
return responseString;
finally
if (post != null )
post releaseConnection();
public String doGet(GetMethod get) throws IOException
if (get == null )
return null ;
if (cookies != null )
// printCookies();
client getState() addCookies(cookies);
get addRequestHeader( Cookie cookies toString());
try
setCommonMethodRequestHeaders(get);
int statusCode = client executeMethod(get);
cookies = client getState() getCookies(); // 重新保存Cookies
printCookies();
System out println(statusCode);
if (statusCode == || statusCode == )
redirectToURL(get getResponseHeader( Location ) getValue());
String responseString = get getResponseBodyAsString();
// System out println(responseString);
return responseString;
finally
if (get != null )
get releaseConnection();
public String getRedirectURL(String content)
if (content != null && content indexOf( window location=\\ )!= )
int begin = content indexOf( window location=\\ );
int end = content indexOf( \\ begin+ );
return content substring(begin + end);
return null ;
KaixinSitePost类的代码
/** *//**
* Copyright (C):
* @author 陈新汉
* Aug : : AM
*/
/** *//**
* 模拟测试网站(不需要验证码)
* 开心网()
*/
public class KaixinSitePost implements ISitePost
private static final String LOGON_SITE = ;
private static final int LOGON_PORT = ;
private static final String CHARSET= UTF ;
private BrowserContext context=null;
//单个用户登录
public String login(Siteusers userinfo Proxyips ip)
if(userinfo!=null)
SiteLogin login=new SiteLogin(context );
if(ip!=null)
login getContext() setProxyip(ip);
Map<String String> params=new HashMap<String String>();
params put( ss );
params put( loginregFrom index );
params put( origURL );
params put( email userinfo getUsername());
params put( password userinfo getUserpwd());
login addRequestParameters(params);
return login login(userinfo);
return null;
public List<Siteboards> parseBoard(Siteboards data)
return null;
public String post(Postinfos postinfo List<Siteboards> siteboards)
if(postinfo!=null && siteboards!=null)
SitePost sport=new SitePost(context);
context getClient() getHostConfiguration() setHost( );
Map<String String> params=new HashMap<String String>();
params put( categoryId );
params put( blogControl );
params put( title postinfo getTitle());
params put( body postinfo getContent());
sport addRequestParameters(params);
for(Siteboards sb:siteboards)
sb setPostUrl( );
try
sport post(postinfo sb);
catch(IOException e)
e printStackTrace();
return null;
public String reply(Postinfos postinfo List<Articleinfos> arts)
return null;
/** *//**
* @param args
*/
public static void main(String[] args)
try
Siteusers userinfo=new Siteusers();
userinfo setUsername( xxxx );
userinfo setUserpwd( xxxx );
Proxyips ips = new Proxyips();
ips setIp( );
ips setPort( );
KaixinSitePost sp=new KaixinSitePost();
sp login(userinfo ips);
Postinfos post=new Postinfos();
post setContent( <p>lllllllllllllllllllllll</p> );
post setTitle( 中文测试 );
List<Siteboards> siteboards=new ArrayList<Siteboards>();
siteboards add(new Siteboards());
siteboards add(new Siteboards());
sp post(post siteboards);
catch(Exception e)
e printStackTrace();
封装登录的类SiteLogin
/** *//**
* Copyright (C):
* @author 陈新汉
* Aug : : PM
*/
/** *//**
* 站点登录
*/
public class SiteLogin extends AbstractMethodAdapter
private HttpMethodBase method;
private boolean ispost=true;
protected BrowserContext context; //当前的浏览器进程上下文
public BrowserContext getContext()
return context;
/** *//**
* 构造函数
* @param context
* @param url
* @param ispost 设置是否POST方式提交 默认为POST
*/
public SiteLogin(BrowserContext context String url boolean ispost)
super();
ntext = context;
this ispost=ispost;
method = this ispost?new PostMethod(url):new GetMethod(url);
public SiteLogin(BrowserContext context String url)
this(context url true);
public String login(Siteusers user)
int statusCode= ;
if(this ispost && this hasRequestParameters())
((PostMethod)method) setRequestBody(this getRequestParams());
if(this hasExtraRequestHeaders())
this addExtraRequestHeaders(method this getExtraRequestHeaders());
context setCommonMethodRequestHeaders(method);
try
if(context getCookies()!=null)
//printCookies();
context getClient() getState() addCookies(context getCookies());
method addRequestHeader( Cookie context getCookies() toString());
statusCode = context getClient() executeMethod(method);
context setCookies(context getClient() getState() getCookies());
String responseString = method getResponseBodyAsString();
//System out println(responseString);
method releaseConnection();
if(statusCode==HttpStatus SC_OK)
System out println( 登录成功 );
return responseString;
else if(statusCode== ||statusCode== )
System out println( 登录成功 页面重定向 );
String url=method getResponseHeader( Location ) getValue();
return context redirectToURL(url);
else
System out println( 登录失败 状态码 +statusCode);
catch(Exception e)
e printStackTrace();
finally
if(method!=null)
method releaseConnection();
return null;
封装站点发帖的类SitePost
/** *//**
* Copyright (C):
* @author 陈新汉
* Aug : : PM
*/
/** *//**
* 站点发帖新帖
*/
public class SitePost extends CommonSitePost
public SitePost(BrowserContext context)
super();
ntext=context;
public String post(Postinfos postinfo Siteboards siteboard) throws IOException
if (postinfo != null && siteboard != null)
if (StringUtils isNotEmpty(siteboard getPostUrl()))
PostMethod post = new PostMethod(siteboard getPostUrl());
if(this hasRequestParameters())
post setRequestBody(this getRequestParams());
if(this hasExtraRequestHeaders())
this addExtraRequestHeaders(post this getExtraRequestHeaders());
context setCommonMethodRequestHeaders(post);
ntext doPost(post);
else
System out println( 版面的新帖提交地址不能为空! );
else
System out println( 帖子或者版面信息输入都不能为空 );
return null;
cha138/Article/program/Java/hx/201311/25911
相关参考
如何利用JSP建立Web站点 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! JSP与ASP非常相
知识大全 IIS下多站点利用虚拟目录 访问共用(图片)文件夹
IIS下多站点利用虚拟目录访问共用(图片)文件夹 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 在百度贴吧里,我只能看贴,还可以回复别人的贴子,但我想发贴的话,怎么弄
在百度贴吧里,我只能看贴,还可以回复别人的贴子,但我想发贴的话,怎么弄?麻烦高手具体点,感谢百度贴吧和知道的账号应该是通用的,这边可以提问,那边应该没问题的。百度贴吧只能发帖和回复自己的贴子。回复不了
JAVA实现httpClient实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! /* *C
知识大全 HttpClient get请求在HttpResponse中无法获得Location的问题
HttpClientget请求在HttpResponse中无法获得Location的问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发
利用PB实现动态系统用户登录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在多用户的大型数据库
利用SQL的全局临时表防止用户重复登录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在我们开发
本篇文章是对使用js实现遮罩以及弹出可移动登录窗口的实现方法进行了详细的分析介绍需要的朋友参考下 复制代码代码如下:<!DOCTYPEPUBLIC"//WC//DTDXHTMLTran
百度贴吧匿名发帖的按钮在哪里啊你好,现在贴吧升级,所有贴吧不能匿名发帖了,但是新注册帐号可以匿名,就是注册后直接邮箱登入,先别起使用者名称,发表后显示吧友ip,如果起了名就是使用者名称发帖了,不能匿名
PHP网络编程:查看发帖排行页面[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &