CMCC-EDU登陆器

来源:互联网 发布:物资采购软件 百度云 编辑:程序博客网 时间:2024/04/29 23:45

RT。由于在使用CMCC-EDU进行上网时,在网页里登陆极其慢,

所以昨天花半天时间实现了一个CMCC-EDU登陆器。

思路就是,从浏览器先手工登陆抓包,分析整个登陆的过程,然后用程序去模拟。

针对每一个Get 和Post 分析其带的参数,提交到的地址,模拟

程序使用了httpcomponents-client-4.3.jar、和Jsoup-1.7.2.jar第三方类库。



PS:1.试了好多遍打jar文件,但是都运行不了,实在是没耐心了,有哪个网友知道怎么弄麻烦告知下。。。

  2.显示用了多久时间的还没弄好。回头再弄吧。!


上代码


1.界面程序

import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JTextField;import org.apache.http.client.CookieStore;import org.apache.http.impl.client.BasicCookieStore;public class MainFrame extends JFrame{/** * @param args */public static String name="";public static String password="";private static CookieStore cookieStore=new BasicCookieStore();CMCC cmcc;JTextField textName,textPassword;JButton btStart,btEnd;JLabel labelName;JLabel labelEmail;public MainFrame(){setSize(220,200);setTitle("CMCC-EDU登陆器  by Sumrise");setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);textName=new JTextField("账号",10);textPassword=new JTextField("密码",10);labelName=new JLabel("CMCC登陆器 by Sumrise");labelEmail=new JLabel("联系方式:sumrise@vip@qq.com");setLayout(new FlowLayout());add(textName);add(textPassword);add(labelName);add(labelEmail);btStart=new JButton("登陆");btEnd=new JButton("下线");add(btStart);add(btEnd);setVisible(true);btStart.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if(! textName.getText().trim().equals("账号"))name=textName.getText().trim();if(! textPassword.getText().trim().equals("密码"))password=textPassword.getText().trim();JOptionPane.showMessageDialog(null, "正在登陆请稍等几秒");cmcc=new CMCC(MainFrame.this);new Thread(cmcc).start();}});btEnd.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {cmcc.unload();}});textName.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {if(textName.getText().trim().equals("账号"))textName.setText("");}});textPassword.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {if(textPassword.getText().trim().equals("密码"))textPassword.setText("");}});}public static void main(String[] args) {new MainFrame();}}


2.Web获取页面小框架

