zoukankan      html  css  js  c++  java
  • 【新手入门篇】新浪微博应用开发之Java入门篇

    新浪微博应用开发之Java篇

     

    20121111日星期日

    一、开发流程简介:

    1、  访问http://open.weibo.com/注册成为开发者

    2、  在以下地址创建一个应用,假设创建一个桌面应用:

    http://open.weibo.com/apps/new?sort=mobile

    3、  进入管理中心,查看并记住应用ID和密码:

    4、  在“应用中心-高级信息”设置回调页面(设置后一般需要半小时左右才能生效):

    OK,准备工作完成!

    二、不使用任何SDK实现Oauth授权并实现简单的发布微博功能:

    创建一个Java项目,编写如下代码,具体过程代码中已写的很清楚,这里不再做解释:

    注意先修改应用ID、应用密码和回调页面成你自己的!访问授权页面:

    package com;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.URL;
    import java.net.URLConnection;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.Scanner;
    
    import javax.net.ssl.X509TrustManager;
    
    /**
     * @author 刘显安
     * 不使用任何SDK实现新浪微博Oauth授权并实现发微薄小Demo
     * 日期:2012年11月11日
     */
    public class Test
    {
        static String clientId="2355065950";//你的应用ID
        static String clientSecret="72037e76bee00315691d9c30dd8a386a";//你的应用密码
        static String redirectUri="https://api.weibo.com/oauth2/default.html";//你在应用管理中心设置的回调页面
        
        public static void main(String[] args) throws Exception
        {
            testHttps();//测试
            //第一步:访问授权页面获取授权
            System.out.println("请打开你的浏览器,访问以下页面,登录你的微博账号并授权:");
            System.out.println("https://api.weibo.com/oauth2/authorize?client_id="+clientId+"&response_type=code&redirect_uri="+redirectUri+"&forcelogin=true");
            //第二步:获取AccessToken
            System.out.println("请将授权成功后的页面地址栏中的参数code:");
            String code=new Scanner(System.in).next();
            getAccessToken(code);
            //第三步:发布一条微博
            System.out.println("请输入上面返回的值中accessToken的值:");
            String accessToken=new Scanner(System.in).next();
            updateStatus("发布微博测试!来自WeiboDemo!", accessToken);
        }
        /**
         * 测试能否正常访问HTTPS打头的网站,
         */
        public static void testHttps()
        {
            try
            {
                trustAllHttpsCertificates();//设置信任所有的http证书
                URL url=new URL("https://api.weibo.com/oauth2/default.html");
                URLConnection con=url.openConnection();
                con.getInputStream();
                System.out.println("恭喜,访问HTTPS打头的网站正常!");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        /**
         * 以Post方式访问一个URL
         * @param url 要访问的URL
         * @param parameters URL后面“?”后面跟着的参数
         */
        public static void postUrl(String url,String parameters)
        {
            try
            {
                trustAllHttpsCertificates();//设置信任所有的http证书
                URLConnection conn = new URL(url).openConnection();
                conn.setDoOutput(true);// 这里是关键,表示我们要向链接里注入的参数
                OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());// 获得连接输出流
                out.write(parameters);
                out.flush();
                out.close();
                // 到这里已经完成了,开始打印返回的HTML代码
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null)
                {
                    System.out.println(line);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        /**
         * 获取AccessToken
         * @param code 在授权页面返回的Code
         */
        public static void getAccessToken(String code)
        {
            String url="https://api.weibo.com/oauth2/access_token";
            String parameters="client_id=" +clientId+"&client_secret=" +clientSecret+
                "&grant_type=authorization_code" +"&redirect_uri=" +redirectUri+"&code="+code;
            postUrl(url, parameters);
        }
        /**
         * 利用刚获取的AccessToken发布一条微博
         * @param text 要发布的微博内容
         * @param accessToken 刚获取的AccessToken
         */
        public static void updateStatus(String text,String accessToken)
        {
            String url="https://api.weibo.com/2/statuses/update.json";
            String parameters="status="+text+"&access_token="+accessToken;
            postUrl(url, parameters);
            System.out.println("发布微博成功!");
        }
        /**
         * 设置信任所有的http证书(正常情况下访问https打头的网站会出现证书不信任相关错误,所以必须在访问前调用此方法)
         * @throws Exception
         */
        private static void trustAllHttpsCertificates() throws Exception
        {
            javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
            trustAllCerts[0] = new X509TrustManager()
            {
                @Override
                public X509Certificate[] getAcceptedIssuers()
                {
                    return null;
                }
                @Override
                public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                        throws CertificateException
                {}
                @Override
                public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                        throws CertificateException
                {}
            };
            javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, null);
            javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        }
    }

    访问授权页面:

    授权成功:

    发布微博成功:

    控制台输出结果:

    三、使用weibo4j-oauth2这个SDK做一个简单的抢沙发工具:

    1、SDK下载:

    http://code.google.com/p/weibo4j

    下载下来是个包含测试代码的整个SDK源代码,可以打包成jar文件方便调用,我这里打包成名为weibo4j-oauth2.jar的文件,注意先修改config.properties文件中的应用id、应用密码、回调页面。

    2、在项目中导入以下6个包:

     

    3、使用WindowsBuild新建一个Jframe窗体,大体布局如下:

    三个按钮的事件分别如下:

    public Date minTime;//最近一条微博的更新时间
        /**
         * 打开授权页面
         */
        public void openUrl()
        {
            try
            {
                BareBonesBrowserLaunch.openURL(new Oauth().authorize("code"));
            }
            catch (WeiboException e)
            {
                e.printStackTrace();
            }
        }
        /**
         * 获取当前登录用户的好友列表
         */
        public void getFriends()
        {
            try
            {
                //获取好友列表
                accessToken=new Oauth().getAccessTokenByCode(textFieldCode.getText());
                Friendships friendships=new Friendships();
                friendships.setToken(accessToken.getAccessToken());
                for(User user:friendships.getFriendsByID(accessToken.getUid()).getUsers())
                {
                    comboBox.addItem(user.getName());
                }
            }
            catch (WeiboException e)
            {
                e.printStackTrace();
            }
        }
        /**
         * 开始监控关注用户的微博
         * @throws WeiboException 
         */
        public void start()
        {
            try
            {
                System.out.println("开始监控");
                Timeline timeline=new Timeline();
                timeline.setToken(accessToken.getAccessToken());
                minTime = timeline.getUserTimelineByName(comboBox.getSelectedItem().toString()).getStatuses().get(0).getCreatedAt();
                Timer timer=new Timer();
                timer.schedule(new TimerTask()
                {
                    @Override
                    public void run()
                    {
                        try
                        {
                            Timeline timeline=new Timeline();
                            timeline.setToken(accessToken.getAccessToken());
                            Status status=timeline.getUserTimelineByName(comboBox.getSelectedItem().toString()).getStatuses().get(0);
                            if(status.getCreatedAt().after(minTime))//如果最新微博的发表时间在之前相对时间的后面
                            {
                                minTime=status.getCreatedAt();
                                System.out.println("你关注的用户更新微博啦");
                                Comments comments=new Comments();
                                comments.setToken(accessToken.getAccessToken());
                                comments.createComment("哈哈,我来评论啦!", status.getId());
                                JOptionPane.showMessageDialog(null, "恭喜,抢沙发成功!");
                            }
                        }
                        catch (WeiboException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }, 0, 5000);//设置5秒钟刷新一次
            }
            catch (WeiboException e)
            {
                e.printStackTrace();
            }
        }

    项目源代码下载地址:

    http://download.csdn.net/detail/liuxianan612/4755895

    整理后的SDK下载地址:

    http://download.csdn.net/detail/liuxianan612/4755925

    有问题可以联系: 

    微博:http://weibo.com/liuxianan

    博客园:http://www.cnblogs.com/liuxianan/

  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/liuxianan/p/2765123.html
Copyright © 2011-2022 走看看