-
使用httpclient模拟登陆操作,失败~5
想通过httpclient,做一个通过java代码登陆百度的功能。
参考了网上的多个版本,实现的原理差不多,但是有几个点我还是有点不清楚,比如:
1.如何确定request中需要传递的参数个数和每个参数名
2.第一次打开request,拿到location后,第二次发送请求,如何根据返回的response,判断是否登陆成功呢?(理论上,如果页面上包含我的用户名,应该就是成功了,但是我的返回值跟第一次访问返回的基本是一样的响应)。
麻烦大家帮忙看一下我的代码,要做如何修改?
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.apache.http.Consts; 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.HttpClient; 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.cookie.Cookie; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class BaiduLoginMain { public static void main(String[] args) { BaiduLoginUtil.process("username", "xxxxxxx"); } public static boolean process(String username, String password) { boolean loginResult = false; DefaultHttpClient httpclient = new DefaultHttpClient(); HttpResponse response; HttpEntity entity; List<Cookie> cookies; //组建登录的post包 try { HttpPost httpPost = buildHttpPost(username, password); response = httpclient.execute(httpPost); entity = response.getEntity(); System.out.println("Login form get: " + response.getStatusLine()); EntityUtils.consume(entity); cookies = httpclient.getCookieStore().getCookies(); if (cookies.isEmpty()) { System.out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { System.out.println("- " + cookies.get(i).toString()); } } //进行页面跳转 //这里本来应该获取response中的Location,但是返回结果里面没有这个数据,所以我临时指定了跳转页面地址 String url = "http://www.baidu.com"; // 页面跳转 HttpGet httpget1 = new HttpGet(url); response = httpclient.execute(httpget1); // 理论上,这里应该登陆成功了 entity = response.getEntity(); if (entity != null) { //do something... } // 显示结果 BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8")); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { httpclient.getConnectionManager().shutdown(); } return loginResult; } /** * 构建request * @param username * @param password */ private static HttpPost buildHttpPost(String username, String password) { HttpPost httpPost; HttpClient httpclient = new DefaultHttpClient(); httpPost = new HttpPost( "https://passport.baidu.com/v2/?login&tpl=mn&u=http://www.baidu.com/"); // 用户登录 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("TANGRAM__PSP_8__userName", username)); nvps.add(new BasicNameValuePair("TANGRAM__PSP_8__password", password)); httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); httpPost.addHeader("Cache-control", "no-cache"); httpPost.addHeader("Connection", "keep-alive"); httpPost.addHeader("Content-Encoding", "gzip"); httpPost.addHeader("Content-Language", "zh-CN"); httpPost.addHeader("Content-Type", "text/html;charset=UTF-8"); httpPost.addHeader("Server", "nginx");; return httpPost; } }
2014年3月27日 20:44
2个答案 按时间排序 按投票排序
-
1.如何确定request中需要传递的参数个数和每个参数名下?
这个需要看百度input name 的值的 input的个数吧。
代码如下params.add(new BasicNameValuePair("name", username)); params.add(new BasicNameValuePair("password", password)); params.add(new BasicNameValuePair("checkword",validate)); params.add(new BasicNameValuePair("datasource",""));
2.第一次打开request,拿到location后,第二次发送请求,如何根据返回的response,判断是否登陆成功呢?(理论上,如果页面上包含我的用户名,应该就是成功了,但是我的返回值跟第一次访问返回的基本是一样的响应)。
这个需要借助cookie来维持登录的状态了吧,你登录成功后服务应该会返回你一个sessinid的东西,你每次向服务器请求需要带着这个id 来表示你已经登录成功了。
代码如下private static void init(){ if(client == null){ client = new DefaultHttpClient(new ThreadSafeClientConnManager()); } if(cookieStore ==null){ cookieStore =new BasicCookieStore(); } if( localContext == null){ localContext=new BasicHttpContext(); localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); } } public static byte[] requestCode(String url) throws IOException{ init(); HttpGet get = new HttpGet(baseUrl+url); HttpResponse response =client.execute(get,localContext); java.io.InputStream ips = response.getEntity().getContent(); byte [] bytes = new byte[ips.available()]; ips.read(bytes); return bytes; }
2014年3月27日 23:32
相关推荐
在阅读博文《HttpClient模拟登陆》时,可以深入学习如何解决这些具体问题,并查看示例代码以获得更详细的实现细节。 标签“源码”意味着你需要关注底层的工作原理,而“工具”标签则暗示HttpClient作为一个实用工具...
本主题将深入探讨如何使用HttpClient4库进行百度和58同城的模拟登陆操作。HttpClient4是一个强大的Java库,它提供了丰富的功能来执行HTTP请求,非常适合进行网页交互。 首先,我们来了解HttpClient4的基本用法。...
本文将详细介绍如何使用Apache HttpClient库进行模拟登录以及提交表单数据的操作。通过一个具体的示例程序来演示这一过程,帮助读者理解整个流程。 #### 使用场景 在Web应用开发过程中,常常需要模拟用户的登录行为...
本项目"**C#版本模拟登陆百度,2018年4月27日可用**"提供了一个C#语言编写的程序,专门用于模拟用户登录百度网站,而且在发布时是有效的。这个程序的独特之处在于,它不仅能够完成基本的登录操作,还为开发者提供了...
本示例是关于“java小米商城模拟登陆”的实践,通过这个项目,我们可以学习到如何利用Java来模拟用户登录小米商城的过程。下面将详细阐述相关知识点。 1. **HTTP协议理解**:模拟登录首先需要理解HTTP协议的基本...
在C#中,我们可以利用`HttpClient`类来发送HTTP请求,它是一个强大的工具,可以模拟各种HTTP操作。以下是模拟登录的基本步骤: 1. **创建HttpClient实例**:首先,我们需要实例化一个`HttpClient`对象,这将作为...
在Winform中,可以利用控件的Async事件处理能力,比如WebBrowser控件的DocumentCompleted事件,或者使用HttpClient类来发起异步请求。以下是一个基本流程: 1. 如果使用WebBrowser控件,设置其Navigate方法导航到...
【Java青果教务系统模拟登陆demo】是一个基于Java编程语言实现的教学管理系统登录模拟程序。这个项目的主要目的是演示如何通过编程技术与青果教务系统进行安全交互,从而实现自动登录的功能。在这个过程中,开发者...
在本文中,我们将深入探讨如何使用Java进行网页模拟登录,以人人网为例。模拟登录是一项常见的网络编程任务,常用于自动化测试、数据抓取或数据分析等场景。在Java中,我们可以利用HTTP客户端库如HttpURLConnection...
在本文中,我们将深入探讨如何使用C# Winform来模拟网站登录,并处理包含验证码的场景。Winform是.NET Framework提供的一种用于构建桌面应用程序的用户界面框架,而C#是一种广泛用于开发Windows应用的编程语言。当...
在本文中,我们将深入探讨如何基于 Laravel 框架实现模拟微博登录的功能,以及在此过程中获取和使用 Cookie 来发布微博。Laravel 是一个流行的 PHP 框架,以其优雅的语法和强大的功能深受开发者喜爱。微博登录模拟是...
在本文中,我们将深入探讨如何使用OAuth2协议模拟登录新浪微博,并了解相关技术细节。OAuth2是一种授权框架,允许第三方应用代表用户与服务提供商进行交互,例如发布微博。在这个例子中,我们将使用Java的Apache ...
9. **自动重试机制**:当登录失败时,可以设计自动重试逻辑,比如在一定次数内重复尝试登录,间隔一段时间以防止被服务器识别为恶意操作。 10. **用户界面**:虽然这里没有提及具体的用户界面设计,但在实际项目中...
1. 使用`HttpClient`进行HTTP POST请求以模拟登录。 2. 管理cookies以维持会话。 3. 解析HTML内容,可以使用HtmlAgilityPack等库。 4. 将这些技术整合到WinForm界面中,提供用户友好的交互体验。 通过学习和实践...
4. **使用Webdriver进行UI自动化**:如果需要模拟用户交互,比如点击、填写表单等,可以使用Selenium WebDriver。它允许你在Java代码中控制浏览器,执行真实用户的操作。 ```java WebDriver driver = new ...
- 可以使用C#的HttpClient类来发送POST请求,模拟登录操作。POST数据包含用户名和密码,以及可能的其他登录所需的头部信息。 5. **处理HTTP请求**: - 设置HttpClient的BaseAddress为目标网页的URL。 - 创建一个...
这可以通过使用HttpURLConnection或第三方库如Apache HttpClient来实现。 此外,为了提高界面的可用性,可以添加一些基本的界面元素,比如错误提示标签(JLabel)以显示无效输入或登录失败的消息,以及一个...
2. **Web请求与响应**:在C#中,可以使用`System.Net.WebClient`或`System.Net.Http.HttpClient`类来发送HTTP请求。这些类能够发起GET和POST请求,后者用于提交登录表单数据。 3. **模拟登录**:为了实现自动登录,...
总结,这个Java示例展示了如何使用HTTP请求模拟用户登录京东商城的过程,涉及到的主要技术有HTTP客户端操作、HTML解析以及POST请求的构建。然而,实际的生产环境中,还需要结合更多的安全措施和异常处理机制,确保...