import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;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.CookieStore;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.client.protocol.ClientContext;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.BasicHttpContext;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;public class WebGetPage {HttpClient client;CookieStore cookieStore;boolean isUseCookies=false;public WebGetPage() {client=new DefaultHttpClient();cookieStore=new BasicCookieStore();}/** * @param isUseCookies 是否使用Cookie * */public WebGetPage(boolean isUseCookies) {this();this.isUseCookies=isUseCookies;}public String postPage(String url,Map<String, String> map){return postPage(url,map,"UTF-8");}public String postPage(String url,Map<String, String> map,String charset){return postPage(url, map, charset, isUseCookies);}public String postPage(String url,Map<String, String> map,String charset,boolean isUseCookies){HttpClient client=new DefaultHttpClient();HttpPost httpPost=new HttpPost(url);HttpResponse response=null;String respResult="";httpPost.addHeader("User-Agent","Mozilla/4.0(compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727");//添加Post参数List<NameValuePair> parameters=new ArrayList<NameValuePair>();Iterator<String> keyIterator=map.keySet().iterator();while(keyIterator.hasNext()){String key=keyIterator.next();String value=map.get(key);parameters.add(new BasicNameValuePair(key, value));}try {HttpEntity postBodyEnt=new UrlEncodedFormEntity(parameters,"utf-8");httpPost.setEntity(postBodyEnt);if(isUseCookies)response=client.execute(httpPost,getCookieContext());elseresponse=client.execute(httpPost);respResult=EntityUtils.toString(response.getEntity(),charset);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return respResult;}/** * Get取得页面 * @param url GET URL的地址 * @param charset 编码 * @param isUseCookie 是否使用Cookie * */public String getPage(String url,String charset,boolean isUseCookie){HttpGet httpGet=new HttpGet(url);httpGet.addHeader("User-Agent","Mozilla/4.0(compatible; MSIE 7.0;Windows NT 5.1; .NET CLR 2.0.50727");HttpResponse response;String respResult="";try {if(isUseCookie)response=client.execute(httpGet,getCookieContext());elseresponse = client.execute(httpGet);respResult=EntityUtils.toString(response.getEntity(),charset);//System.out.println(respResult);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return respResult;}public String getPage(String url,String charset){return getPage(url, charset,isUseCookies);}public String getPage(String url){return getPage(url,"UTF-8");}/** * 取得Cookie并存取cookie * */public HttpContext getCookieContext(){HttpContext context=new BasicHttpContext();context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);return context;}}


3.核心实现

package com.main;import java.io.IOException;import java.net.NetworkInterface;import java.net.SocketException;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import javax.swing.JOptionPane;import org.apache.http.client.ClientProtocolException;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class CMCC implements Runnable {public static String url1 = "http://211.137.133.5/?wlanacname=0039.0029.290.00&wlanuserip=";public static String url2 = "&ssid=CMCC-EDU&vlan=3061";public static String LOAD_PAGE_URL = "http://211.137.133.5/style/default_cmsn/index.jsp?paramStr=";public static String LOAD_POST_URL = "https://211.137.133.5/authServlet";public static String UNLOAD_POST_URL = "https://211.137.133.5/logoutServlet";public static String username = "";public static String password = "";public static String UNLOAD_PARAMSTR;public boolean isLoad;Document doc;Elements elements;WebGetPage web;/**拥有主页面的引用*/MainFrame frame;public CMCC() {web = new WebGetPage(true);}public CMCC(MainFrame frame){this();this.frame=frame;username=MainFrame.name;password=MainFrame.password;}public void run() {JOptionPane.showMessageDialog(null, "开始登陆了!");String url=url1+this.getLocalIp()+url2;try {login(url);} catch (ClientProtocolException e) {JOptionPane.showMessageDialog(null, "网络异常了!");e.printStackTrace();} catch (IOException e) {JOptionPane.showMessageDialog(null, "网络异常了!");e.printStackTrace();}JOptionPane.showMessageDialog(null, "登陆结束");}/** * 1.访问任意一个网页拿到跳转信息 2.拿到跳转信息后,访问页面登陆页面 3.拿到登陆页面信息,登陆post * 4.登陆成功后拿到登陆信息,提示上线成功 5.程序中点击下线,取得参数post退出页面 6.退出 * @param url  * *//** * 登陆过程 * */private void login(String url) throws ClientProtocolException, IOException {if(isLoad){System.out.println("已经登陆,请勿重复登陆");return;}String respResult=web.getPage(url);//System.out.println(respResult);/** paramStr1参数*/String paramStr=respResult.substring(respResult.indexOf("paramStr")+9);paramStr=paramStr.substring(0,paramStr.indexOf("\""));//System.out.println(paramStr);LOAD_PAGE_URL+=paramStr;respResult=web.getPage(LOAD_PAGE_URL);//System.out.println(respResult);doc=Jsoup.parse(respResult);elements=doc.getElementsByTag("form");Element e=elements.get(0);//System.out.println(e);String input=e.toString().substring(e.toString().indexOf("id=\"paramStr\""));String paramStr2=input.substring(21,input.indexOf("\" />"));//System.out.println(paramStr2);//登录PostMap<String, String> map=new HashMap<String, String>();map.put("UserName", username);map.put("PassWord", password);map.put("UserType", "1");//map.put("UserType", "");//map.put("paramStr", paramStr2);map.put("province", "");map.put("pwdType", "1");map.put("verifycode1", "");String loadResult=web.postPage(LOAD_POST_URL,map);//System.out.println(loadResult);//结果返回一个302 和一个地址//对结果进行解析,提取出地址进行Getdoc=Jsoup.parse(loadResult);elements=doc.getElementsByTag("a");e=elements.get(0);String str=e.toString();str=str.substring(str.indexOf("https"));str=str.substring(0,str.indexOf("\">"));//System.out.println(str);String loadSuccessPage=web.getPage(str);//System.out.println(loadSuccessPage);//登陆成功解析出用了多久了。//下线参数获取doc=Jsoup.parse(loadSuccessPage);elements=doc.getElementsByTag("form");e=elements.get(0);//System.out.println(e);input=e.toString().substring(e.toString().indexOf("id=\"paramStr\""));UNLOAD_PARAMSTR=input.substring(21,input.indexOf("\" />"));//System.out.println(UNLOAD_PARAMSTR);System.out.println("登陆成功");isLoad=true;JOptionPane.showMessageDialog(null, "登陆成功");//下线Post//unload();}/** * 下线 * */public void unload(){if(!isLoad){System.out.println("没有登陆前,下个毛线?");JOptionPane.showMessageDialog(null, "没有登陆前,下个毛线?");return;}Map<String, String> unloadMap=new HashMap<String, String>();unloadMap.put("bOffline", "true");unloadMap.put("paramStr", UNLOAD_PARAMSTR);String unLoadPage=web.postPage(UNLOAD_POST_URL, unloadMap);//System.out.println(unLoadPage);doc=Jsoup.parse(unLoadPage);elements=doc.getElementsByTag("a");Element e=elements.get(0);String str=e.toString();str=str.substring(str.indexOf("https"));str=str.substring(0,str.indexOf("\">"));//System.out.println(str);String unLoadSuccessPage=web.getPage(str);//System.out.println(unLoadSuccessPage);if(unLoadSuccessPage.indexOf("下线成功")>-1){System.out.println("下线成功");isLoad=false;JOptionPane.showMessageDialog(null, "下线成功");}}/** * 取得上CMCC-EDU所用的无线网卡 IP地址 * */public String getLocalIp(){StringBuffer sb=new StringBuffer();Enumeration<NetworkInterface> interfaces = null;try {interfaces = NetworkInterface.getNetworkInterfaces();while(interfaces.hasMoreElements()){NetworkInterface ni=interfaces.nextElement();sb.append(ni.toString());}} catch (SocketException e) {e.printStackTrace();}String string=sb.toString();sb=null;String s=string.substring(string.indexOf("10.8."));s=s.substring(0,s.indexOf(";"));//System.out.println(s);return s;}}


0 0
原创粉丝点击