网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)

优采云 发布时间: 2021-08-30 03:02

  网站调用新浪微博内容(手头新浪微博SDK下载地址介绍OpenAPI)

  要求

  手头的一个应用需要添加分享到新浪微博的功能。这个功能在目前的应用中很常见。

  分享到新浪微博其实就是发一条特定内容的微博,所以需要新浪微博SDK。

  微博SDK

  SDK 下载链接收录了很多平台的包,包括安卓版本。

  下载后请务必阅读SDK文档,运行自带的demo,对SDK的使用有一个大致的了解。

  发微博的麻烦

  运行DEMO后发现发送微博的功能是通过调用微博客户端实现的。如果用户没有安装,会提示用户下载或选择放弃发送。 . 这显然是不可靠的,因为还有很多用户没有安装微博客户端。

  

  网上很多人也遇到过这个问题。从他们的说法来看,之前版本的微博SDK好像还有发送微博的功能,但是新版本的SDK中已经没有了。

  但是demo里面有个提示:如果不想用微博客户端分享,请参考OpenAPI。

  那我们来看看这个OpenAPI有哪些功能。

  开放API

  OpenAPI 文档:%E5%BE%AE%E5%8D%9AAPI

  可以看出OpenAPI是通过Http请求来进行一些操作的,可以进行的操作基本涵盖了微博应用的方方面面。

  我们找到了发送微博的API:status/update

  文档的描述很详细。接口通过POST方法改变。请求参数有很多,但只有一个是必须的。但是要改界面,需要登录,所以必须在参数中加上已经授权登录的AccessToken:

  参数名称必须选择类型和作用域描述

  状态

  真实

  字符串

  要发布的微博文字内容必须经过URL编码,内容不得超过140个汉字。

  访问令牌

  真实

  字符串

  登录后获得,详情见后文

  现在,发送微博的逻辑很清楚了,就是一个post请求。另一个需要解决的问题是AccessToken,即登录授权。

  登录授权

  并不是想让用户在你的应用中登录微博直接写代码,因为用户在你的应用中输入了账号信息,所以为了用户的账号安全,这是有风险的,所以如果你的应用需要添加微博功能,需要新浪审核。这个过程我还没有完全走完,大家可以参考微博文档的帮助:手机客户端访问

  这个文章主要是讲程序的,就不纠结这些过程了。简而言之,我们需要的是一个A*敏*感*词*EY,它是登录授权所需要的。我们现在可以使用SDK微博应用demo的A*敏*感*词*EY进行实验了。

  DEMO练习步骤因为使用微博DEMO的A*敏*感*词*EY,所以需要替换默认的debug.keystore

  在 C:\Users\XXXXX.android 目录中,将 Android 默认的 debug.keystore 替换为 GitHub 上提供的官方 debug.keystore。

  请注意:这一步是必须的。如果没有替换,演示程序在运行时将无法正确授权成功。在更换之前,最好备份一下原来的debug.keystore。另外,debug.keysotre 是新浪官方的。除编译运行官方DEMO外,请勿直接使用。出于安全原因,您应该为您的应用程序提供一个密钥。创建一个新的android项目,并将包命名为:com.sina.weibo.sdk.demo 将微博DEMO中的Constants.java复制到项目中

  在 AndroidManifest.xml 中添加权限:

  主界面的代码,登录授权部分的代码直接取自微博官方demo,发送微博部分就是上面分析的实现:

   public class MainActivity extends Activity {

private static final String TAG = "MainActivity";

/** 微博 Web 授权类,提供登陆等功能 */

private WeiboAuth mWeiboAuth;

/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */

private Oauth2AccessToken mAccessToken;

private TextView mTokenInfoTV;

private EditText mMessageET;

private Button mSendBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);

mTokenInfoTV = (TextView) findViewById(R.id.textView_tokenInfo);

mMessageET = (EditText) findViewById(R.id.editText_message);

mSendBtn = (Button) findViewById(R.id.button_sendWeibo);

// 获取Token

findViewById(R.id.button_getToken).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mWeiboAuth.anthorize(new AuthListener());

}

});

// 发送微博

mMessageET.setVisibility(View.GONE);

mSendBtn.setVisibility(View.GONE);

mSendBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

sendWeibo(mMessageET.getText().toString());

}

});

}

// 发送微博

protected void sendWeibo(String string) {

//组织post参数

List params = new LinkedList();

params.add(new BasicNameValuePair("status", string));

params.add(new BasicNameValuePair("access_token", mAccessToken.getToken()));

HttpClient httpClient = new DefaultHttpClient();

//传入post方法的请求地址,即发送微博的api接口

HttpPost postMethod = new HttpPost("https://api.weibo.com/2/statuses/update.json");

try {

postMethod.setEntity(new UrlEncodedFormEntity(params, "utf-8"));

HttpResponse httpResponse = httpClient.execute(postMethod);

//将返回结果转为字符串,通过文档可知返回结果为json字符串,结构请参考文档

String resultStr=EntityUtils.toString(httpResponse.getEntity());

Log.e(TAG, resultStr);

//从json字符串中建立JSONObject

JSONObject resultJson = new JSONObject(resultStr);

//如果发送微博失败的话,返回字段中有"error"字段,通过判断是否存在该字段即可知道是否发送成功

if (resultJson.has("error")) {

Toast.makeText(this, "发送失败", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(this, "发送成功", Toast.LENGTH_SHORT).show();

}

} catch (UnsupportedEncodingException e) {

Log.e(TAG, e.getLocalizedMessage());

} catch (ClientProtocolException e) {

Log.e(TAG, e.getLocalizedMessage());

} catch (IOException e) {

Log.e(TAG, e.getLocalizedMessage());

} catch (ParseException e) {

Log.e(TAG, e.getLocalizedMessage());

} catch (JSONException e) {

Log.e(TAG, e.getLocalizedMessage());

}

}

//登录授权接口

class AuthListener implements WeiboAuthListener {

//登录成功

@Override

public void onComplete(Bundle values) {

// 从 Bundle 中解析 Token

mAccessToken = Oauth2AccessToken.parseAccessToken(values);

if (mAccessToken.isSessionValid()) {

// 显示 Token

updateTokenView();

// 显示发送微博的按钮和输入框

mSendBtn.setVisibility(View.VISIBLE);

mMessageET.setVisibility(View.VISIBLE);

// 保存 Token 到 SharedPreferences

// AccessTokenKeeper.writeAccessToken(MainActivity.this,

// mAccessToken);

Toast.makeText(MainActivity.this, "授权成功", Toast.LENGTH_SHORT).show();

} else {

// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确

String code = values.getString("code");

String message = "授权失败";

if (!TextUtils.isEmpty(code)) {

message = message + "\nObtained the code: " + code;

}

Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();

}

}

@Override

public void onCancel() {

Toast.makeText(MainActivity.this, "取消授权", Toast.LENGTH_LONG).show();

}

@Override

public void onWeiboException(WeiboException e) {

Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();

}

}

//显示token信息

private void updateTokenView() {

String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new java.util.Date(mAccessToken

.getExpiresTime()));

String format = "Token:%1$s \n有效期:%2$s";

mTokenInfoTV.setText(String.format(format, mAccessToken.getToken(), date));

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

  主界面的布局代码:

  运行效果

  

  

  

  发微博DEMO下载地址

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线