知识大全 利用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站点

如何利用JSP建立Web站点  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JSP与ASP非常相

知识大全 IIS下多站点利用虚拟目录 访问共用(图片)文件夹

IIS下多站点利用虚拟目录访问共用(图片)文件夹  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 在百度贴吧里,我只能看贴,还可以回复别人的贴子,但我想发贴的话,怎么弄

在百度贴吧里,我只能看贴,还可以回复别人的贴子,但我想发贴的话,怎么弄?麻烦高手具体点,感谢百度贴吧和知道的账号应该是通用的,这边可以提问,那边应该没问题的。百度贴吧只能发帖和回复自己的贴子。回复不了

知识大全 JAVA实现httpClient实例

JAVA实现httpClient实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  /*  *C

知识大全 HttpClient get请求在HttpResponse中无法获得Location的问题

HttpClientget请求在HttpResponse中无法获得Location的问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发

知识大全 利用PB实现动态系统用户登录

利用PB实现动态系统用户登录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在多用户的大型数据库

知识大全 利用SQL的全局临时表防止用户重复登录

利用SQL的全局临时表防止用户重复登录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在我们开发

知识大全 利用js实现遮罩以及弹出可移动登录窗口

本篇文章是对使用js实现遮罩以及弹出可移动登录窗口的实现方法进行了详细的分析介绍需要的朋友参考下 复制代码代码如下:<!DOCTYPEPUBLIC"//WC//DTDXHTMLTran

知识大全 百度贴吧匿名发帖的按钮在哪里啊

百度贴吧匿名发帖的按钮在哪里啊你好,现在贴吧升级,所有贴吧不能匿名发帖了,但是新注册帐号可以匿名,就是注册后直接邮箱登入,先别起使用者名称,发表后显示吧友ip,如果起了名就是使用者名称发帖了,不能匿名

知识大全 查看发帖排行页面[2]

PHP网络编程:查看发帖排行页面[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &