之前在“新浪微博客户端开发第一步”时就碰到这问题,后来通过一个比较“另类”的方法暂时解决了。今天终于通过比较正规的方法,使用Java程序直接获取到新浪微博Ouath2授权所需的code。进而获取到access_token…
PS:主要还是使用到DJ Native Swing。
运行图示:
代码如下:
import
java.awt.BorderLayout
;
import javax.swing.JDialog ;
import javax.swing.SwingUtilities ;
import weibo4j.Oauth ;
import weibo4j.examples.oauth2.Log ;
import weibo4j.http.AccessToken ;
import weibo4j.model.WeiboException ;
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.WebBrowserNavigationEvent ;
/**
* OAuth2授权
* @author 蜗牛都知道
* @see <a href="http://binary.duapp.com/"></a>
*/
public class OAuthDialog {
private String accessToken ;
private Oauth oauth = new Oauth ( ) ;
private String lastURL ;
public OAuthDialog ( ) {
final JDialog dialog = new JDialog ( ) ;
dialog. setTitle ( "授权" ) ;
dialog. setResizable ( false ) ;
dialog. setBounds ( 30, 30, 608, 522 ) ;
JWebBrowser webBrowser = new JWebBrowser ( ) ;
webBrowser. setBarsVisible ( false ) ;
webBrowser. setButtonBarVisible ( false ) ;
webBrowser. setDefaultPopupMenuRegistered ( false ) ;
try {
lastURL = oauth. authorize ( "code" ) ;
webBrowser. navigate (lastURL ) ;
} catch (WeiboException e ) {
e. printStackTrace ( ) ;
}
webBrowser. addWebBrowserListener ( new WebBrowserAdapter ( ) {
@Override
public void locationChanged (WebBrowserNavigationEvent arg0 ) {
String site = arg0. getWebBrowser ( ). getResourceLocation ( ) ;
if (lastURL. equals (site ) ) {
return ;
}
lastURL = site ;
if (site != null ) {
dialog. dispose ( ) ;
}
System. out. println (site ) ;
String code = site. substring (site. lastIndexOf ( "code=" ) + 5 ) ;
accessToken = getAccessTokenByCode (code ) ;
System. out. println (accessToken ) ;
}
} ) ;
dialog. add (webBrowser, BorderLayout. CENTER ) ;
dialog. setVisible ( true ) ;
dialog. setDefaultCloseOperation ( JDialog. DISPOSE_ON_CLOSE ) ;
}
private String getAccessTokenByCode ( String code ) {
Log. logInfo ( "code:" + code ) ;
AccessToken accessToken = null ;
try {
accessToken = oauth. getAccessTokenByCode (code ) ;
} catch (WeiboException e ) {
if ( 401 == e. getStatusCode ( ) ) {
Log. logInfo ( "Unableto get the access token." ) ;
} else {
e. printStackTrace ( ) ;
}
}
return accessToken. getAccessToken ( ) ;
}
public String getAccessToken ( ) {
return accessToken ;
}
public static void main ( String [ ] args ) {
NativeInterface. open ( ) ;
UIUtils. setPreferredLookAndFeel ( ) ;
SwingUtilities. invokeLater ( new Runnable ( ) {
public void run ( ) {
new OAuthDialog ( ) ;
}
} ) ;
NativeInterface. runEventPump ( ) ;
}
}
import javax.swing.JDialog ;
import javax.swing.SwingUtilities ;
import weibo4j.Oauth ;
import weibo4j.examples.oauth2.Log ;
import weibo4j.http.AccessToken ;
import weibo4j.model.WeiboException ;
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.WebBrowserNavigationEvent ;
/**
* OAuth2授权
* @author 蜗牛都知道
* @see <a href="http://binary.duapp.com/"></a>
*/
public class OAuthDialog {
private String accessToken ;
private Oauth oauth = new Oauth ( ) ;
private String lastURL ;
public OAuthDialog ( ) {
final JDialog dialog = new JDialog ( ) ;
dialog. setTitle ( "授权" ) ;
dialog. setResizable ( false ) ;
dialog. setBounds ( 30, 30, 608, 522 ) ;
JWebBrowser webBrowser = new JWebBrowser ( ) ;
webBrowser. setBarsVisible ( false ) ;
webBrowser. setButtonBarVisible ( false ) ;
webBrowser. setDefaultPopupMenuRegistered ( false ) ;
try {
lastURL = oauth. authorize ( "code" ) ;
webBrowser. navigate (lastURL ) ;
} catch (WeiboException e ) {
e. printStackTrace ( ) ;
}
webBrowser. addWebBrowserListener ( new WebBrowserAdapter ( ) {
@Override
public void locationChanged (WebBrowserNavigationEvent arg0 ) {
String site = arg0. getWebBrowser ( ). getResourceLocation ( ) ;
if (lastURL. equals (site ) ) {
return ;
}
lastURL = site ;
if (site != null ) {
dialog. dispose ( ) ;
}
System. out. println (site ) ;
String code = site. substring (site. lastIndexOf ( "code=" ) + 5 ) ;
accessToken = getAccessTokenByCode (code ) ;
System. out. println (accessToken ) ;
}
} ) ;
dialog. add (webBrowser, BorderLayout. CENTER ) ;
dialog. setVisible ( true ) ;
dialog. setDefaultCloseOperation ( JDialog. DISPOSE_ON_CLOSE ) ;
}
private String getAccessTokenByCode ( String code ) {
Log. logInfo ( "code:" + code ) ;
AccessToken accessToken = null ;
try {
accessToken = oauth. getAccessTokenByCode (code ) ;
} catch (WeiboException e ) {
if ( 401 == e. getStatusCode ( ) ) {
Log. logInfo ( "Unableto get the access token." ) ;
} else {
e. printStackTrace ( ) ;
}
}
return accessToken. getAccessToken ( ) ;
}
public String getAccessToken ( ) {
return accessToken ;
}
public static void main ( String [ ] args ) {
NativeInterface. open ( ) ;
UIUtils. setPreferredLookAndFeel ( ) ;
SwingUtilities. invokeLater ( new Runnable ( ) {
public void run ( ) {
new OAuthDialog ( ) ;
}
} ) ;
NativeInterface. runEventPump ( ) ;
}
}
记得导入包: DJNativeSwing-SWT.jar、DJNativeSwing.jar及swt-3.7M5-win32-win32-x86.jar
示例代码下载:只通过Java进行新浪微博Ouath2授权