`
wenzhangli
  • 浏览: 5796 次
社区版块
存档分类
最新评论

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();
    
  }
 

}

  • 大小: 93.7 KB
  • 大小: 212.1 KB
  • 大小: 209 KB
分享到:
评论

相关推荐

    java swing 模拟新浪微博

    简单的java swing 编写的新浪微博用户登陆客户端。 在本地运行时,需要自己修改config.properties中client_ID和client_SERCRET属性的值。这两个值需要自己通过注册得到。

    Java新浪微博客户端开发第六步(完结&amp;&amp;开源)

    在本项目中,我们讨论的是一个使用Java语言开发的新浪微博客户端。这个客户端的开发教程已经进入了第六步,标志着整个项目已经完成,并且源代码已公开,鼓励开发者学习和使用。通过阅读提供的链接,我们可以获取更多...

    新浪微博模拟登陆

    本主题聚焦于使用Java实现对新浪微博的模拟登录,这对于数据分析、信息抓取或自动化测试等应用场景具有重要意义。 【描述】:“新浪微博模拟登陆源代码,java实现,微博数据抓取” 这段描述揭示了几个关键点: 1....

    iBeebo:第三方新浪微博客户端

    《iBeebo:基于Java开发的第三方新浪微博客户端解析》 在互联网社交领域,新浪微博作为中国的一款主流社交媒体平台,吸引了大量的用户。为了提供多样化的用户体验,开发者们常常会推出第三方客户端,以不同的界面...

    java新浪微博(含源代码)

    在这个项目中,我们重点讨论基于Java实现的新浪微博API客户端,它提供了访问和交互微博数据的能力。 首先,Java是面向对象的编程语言,它的强大在于其丰富的类库和强大的社区支持。在开发微博应用时,可以使用如...

    java swing udp 客户端与客户端 通讯

    java swing udp 客户端与客户端 通讯 两客户端 通过IP 端口 相互发消息通讯,swing界面

    Java模拟登录新浪微博

    NULL 博文链接:https://tonyj.iteye.com/blog/1897604

    sina-weibo.rar_新浪微博

    【标题解析】:“sina-weibo.rar_新浪微博”这个标题表明我们关注的是一个与新浪微博相关的项目,它被封装在一个名为“sina-weibo.rar”的压缩文件中。rar是一种常见的压缩文件格式,通常用于存储和传输多个相关文件...

    swing发邮件客户端

    Swing邮件客户端是一种基于Java Swing库开发的桌面应用程序,它允许用户发送电子邮件,类似于流行的Foxmail客户端。Swing是Java的一个图形用户界面(GUI)工具包,提供了丰富的组件和功能,使得开发者可以创建出美观且...

    新浪微博文字向下滚动效果

    今天我们将深入探讨如何实现“新浪微博文字向下滚动效果”,主要关注其在Java和样式方面的实现细节。 一、Java实现滚动效果 在Java中,我们可以使用Swing或JavaFX库来创建GUI应用,并实现文本滚动效果。虽然Java...

    Java Swing组件写的游戏客户端.zip

    Java Swing组件写的游戏客户端Java Swing组件写的游戏客户端 Java Swing组件写的游戏客户端Java Swing组件写的游戏客户端 Java Swing组件写的游戏客户端Java Swing组件写的游戏客户端 Java Swing组件写的游戏客户端...

    sina.zip_CrazyitWeibo_sina_新浪微博

    【标题】"sina.zip_CrazyitWeibo_sina_新浪微博"揭示了这是一个与新浪微薄相关的项目,可能是一个第三方的Java实现的客户端程序。"CrazyitWeibo"可能是这个项目的名称,由"Crazyit"团队开发,专门用于与新浪微博进行...

    基于Java Swing 的FTP客户端程序

    【Java Swing FTP客户端程序】是一种基于Java编程语言的图形用户界面(GUI)工具,用于实现文件传输协议(FTP)。在本文中,我们将深入探讨如何利用Java Swing构建一个FTP客户端,以及涉及的关键技术和概念。 首先...

    rain12306-java swing实现12306客户端 无任何服务端依赖.zip

    《rain12306-java swing实现12306客户端》是一款基于Java Swing技术开发的12306火车票预订系统,它无需依赖任何服务端组件,完全由客户端程序独立完成用户登录、余票查询及个人订单管理等功能。这款软件展示了Java ...

    用swing和socket实现的聊天室

    为了实现聊天记录的实时更新,可以在客户端和服务器之间设置一个消息队列,当有新的聊天信息时,服务器将信息放入队列,客户端通过持续连接获取队列中的新消息。同时,为了优化性能和用户体验,可以考虑使用缓存策略...

    Java开发基于swing编写的客户端界面简单的考试系统信息管理系统源码.zip

    Java开发基于swing编写的客户端界面简单的考试系统信息管理系统源码.zipJava开发基于swing编写的客户端界面简单的考试系统信息管理系统源码.zipJava开发基于swing编写的客户端界面简单的考试系统信息管理系统源码....

    用JAVA swing 模拟实现Ftp客户端的基本操作,可以看到上传下载的速度等.zip

    本项目是利用Java Swing模拟实现了一个FTP(File Transfer Protocol)客户端,实现了基本的FTP文件传输操作,并且能够实时显示上传和下载的速度。 FTP是一种广泛使用的协议,用于在网络上进行文件传输。它允许用户...

    Java+Swing即时聊天系统,客户端和服务端,多线程,socket

    Java+Swing即时聊天系统是基于Java编程语言和Swing GUI库构建的,它提供了一个基本的实时通信平台,允许用户进行私聊、公聊以及接收用户上下线的通知。这个系统利用了Java的核心特性,包括多线程和网络编程,通过...

Global site tag (gtag.js) - Google Analytics