zoukankan      html  css  js  c++  java
  • 新浪微博教程(一)

       公司的应用需要一个分享功能,希望能够分享到新浪和腾讯的微博平台上去。要求比较简单,只是允许用户能够发一条我们预制好的微博即可。

        新浪微博和腾讯微博都有各自的开放平台,平台上提供了丰富的api接口和详尽的说明文档。即使从来没有做过,借助这些资料和SDK上的Demo,都可以迅速上手。

        本文将分两部分来各自介绍新浪和腾讯微博分享的流程和操作方法,仅为菜鸟童鞋们参考。其中最多的问题都来自于Oauth认证,而认证这部分最多的问题来自于腾讯微博,这一点我们后边再说。

        由于新浪和腾讯采用的Oauth认证算法的版本不一样,腾讯使用的是Oauth1.0 ,尽管官方提供的SDK说已经支持Oauth2.0,但是我没有试验成功。

        通过了认证,什么问题都会迎刃而解。

        好了,废话不多说,正文开始。

      一:Oauth认证简介

        首先来说Oauth认证到底是个神马东西,简单来说就是一种授权的算法。可以保证第三方应用在不拿到用户微博的账号和密码的前提下,访问用户的微博信息,而这一切都需要用户的授权才可以,从而最大程度的保护用户账号和密码的安全。

        认证步骤简述如下:

    1. 用户要使用第三方应用的微博服务,第三方应用首先向新浪微博请求身份验证。

    2.服务器根据第三应用提供的APP Key和App Secret(密钥) ,核实是否是合法应用。

    如果通过验证,返回第三方应用一个未授权的请求令牌(Request Token)。这个令牌告诉用户,此应用是合法滴。

    3. 第三方应用拿着这个未授权的令牌,重定向到服务端的用户授权页,请求用户授权。这个授权页一定是服务端的,不允许第三方来构造。

    4.用户输入授权账号和密码,提交服务端验证通过后,会向第三方应用返回授权的请求令牌和验证码等。

    5.第三方应用在拿着授权的请求令牌去换取访问令牌(Access Token)。

    6.服务器返回访问令牌

    如下图所示:

        二:新浪微博应用申请及SDK下载

    1. 登录新浪微博开房平台,没有的话就注册一个。

    2.创建一款手机应用,按照向导提示,输入相关信息即可。新浪会为你的应用分配一个独一无二的APP KEY和APP Secret 。将这两个东西保存好。

    当然这只是我们自己申请测试的应用,在访问人数和次数上,会有一定的限制。如果你的应用需要正式上线运行,要提交新浪审核。

    3.准备工作完成,去平台下载android版的SDK。

        三:动手开发测试

    新浪微博的SDK包中含有一个简单的DEMO,可以发布一条微博,这对我们来说已近足够。我们主要使用它封装好的API。

    1.SDK集成

    将SDK包中的android.net.http,android.webket,com.weibo.net包拷贝到自己的项目目录下,这个不用多说。

    2. 在AuthorizeActivity中,将APP KEY和App Secret替换成自己申请应用的APP KEY和App Secret。

    3.按照文档介绍,手机的桌面应用使用隐式验证即可。其中Activity的重要代码按照如下编写即可。参见下载包中的微博SDK说明文档。

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
     
    import com.weibo.net.AccessToken;
    import com.weibo.net.DialogError;
    import com.weibo.net.Oauth2AccessToken;
    import com.weibo.net.RequestToken;
    import com.weibo.net.Weibo;
    import com.weibo.net.WeiboDialogListener;
    import com.weibo.net.WeiboException;
     
    /**
     * Sample code for testing weibo APIs.
     * 
     * @author ZhangJie (zhangjie2@staff.sina.com.cn)
     */
     
    public class AuthorizeActivity extends Activity {
        /** Called when the activity is first created. */
        private Button mLogin;
        private TextView mToken;
     
        private static final String URL_ACTIVITY_CALLBACK = "weiboandroidsdk://TimeLineActivity";
        private static final String FROM = "xweibo";
     
        // 设置appkey及appsecret,如何获取新浪微博appkey和appsecret请另外查询相关信息,此处不作介绍
        // 替换为开发者的appkey,例"1646212960";
        private static final String CONSUMER_KEY = "3543730096";
        // 替换为开发者的appkey,例"94098772160b6f8ffc1315374d8861f9";
        private static final String CONSUMER_SECRET = "765385b9d52ffd2fe548141d29f6d1af";
     
        private String username = "";
        private String password = "";
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mToken = (TextView) this.findViewById(R.id.tvToken);
            mLogin = (Button) this.findViewById(R.id.btnLogin);
            mLogin.setText("oauth!");
            mLogin.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (v == mLogin) {
                        Weibo weibo = Weibo.getInstance();
                        weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);
     
                        // Oauth2.0
                        // 隐式授权认证方式
                        // 此处回调页内容应该替换为与appkey对应的应用回调页
                        weibo.setRedirectUrl("http://www.sina.com");
                        // 对应的应用回调页可在开发者登陆新浪微博开发平台之后,
                        // 进入我的应用--应用详情--应用信息--高级信息--授权设置--应用回调页
                        // 进行设置和查看
                        // 应用回调页不可为空
                        weibo.authorize(AuthorizeActivity.this,
                                new AuthDialogListener());
     
                        // try {
                        // // Oauth2.0 认证方式
                        // Weibo.setSERVER("https://api.weibo.com/2/");
                        // Oauth2AccessToken at =
                        // weibo.getOauth2AccessToken(AuthorizeActivity.this,
                        // Weibo.getAppKey(), Weibo.getAppSecret(), username,
                        // password);
                        // // xauth认证方式
                        // /*
                        // * Weibo.setSERVER("http://api.t.sina.com.cn/");
                        // * AccessToken at =
                        // * weibo.getXauthAccessToken(TextActivity.this,
                        // * Weibo.APP_KEY, Weibo.APP_SECRET, "", "");
                        // * mToken.setText(at.getToken());
                        // */
                        // RequestToken requestToken =
                        // weibo.getRequestToken(AuthorizeActivity.this,
                        // Weibo.getAppKey(), Weibo.getAppSecret(),
                        // AuthorizeActivity.URL_ACTIVITY_CALLBACK);
                        // mToken.setText(requestToken.getToken());
                        // Uri uri =
                        // Uri.parse(AuthorizeActivity.URL_ACTIVITY_CALLBACK);
                        // startActivity(new Intent(Intent.ACTION_VIEW, uri));
                        //
                        // } catch (WeiboException e) {
                        // e.printStackTrace();
                        // } // mToken.setText(at.getToken());
                        //
     
                    }
                }
            });
     
        }
     
        public void onResume() {
            super.onResume();
        }
     
        class AuthDialogListener implements WeiboDialogListener {
     
            @Override
            public void onComplete(Bundle values) {
                String token = values.getString("access_token");
                String expires_in = values.getString("expires_in");
                mToken.setText("access_token : " + token + "  expires_in: "
                        + expires_in);
                AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);
                accessToken.setExpiresIn(expires_in);
                Weibo.getInstance().setAccessToken(accessToken);
                Intent intent = new Intent();
                intent.setClass(AuthorizeActivity.this, TestActivity.class);
                startActivity(intent);
            }
     
            @Override
            public void onError(DialogError e) {
                Toast.makeText(getApplicationContext(),
                        "Auth error : " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
     
            @Override
            public void onCancel() {
                Toast.makeText(getApplicationContext(), "Auth cancel",
                        Toast.LENGTH_LONG).show();
            }
     
            @Override
            public void onWeiboException(WeiboException e) {
                Toast.makeText(getApplicationContext(),
                        "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG)
                        .show();
            }
     
        }
     
    }

     

        常见问题:

        新浪微博的使用还是比较顺利的,唯一遇到的下面的问题

        error:redirect_uri_mismatch

        这个是由于没有仔细看说明文档,文档中清楚的说明了使用隐式验证的时候,要设置应用回调页。设置方法在代码中也有。

        登录新浪微博开放平台,新浪微博开放平台->我的应用->应用信息->高级应用->授权设置->应用回调页中的url地址保持一致就可以了,如图所示:

     

        四:发一条微博

        测试一下,运行app,发送一条带图片的微博。如下图

     

        登录新浪微博,查看一下,试验成功!

     

        原文地址:http://www.67tgb.com/?p=483

  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/firecode/p/2677562.html
Copyright © 2011-2022 走看看