欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android模拟登录评论CSDN实现代码

程序员文章站 2024-03-02 16:08:28
有时候作为非官方开发的app集成了官方的所有信息,但是现在需要实现另一个功能那就是登录发表评论到官方的网站,而非官方的app并不知道官方网站是怎么实现登录与评论的,而且越大...

有时候作为非官方开发的app集成了官方的所有信息,但是现在需要实现另一个功能那就是登录发表评论到官方的网站,而非官方的app并不知道官方网站是怎么实现登录与评论的,而且越大型的网站,为了防止这样的事情发生,增加了许许多多阻碍,不过我们这里可以给大家提供一个通用的方式,就是有点费时,不过按照此方法,基本所有的网站都不在话下。今天就拿csdn做一下试验。

1.登录csdn

查看其源代码看看其form表单:

Android模拟登录评论CSDN实现代码其难点在post data数据中it的value与execution的value,其为随机产生,这估计是csdn防止恶意登录设置的动态标识,不过你可以在android 中先获取该值然后设置到需要提交的表单项中。

下面使用xutils与jsoup获取网页属性:

requestparams params = new requestparams("https://passport.csdn.net/account/login?ref=toolbar");
params.setheader("user-agent","mozilla/5.0 (windows nt 6.1; trident/7.0; rv:11.0) like gecko");
x.http().get(params, new callback.commoncallback<string>() {
  @override
  public void onsuccess(string result) {
    log.i("csdn", "onsuccess");
    requestparams params1=new requestparams("https://passport.csdn.net/account/login?ref=toolbar");
    params1.setheader("accept","text/html, application/xhtml+xml, */*");
    params1.setheader("content-type", "application/x-www-form-urlencoded");
    params1.setheader("dnt", "1");
    params1.setheader("host","passport.csdn.net");
    params1.setheader("accept-language","zh-cn");
    params1.setheader("user-agent","mozilla/5.0 (windows nt 6.1; trident/7.0; rv:11.0) like gecko");
    document doc=jsoup.parse(result);
    element formele=doc.getelementbyid("fm1");
    elements inputs=formele.getelementsbytag("input");
    for (element input : inputs){
      if(input.attr("name").equals("lt")){
        params1.addquerystringparameter("lt", input.attr("value"));
      }else if(input.attr("name").equals("execution")){
        params1.addquerystringparameter("execution", input.attr("value"));
      }else if(input.attr("name").equals("_eventid")){
        params1.addquerystringparameter("_eventid", input.attr("value"));
      }
    }
    params1.addquerystringparameter("username", "你的帐号");
    params1.addquerystringparameter("password","你的密码");
  }

  @override
  public void onerror(throwable ex, boolean isoncallback) {
    log.i("csdn", "onerror");
  }

  @override
  public void oncancelled(cancelledexception cex) {
    log.i("csdn", "oncancelled");
  }

  @override
  public void onfinished() {
    log.i("csdn", "onfinished");
  }
});

这样我们不仅获取了网页的动态标识,而且设置到即将提交表单的requestparams当中。

这样我们重新生成了一个params1,这个时候所有表单信息都已经设置到其中,下面就就模拟登录了:

public void getlogincsdn(final requestparams params){
  x.http().request(httpmethod.post, params, new callback.commoncallback<string>() {
    @override
    public void onsuccess(string result) {
      log.i("liyuanjinglyj", "onsuccess");
      system.out.println(result.tostring());

    }

    @override
    public void onerror(throwable ex, boolean isoncallback) {
      ex.printstacktrace();
      log.i("liyuanjinglyj", "onerror");
    }

    @override
    public void oncancelled(cancelledexception cex) {
      log.i("liyuanjinglyj", "oncancelled");
    }

    @override
    public void onfinished() {
      log.i("liyuanjinglyj", "onfinished");
    }
  });

调用getlogincsdn将在日志中输出如下信息:
Android模拟登录评论CSDN实现代码

2.评论csdn博文

首先我们随便打开一篇博文,将httpwatch也打开。现在在评论中输入信息,不要立即点击提交,先开启httpwatch。然后提交,然后关闭,我们会得到如下界面:Android模拟登录评论CSDN实现代码

这里提交的表单数据为三个,还有一个query string:Android模拟登录评论CSDN实现代码
这里为什么不打开html代码看,那我们先看看html代码:
Android模拟登录评论CSDN实现代码能看出什么吗?我唯一看出来的就是表单在div id=comment_form中,可是提交的表单项去哪里呢?答案就是csdn写在js里面了。下面我们打开其处理comment_form的js。

Android模拟登录评论CSDN实现代码人家写在这里,你不费点时间还真找不到。如果你按照js里面的name提交表单数据,那么你肯定得不到任何结果。返回0以失败结束。

下面我们开始设置评论的相关数据到requestparams中:

requestparams requestparams = new requestparams("http://blog.csdn.net/ljy1988123/comment/submit");
requestparams.setconnecttimeout(15000);
requestparams.setheader("user-agent", "mozilla/5.0 (windows nt 6.1; trident/7.0; rv:11.0) like gecko");
requestparams.setheader("accept-language", "zh-cn");
requestparams.setheader("host","blog.csdn.net");
requestparams.setheader("referer","http://blog.csdn.net/ljy1988123/article/details/50581207");
requestparams.setheader("accept", "*/*");
requestparams.setheader("content-type", "application/x-www-form-urlencoded");
requestparams.setheader("x-requested-with", "xmlhttprequest");
requestparams.setheader("connection", "keep-alive");
requestparams.setmultipart(true);
requestparams.addquerystringparameter("id", "50581207");
requestparams.addparameter("commentid", " ");
requestparams.addparameter("content", "  太喜欢这篇博文了。。 98 ");
requestparams.addparameter("replyid", " ");
sethttpcontent(requestparams);

当然这里面的数据有的并不需要,为了测试我按照httpwatch中给的设置的:
Android模拟登录评论CSDN实现代码然后在调用post请求:

public void sethttpcontent(requestparams params){
  x.http().post(params, new callback.commoncallback<string>() {
    @override
    public void onsuccess(string result) {
      log.i("liyuanjinglyj", "onsuccess");
      system.out.println(result.tostring());
    }

    @override
    public void onerror(throwable ex, boolean isoncallback) {
      ex.printstacktrace();
      log.i("liyuanjinglyj", "onerror");
    }

    @override
    public void oncancelled(cancelledexception cex) {
      log.i("liyuanjinglyj", "oncancelled");
    }

    @override
    public void onfinished() {
      log.i("liyuanjinglyj", "onfinished");
    }
  });
}

将输出如下日志信息:
Android模拟登录评论CSDN实现代码

其返回1代表成功,返回0代表失败,唯一需要说明的是我设置的超时时间是15秒,为什么设置这么长时间,想必大家比我清楚,csdn在网页评论都需要这么长时间,何况手机端呢。

在看看网页效果:Android模拟登录评论CSDN实现代码

多的一个是测试中超时报错发表上去的。

这篇文章只是模拟的登录与评论csdn,其他网站与这差不多。