httpclient模拟需要登陆之后才能访问第三方网站(并且需要一些人工参与的操作)
2017-08-24 10:15
597 查看
httpclient模拟用户登陆并访问目标页面....作个个人记录!
最近接了个功能,调用第三方的API获取数据,入库到我们自己平台!但是提供方网站上的东西比较简陋:
简单说明下:
1.获取数据的接口需要唯一标识access_token;
2.access_token的获取需要通过code去获取;
3.code的获取需要引导用户(第三方平台的登陆用户)打开一个授权页面进行授权之后,重定向地址上 而假如没有登陆还需要你先进行登陆;
难点就在这个需要引导用户打开授权页面进行授权
1). 这里面我们直接获取数据,用户就是我们自己在该第三方平台的账号;
2). 没有登陆直接去访问会跳转到登陆页面;
3). 登陆了之后,会有个授权页面,需要手动去点击授权按钮才真正跳转;
如下列图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/0d87fa7b62de1b7489cdf30d49dc61e8)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/d24859046a7228921040b9eaf539b4c7)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/a8e952109a974103ec98ec674bf02525)
然后查看上述页面的源代码,可找到发送请求的URL以及参数:
登陆的地址和参数:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/eef25a5e94974894876ce3726a0f2022)
点击授权连接按钮所作的操作:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/542a0cc86529990fe91775fec38fa3cf)
上代码(HttpClients模拟 + Jsoup解析html)
-----此例是比较简单的没有验证码的登录页面
打印日志:
最近接了个功能,调用第三方的API获取数据,入库到我们自己平台!但是提供方网站上的东西比较简陋:
简单说明下:
1.获取数据的接口需要唯一标识access_token;
2.access_token的获取需要通过code去获取;
3.code的获取需要引导用户(第三方平台的登陆用户)打开一个授权页面进行授权之后,重定向地址上 而假如没有登陆还需要你先进行登陆;
难点就在这个需要引导用户打开授权页面进行授权
1). 这里面我们直接获取数据,用户就是我们自己在该第三方平台的账号;
2). 没有登陆直接去访问会跳转到登陆页面;
3). 登陆了之后,会有个授权页面,需要手动去点击授权按钮才真正跳转;
如下列图:
然后查看上述页面的源代码,可找到发送请求的URL以及参数:
登陆的地址和参数:
点击授权连接按钮所作的操作:
上代码(HttpClients模拟 + Jsoup解析html)
-----此例是比较简单的没有验证码的登录页面
package com.fulihui.daweixinke.test.conn; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; 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.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.junit.Test; import org.near.toolkit.security.codec.MD5Coder; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static java.lang.System.out; /** * <pre> * 模拟需要登陆之后才能访问第三方网站 * 并且需要一些人工参与的操作 * </pre> * * @author wang_wx * @Date 2017-08-24 */ public class EasyLoginNextPageA { private String userName = "我是用户名"; private String password = "我是密码"; @Test public void loginNext() throws IOException { BasicCookieStore cookieStore = new BasicCookieStore(); // 全局用这一个httpClient对象模拟真实的一个浏览器中操作 CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build(); try { // 模拟用户登录 HttpPost httpLogin = new HttpPost("xxxxxxxxxxxxxx/index.php/auth/auth/login");// 指向一个没有验证码的登录页面 List<NameValuePair> nvps = new ArrayList<>(); nvps.add(new BasicNameValuePair("username", userName));// 用户名对应的key nvps.add(new BasicNameValuePair("password", MD5Coder.md5Encode(password)));// 密码对应的key httpLogin.setEntity(new UrlEncodedFormEntity(nvps)); CloseableHttpResponse respLogin = httpClient.execute(httpLogin); try { HttpEntity entity = respLogin.getEntity(); out.println("respLogin------------>>" + respLogin.toString()); out.println("Login form get: " + respLogin.getStatusLine()); EntityUtils.consume(entity); out.println("Initial set of cookies:"); List<Cookie> cookies = cookieStore.getCookies(); if (cookies.isEmpty()) { out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { out.println("Cookie-" + i + "==" + cookies.get(i).toString()); } } } finally { respLogin.close(); } // 利用会话保持,继续访问目标地址 HttpGet httpGetAuth = new HttpGet("xxxxxxxxxxxxxxx/index.php/Auth/Auth/auth?app_id=xxxxxx&redirect_uri=回调地址&response_type=code"); CloseableHttpResponse respAuth = httpClient.execute(httpGetAuth); String entityAuthStr = ""; try { out.println(respAuth.getStatusLine()); HttpEntity entityAuth = respAuth.getEntity(); entityAuthStr = EntityUtils.toString(entityAuth); out.println("get Auth cookies:"); List<Cookie> cookies = cookieStore.getCookies(); if (cookies.isEmpty()) { out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { out.println("- " + cookies.get(i).toString()); } } out.println("访问目标地址的结果--------------------->>" + entityAuthStr);//把结果打印出来看一下 EntityUtils.consume(entityAuth); } finally { respAuth.close(); } // 解析登陆之后访问目标地址的html页面 获取目标form表单元素 Document doc = Jsoup.parseBodyFragment(entityAuthStr); String title = doc.title(); out.println("title-------->>" + title); Element element = doc.body(); Elements form = element.select("[name='authForm']");// 授权的form表单 out.println(form); String actionUrl = form.attr("action"); String app_id = element.select("[name='app_id']").val(); String redirect_uri = element.select("[name='redirect_uri']").val(); String state = element.select("[name='state']").val(); String key = element.select("[name='key']").val(); String format = element.select("[name='format']").val(); // 利用会话保持,继续模拟点击授权按钮 提交form表单 HttpPost httpPostGetCode = new HttpPost(actionUrl); List<NameValuePair> nvps2 = new ArrayList<>(); nvps2.add(new BasicNameValuePair("app_id", app_id)); nvps2.add(new BasicNameValuePair("redirect_uri", redirect_uri)); nvps2.add(new BasicNameValuePair("state", state)); nvps2.add(new BasicNameValuePair("key", key)); nvps2.add(new BasicNameValuePair("format", format)); httpPostGetCode.setEntity(new UrlEncodedFormEntity(nvps2)); CloseableHttpResponse respGetCode = httpClient.execute(httpPostGetCode); try { HttpEntity entityGetCode = respGetCode.getEntity(); out.println("respAuth------------>>" + respGetCode.toString()); // 最终目的 获取Location中的url中的某一值 Header location = respGetCode.getFirstHeader("Location"); out.println("location------------>>" + location.getValue()); EntityUtils.consume(entityGetCode); } finally { respGetCode.close(); } } finally { httpClient.close(); } } @Test public void test111() { String password = "我是密码"; String encode = MD5Coder.md5Encode(password); out.println("encode的值是:---" + encode + ",当前方法=EasyLoginNextPageA.test111()"); } }
打印日志:
相关文章推荐
- (转)查看需要验证的网站信息 模拟登陆
- IIS 用户账号配置出错导致网站访问需要登陆账号或者拒绝访问
- 使用HttpClient模拟网站登陆sina邮箱(保持远程服务器session和cookie)
- 网站发布以后频繁不能访问,需要重启IIS服务才能正常工作的解决办法
- 国内服务器,第三方登陆需要与facebook服务器进行数据交流,怎么设置代理,让我们的服务器能够访问
- 获取需要登陆才能被访问的页面,HttpClient(扩展HttpWebRequest)来实现
- org.apache.commons.httpclient 访问需要验证的webservice的一些问题
- python模拟登陆后用户访问网站
- 使用httpclient4.3.X模拟post请求登陆网站获取cookie信息的操作
- HTTPclient 模拟登陆及登陆成功后直接访问登陆后的页面
- IIS配置需要登陆才能访问的目录权限
- Selenium与phantomjs安装与环境配置,以及易班网站模拟登陆操作
- 使用HttpWebRequest和HttpWebResponse实现模拟登录需要登陆后才可以访问的页面
- Apache HttpClient模拟登陆网站(待续)
- 在事件触发的时候,有时我们需要一些模拟用户行为的操作。例如:当网页加载完毕后 自行点击一个按钮触发一个事件,而不是用户去点击。
- httpclient模拟浏览器访问网站
- dnn 模块 获取服务器端路径、获取用户ID、需要登陆才能访问的页面的处理
- 使用httpclient模拟登陆
- 限制本机访问某一些网站,本人不再花时间看新闻了
- 甲;乙;丙;丁四个人过桥,分别需要1,2,5,因为天黑,必须借助手电筒过桥可是总共只有一个手电筒,并且桥的载重能力有限,只能承受两个人的重量也就是说每次最多过两个人,怎样才能做到用