新浪和腾讯微博教程(一)

时间:2022-06-05 09:39:51

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

    新浪微博和腾讯微博都有各自的开放平台,平台上提供了丰富的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

  欢迎访问:http://www.67tgb.com