读书人

SWING兑现新浪微博客户端(2)提取关注

发布时间: 2012-12-22 12:05:06 作者: rapoo

SWING实现新浪微博客户端(2)提取关注好友信息
思路:
当用户登录完成后,(登录问题请参见,SWING实现新浪微博客户端(1)自动登录功能 )
1,模拟用户动作自动进入关注好友页面
2,根据关注好友页面结构提取关注好友的用户信息
3,将用户信息发送到后台,(例子中是在CONSOL中输出)

一,分析URL地址结构通过分析得知关注用户的URL地址为 http://t.sina.com.cn/2023096077/follow
而登录成功后的地址为



二,根据关注好友页面结构提取关注好友的用户信息





三,将用户信息发送到后台,(例子中是在CONSOL中输出)



import java.awt.BorderLayout;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.Properties;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.SwingUtilities;import chrriis.common.UIUtils;import chrriis.dj.nativeswing.swtimpl.NativeInterface;import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;import chrriis.dj.nativeswing.swtimpl.components.WebBrowserAdapter;import chrriis.dj.nativeswing.swtimpl.components.WebBrowserCommandEvent;import chrriis.dj.nativeswing.swtimpl.components.WebBrowserNavigationEvent;public class SSOSina extends JPanel {  protected static final String LS = System.getProperty("line.separator");   private static final  String  loginUrl="http://t.sina.com.cn";      private static  Properties  userProperties=new Properties();  public SSOSina() {    super(new BorderLayout());        InputStream in = this.getClass().getResourceAsStream("userProperties.properties");    if (in == null) {        in = Thread.currentThread().getContextClassLoader().getResourceAsStream("userProperties.properties");        if (in == null) {            in = this.getClass().getClassLoader().getResourceAsStream("userProperties.properties");        }    }        try {userProperties.load(in);} catch (IOException e1) {e1.printStackTrace();}        JPanel webBrowserPanel = new JPanel(new BorderLayout());    webBrowserPanel.setBorder(BorderFactory.createTitledBorder("DJNative JAVA浏览器实现 实现新浪微博自动登录"));    final JWebBrowser webBrowser = new JWebBrowser();    webBrowser.setBarsVisible(true);    webBrowser.setDefaultPopupMenuRegistered(true);    webBrowser.setStatusBarVisible(true);       webBrowser.navigate(loginUrl);    //单点登录自动提交监听器    class SaveUserListener extends WebBrowserAdapter{       @Override           public void commandReceived(WebBrowserCommandEvent e) {             String command = e.getCommand();             Object[] parameters = e.getParameters();             if("print".equals(command)) {               String html = (String)parameters[0] ;               System.out.println(html);             }             if("saveuser".equals(command)) {               String loginname = (String)parameters[0] ;               String password = (String)parameters[1] ;            userProperties.setProperty("loginname", loginname);             userProperties.setProperty("password", password);try {String runningURL = (new URL(SaveUserListener.class.getProtectionDomain().getCodeSource().getLocation(),".")).openConnection().getPermission().getName();userProperties.save(new   FileOutputStream(new File(runningURL+"userProperties.properties")),"changed");} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}                       }           }               }            class ReLoginListener extends WebBrowserAdapter{            public void locationChanged(WebBrowserNavigationEvent e) {         if (e.getNewResourceLocation().equals("http://t.sina.com.cn")){             userProperties.setProperty("loginname", "");                     userProperties.setProperty("password", "");               try {  String runningURL = (new URL(SaveUserListener.class  .getProtectionDomain().getCodeSource().getLocation(),  ".")).openConnection().getPermission().getName();  userProperties.save(new   FileOutputStream(new File(runningURL+"jdsclient_init.properties")),"changed");    } catch (FileNotFoundException e1) {  e1.printStackTrace();  } catch (IOException e1) {    e1.printStackTrace();  }                                                  String script="function saveuser(){" +LS+           "sendNSCommand('saveuser',document.getElementById('loginname').value,document.getElementById('password').value);"+LS+           "void(0);" +LS+           "}" +LS+           "document.getElementById('login_submit_btn').href=\"javascript:'saveuser()'\";document.getElementById('login_submit_btn').attachEvent('onclick',saveuser);" +LS+           "alert('用户名密码错误请重新输入');" +LS+           "";         e.getWebBrowser().executeJavascript(script);                 }                          }        }    class GetUserListener extends WebBrowserAdapter{      public void locationChanged(WebBrowserNavigationEvent e) {          //判断登录成功进入首页     if( e.getWebBrowser().getPageTitle().indexOf("我的首页 ")>-1){     String url=e.getNewResourceLocation();    String id=url.substring(url.lastIndexOf("/")+1, url.length());      e.getWebBrowser().navigate("http://t.sina.com.cn/"+id+"/follow");//跳转到用户关注页面     }          if (e.getNewResourceLocation().endsWith("/follow")){            //首先重写App.followcancel方法,修改为输出到控制台的日志      //跟据HTML规则提取关注用户HTML,再模拟点击                  String script="var tagName='a';" +                  " App.followcancel=function(id,div,type,name,sex)" +                  "{" +                  "sendNSCommand('print','id='+id+';'+'name='+name)" +                  "};" +                  "var allA=document.all.tags(tagName);" +                  "for(var i=0 ;i<allA.length;i++){" +                  "if (allA[i].outerHTML.indexOf('App.followcancel(')>-1)" +                  "{" +                  "allA[i].click();" +                  "sendNSCommand('print',allA[i].outerHTML)" +                  "}" +                  "}";                   e.getWebBrowser().executeJavascript(script);                     }       }      }              class SsoListener extends WebBrowserAdapter{      public void locationChanged(WebBrowserNavigationEvent e) {      if (e.getNewResourceLocation().equals("http://t.sina.com.cn/")){    String loginname= userProperties.getProperty("loginname")  ;               String password= userProperties.getProperty("password")  ;               if ((loginname!=null &&!loginname.equals(""))  && (password!=null && !loginname.equals(""))){                String script="document.getElementById('loginname').value='"+loginname+"';" +LS+          "document.getElementById('password').value='"+password+"';" +LS+          "document.getElementById('login_submit_btn').click();";                 e.getWebBrowser().executeJavascript(script);              //此处为修改代码                                                   e.getWebBrowser().removeWebBrowserListener(this);//关闭当前监听                                            //此处为修改代码               }else{                String script="function saveuser(){" +LS+                "sendNSCommand('saveuser',document.getElementById('loginname').value,document.getElementById('password').value);"+LS+                            "}" +LS+                "document.getElementById('login_submit_btn').attachEvent('onclick',saveuser);" +LS+                "alert('存储的用户名密码为空,请输入用户名密码')" +LS+                "";               e.getWebBrowser().executeJavascript(script);               e.getWebBrowser().removeWebBrowserListener(this);               e.getWebBrowser().addWebBrowserListener(new ReLoginListener());               }                  }else{      System.out.println(e.getNewResourceLocation());      }      }             }              webBrowser.addWebBrowserListener(new SaveUserListener());    webBrowser.addWebBrowserListener(new SsoListener());    webBrowser.addWebBrowserListener(new GetUserListener());//添加GetUserListener        webBrowserPanel.add(webBrowser, BorderLayout.CENTER);      add(webBrowserPanel, BorderLayout.CENTER);  }    public  InputStream loadResource(String name) {      InputStream in = this.getClass().getResourceAsStream(name);      if (in == null) {          in = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);          if (in == null) {              in = this.getClass().getClassLoader().getResourceAsStream(name);          }      }      return in;  }    public static void main(String[] args) {    UIUtils.setPreferredLookAndFeel();    NativeInterface.open();    SwingUtilities.invokeLater(new Runnable() {      public void run() {        JFrame frame = new JFrame("测试新浪微博登录");        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        frame.getContentPane().add(new SSOSina(), BorderLayout.CENTER);        frame.setSize(800, 600);        frame.setLocationByPlatform(true);        frame.setVisible(true);      }    });    NativeInterface.runEventPump();      } }

读书人网 >编程

热点推荐