/*
* Copyright (C) 2010-2013 The SINA WEIBO Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sina.weibo.sdk.openapi;
import android.content.Context;
import android.util.SparseArray;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
/**
* 此类封装了评论的接口。
* 详情请参考<a href="http://t.cn/8F3geol">评论接口</a>
*
* @author SINA
* @since 2014-03-03
*/
public class CommentsAPI extends AbsOpenAPI {
/** 作者筛选类型,0:全部、1:我关注的人、2:陌生人 */
public static final int AUTHOR_FILTER_ALL = 0;
public static final int AUTHOR_FILTER_ATTENTIONS = 1;
public static final int AUTHOR_FILTER_STRANGER = 2;
/** 来源筛选类型,0:全部、1:来自微博的评论、2:来自微群的评论 */
public static final int SRC_FILTER_ALL = 0;
public static final int SRC_FILTER_WEIBO = 1;
public static final int SRC_FILTER_WEIQUN = 2;
/**
* API 类型。
* 命名规则:
* <li>读取接口:READ_API_XXX
* <li>写入接口:WRITE_API_XXX
* 请注意:该类中的接口仅做为演示使用,并没有包含所有关于微博的接口,第三方开发者可以
* 根据需要来填充该类,可参考legacy包下 {@link com.sina.weibo.sdk.openapi.legacy.CommentsAPI}
*/
private static final int READ_API_TO_ME = 0;
private static final int READ_API_BY_ME = 1;
private static final int READ_API_SHOW = 2;
private static final int READ_API_TIMELINE = 3;
private static final int READ_API_MENTIONS = 4;
private static final int READ_API_SHOW_BATCH = 5;
private static final int WRITE_API_CREATE = 6;
private static final int WRITE_API_DESTROY = 7;
private static final int WRITE_API_SDESTROY_BATCH = 8;
private static final int WRITE_API_REPLY = 9;
private static final String API_BASE_URL = API_SERVER + "/comments";
private static final SparseArray<String> sAPIList = new SparseArray<String>();
static {
sAPIList.put(READ_API_TO_ME, API_BASE_URL + "/to_me.json");
sAPIList.put(READ_API_BY_ME, API_BASE_URL + "/by_me.json");
sAPIList.put(READ_API_SHOW, API_BASE_URL + "/show.json");
sAPIList.put(READ_API_TIMELINE, API_BASE_URL + "/timeline.json");
sAPIList.put(READ_API_MENTIONS, API_BASE_URL + "/mentions.json");
sAPIList.put(READ_API_SHOW_BATCH, API_BASE_URL + "/show_batch.json");
sAPIList.put(WRITE_API_CREATE, API_BASE_URL + "/create.json");
sAPIList.put(WRITE_API_DESTROY, API_BASE_URL + "/destroy.json");
sAPIList.put(WRITE_API_SDESTROY_BATCH, API_BASE_URL + "/sdestroy_batch.json");
sAPIList.put(WRITE_API_REPLY, API_BASE_URL + "/reply.json");
}
/**
* 构造函数,使用各个 API 接口提供的服务前必须先获取 Token。
*
* @param accesssToken 访问令牌
*/
public CommentsAPI(Context context, String appKey, Oauth2AccessToken accessToken) {
super(context, appKey, accessToken);
}
/**
* 根据微博ID返回某条微博的评论列表。
*
* @param id 需要查询的微博ID。
* @param since_id 若指定此参数,则返回ID比since_id大的评论(即比since_id时间晚的评论),默认为0。
* @param max_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0。
* @param count 单页返回的记录条数,默认为50
* @param page 返回结果的页码,默认为1。
* @param authorType 作者筛选类型,0:全部、1:我关注的人、2:陌生人 ,默认为0。可为以下几种 :
* <li>{@link #AUTHOR_FILTER_ALL}
* <li>{@link #AUTHOR_FILTER_ATTENTIONS}
* <li>{@link #AUTHOR_FILTER_STRANGER}
* @param listener 异步请求回调接口
*/
public void show(long id, long since_id, long max_id, int count, int page, int authorType, RequestListener listener) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("id", id);
params.put("filter_by_author", authorType);
requestAsync(sAPIList.get(READ_API_SHOW), params, HTTPMETHOD_GET, listener);
}
/**
* 获取当前登录用户所发出的评论列表。
*
* @param since_id 若指定此参数,则返回ID比since_id大的评论(即比since_id时间晚的评论),默认为0。
* @param max_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0。
* @param count 单页返回的记录条数,默认为50。
* @param page 返回结果的页码,默认为1。
* @param sourceType 来源筛选类型,0:全部、1:来自微博的评论、2:来自微群的评论,默认为0。
* <li>{@link #SRC_FILTER_ALL}
* <li>{@link #SRC_FILTER_WEIBO}
* <li>{@link #SRC_FILTER_WEIQUN}
* @param listener 异步请求回调接口
*/
public void byME(long since_id, long max_id, int count, int page, int sourceType, RequestListener listener) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_source", sourceType);
requestAsync(sAPIList.get(READ_API_BY_ME), params, HTTPMETHOD_GET, listener);
}
/**
* 获取当前登录用户所接收到的评论列表。
*
* @param since_id 若指定此参数,则返回ID比since_id大的评论(即比since_id时间晚的评论),默认为0。
* @param max_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0。
* @param count 单页返回的记录条数,默认为50。
* @param page 返回结果的页码,默认为1。
* @param authorType 作者筛选类型,0:全部、1:我关注的人、2:陌生人 ,默认为0。可为以下几种 :
* <li>{@link #AUTHOR_FILTER_ALL}
* <li>{@link #AUTHOR_FILTER_ATTENTIONS}
* <li>{@link #AUTHOR_FILTER_STRANGER}
* @param sourceType 来源筛选类型,0:全部、1:来自微博的评论、2:来自微群的评论,默认为0。
* <li>{@link #SRC_FILTER_ALL}
* <li>{@link #SRC_FILTER_WEIBO}
* <li>{@link #SRC_FILTER_WEIQUN}
* @param listener 异步请求回调接口
*/
public void toME(long since_id, long max_id, int count, int page, int authorType, int sourceType,
RequestListener listener) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_author", authorType);
params.put("filter_by_source", sourceType);
requestAsync(sAPIList.get(READ_API_TO_ME), params, HTTPMETHOD_GET, listener);
}
/**
* 获取当前登录用户的最新评论包括接收到的与发出的。
*
* @param since_id 若指定此参数,则返回ID比since_id大的评论(即比since_id时间晚的评论),默认为0。
* @param max_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0。
* @param count 单页返回的记录条数,默认为50。
* @param page 返回结果的页码,默认为1。
* @param trim_user 返回值中user字段开关,false:返回完整user字段、true:user字段仅返回user_id,默认为false。
* @param listener 异步请求回调接口
*/
public void timeline(long since_id, long max_id, int count, int page, boolean trim_user, RequestListener listener) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("trim_user", trim_user ? 1 : 0);
requestAsync(sAPIList.get(READ_API_TIMELINE), params, HTTPMETHOD_GET, listener);
}
/**
* 获取最新的提到当前登录用户的评论,即@我的评论 若指定此参数,则返回ID比since_id大的评论(即比since_id时间晚的评论),默认为0
*
* @param since_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0
* @param max_id 若指定此参数,则返回ID小于或等于max_id的评论,默认为0
* @param count 单页返回的记录条数,默认为50
* @param page 返回结果的页码,默认为1
* @param authorType 作者筛选类型,0:全部,1:我关注的人, 2:陌生人,默认为0
* <li> {@link #AUTHOR_FILTER_ALL}
* <li> {@link #AUTHOR_FILTER_ATTENTIONS}
* <li> {@link #AUTHOR_FILTER_STRANGER}
*@param sourceType 来源筛选类型,0:全部,1:来自微博的评论,2:来自微群的评论,默认为0
* <li> {@link #SRC_FILTER_ALL}
* <li> {@link #SRC_FILTER_WEIBO}
* <li> {@link #SRC_FILTER_WEIQUN}
* @param listener 异步请求回调接口
*/
public void mentions(long since_id, long max_id, int count, int page, int authorType, int sourceType,
RequestListener listener) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_author", authorType);
params.put("filter_by_source", sourceType);
requestAsync(sAPIList.get(READ_API_MENTIONS), params, HTTPMETHOD_GET, listener);
}
/**
* 根据评论ID批量返回评论信息。
*
* @param cids 需要查询的批量评论ID数组,最大50
* @param listener 异步请求回调接口
*/
public void showBatch(long[] cids, RequestListener listener) {
WeiboParameters params = buildShowOrDestoryBatchParams(cids);
requestAsync(sAPIList.get(READ_API_SHOW_BATCH), params, HTTPMETHOD_GET, listener);
}
/**
* 对一条微博进行评论。
*
* @param comment 评论内容,内容不超过140个汉字。
* @param id 需要评论的微博ID。
* @param comment_ori 当评论转发微博时,是否评论给原微博
* @param listener 异步请求回调接口
*/
public void create(String comment, long id, boolean comment_ori, RequestListener listener) {
WeiboParameters params = buildCreateParams(comment, id, comment_ori);
requestAsync(sAPIList.get(WRITE_API_CREATE), params, HTTPMETHOD_POST, listener);
}
/**
* 删除一条评论。
*
* @param cid 要删除的评论ID,只能删除登录用户自己发布的评论。
* @param listener 异步请求回调接口
*/
public void destroy(long cid, RequestListener listener) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("cid", cid);
requestAsync(sAPIList.get(WRITE_API_DESTROY), params, HTTPMETHOD_POST, listener);
}
/**
* 根据评论ID批量删除评论。
*
* @param ids 需要删除的评论ID数组,最多20个。
* @param listener 异步请求回调接口
*/
public void destroyBatch(long[] ids, RequestListener listener) {
WeiboParameters params = buildShowOrDestoryBatchParams(ids);
requestAsync(sAPIList.get(WRITE_API_SDESTROY_BATCH), params, HTTPMETHOD_POST, listener);
}
/**
* 回复一条评论。
*
* @param cid 需要回复的评论ID
* @param id 需要评论的微博ID
* @param comment 回复评论内容,内容不超过140个汉字
* @param without_mention 回复中是否自动加入“回复@用户名”,true:是、false:否,默认为false
* @param comment_ori 当评论转发微博时,是否评论给原微博,false:否、true:是,默认为false
* @param listener 异步请求回调接口
*/
public void reply(long cid, long id, String comment, boolean without_mention, boolean comment_ori,
RequestListener listener) {
WeiboParameters params = buildReplyParams(cid, id, comment, without_mention, comment_ori);
requestAsync(sAPIList.get(WRITE_API_REPLY), params, HTTPMETHOD_POST, listener);
}
/**
* -----------------------------------------------------------------------
* 请注意:以下方法匀均同步方法。如果开发者有自己的异步请求机制,请使用该函数。
* -----------------------------------------------------------------------
*/
/**
* @see #show(long, long, long, int, int, int, RequestListener)
*/
public String showSync(long id, long since_id, long max_id, int count, int page, int authorType) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("id", id);
params.put("filter_by_author", authorType);
return requestSync(sAPIList.get(READ_API_SHOW), params, HTTPMETHOD_GET);
}
/**
* @see #byME(long, long, int, int, int, RequestListener)
*/
public String byMESync(long since_id, long max_id, int count, int page, int sourceType) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_source", sourceType);
return requestSync(sAPIList.get(READ_API_BY_ME), params, HTTPMETHOD_GET);
}
/**
* @see #toME(long, long, int, int, int, int, RequestListener)
*/
public String toMESync(long since_id, long max_id, int count, int page, int authorType, int sourceType) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_author", authorType);
params.put("filter_by_source", sourceType);
return requestSync(sAPIList.get(READ_API_TO_ME), params, HTTPMETHOD_GET);
}
/**
* @see #timeline(long, long, int, int, boolean, RequestListener)
*/
public String timelineSync(long since_id, long max_id, int count, int page, boolean trim_user) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("trim_user", trim_user ? 1 : 0);
return requestSync(sAPIList.get(READ_API_TIMELINE), params, HTTPMETHOD_GET);
}
/**
* @see #mentions(long, long, int, int, int, int, RequestListener)
*/
public String mentionsSync(long since_id, long max_id, int count, int page, int authorType, int sourceType) {
WeiboParameters params = buildTimeLineParamsBase(since_id, max_id, count, page);
params.put("filter_by_author", authorType);
params.put("filter_by_source", sourceType);
return requestSync(sAPIList.get(READ_API_MENTIONS), params, HTTPMETHOD_GET);
}
/**
* @see #showBatch(long[], RequestListener)
*/
public String showBatchSync(long[] cids) {
WeiboParameters params = buildShowOrDestoryBatchParams(cids);
return requestSync(sAPIList.get(READ_API_SHOW_BATCH), params, HTTPMETHOD_GET);
}
/**
* @see #create(String, long, boolean, RequestListener)
*/
public String createSync(String comment, long id, boolean comment_ori) {
WeiboParameters params = buildCreateParams(comment, id, comment_ori);
return requestSync(sAPIList.get(WRITE_API_CREATE), params, HTTPMETHOD_POST);
}
/**
* @see #destroyBatch(long[], RequestListener)
*/
public String destroySync(long cid) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("cid", cid);
return requestSync(sAPIList.get(WRITE_API_DESTROY), params, HTTPMETHOD_POST);
}
/**
* @see #destroyBatchSync(long[])
*/
public String destroyBatchSync(long[] ids) {
WeiboParameters params = buildShowOrDestoryBatchParams(ids);
return requestSync(sAPIList.get(WRITE_API_SDESTROY_BATCH), params, HTTPMETHOD_POST);
}
/**
* @see #reply(long, long, String, boolean, boolean, RequestListener)
*/
public String replySync(long cid, long id, String comment, boolean without_mention, boolean comment_ori) {
WeiboParameters params = buildReplyParams(cid, id, comment, without_mention, comment_ori);
return requestSync(sAPIList.get(WRITE_API_REPLY), params, HTTPMETHOD_POST);
}
/**
* 组装TimeLines的参数
*/
private WeiboParameters buildTimeLineParamsBase(long since_id, long max_id, int count, int page) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("since_id", since_id);
params.put("max_id", max_id);
params.put("count", count);
params.put("page", page);
return params;
}
private WeiboParameters buildShowOrDestoryBatchParams(long[] cids) {
WeiboParameters params = new WeiboParameters(mAppKey);
StringBuilder strb = new StringBuilder();
for (long cid : cids) {
strb.append(cid).append(",");
}
strb.deleteCharAt(strb.length() - 1);
params.put("cids", strb.toString());
return params;
}
private WeiboParameters buildCreateParams(String comment, long id, boolean comment_ori) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("comment", comment);
params.put("id", id);
params.put("comment_ori", comment_ori ? 1: 0);
return params;
}
private WeiboParameters buildReplyParams(long cid, long id, String comment, boolean without_mention,
boolean comment_ori) {
WeiboParameters params = new WeiboParameters(mAppKey);
params.put("cid", cid);
params.put("id", id);
params.put("comment", comment);
params.put("without_mention", without_mention ? 1: 0);
params.put("comment_ori", comment_ori ? 1: 0);
return params;
}
}