网站调用新浪微博内容(手头新浪微博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下载地址