思路:
当用户登录完成后,(登录问题请参见,SWING实现新浪微博客户端(1)自动登录功能 )
1,模拟用户动作自动进入关注好友页面
2,根据关注好友页面结构提取关注好友的用户信息
3,将用户信息发送到后台,(例子中是在CONSOL中输出)
一,分析URL地址结构通过分析得知关注用户的URL地址为 http://t.sina.com.cn/2023096077/follow
而登录成功后的地址为
二,根据关注好友页面结构提取关注好友的用户信息
三,将用户信息发送到后台,(例子中是在CONSOL中输出)
当用户登录完成后,(登录问题请参见,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();
- }
- }