package com.cattong.weibo.impl.tencent;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.client.ResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cattong.commons.LibException;
import com.cattong.commons.LibResultCode;
import com.cattong.commons.PagableList;
import com.cattong.commons.Paging;
import com.cattong.commons.ServiceProvider;
import com.cattong.commons.http.HttpMethod;
import com.cattong.commons.http.HttpRequestHelper;
import com.cattong.commons.http.HttpRequestWrapper;
import com.cattong.commons.http.auth.Authorization;
import com.cattong.commons.util.ListUtil;
import com.cattong.commons.util.ParseUtil;
import com.cattong.commons.util.StringUtil;
import com.cattong.entity.Comment;
import com.cattong.entity.Relationship;
import com.cattong.entity.Status;
import com.cattong.entity.StatusUpdate;
import com.cattong.entity.User;
import com.cattong.weibo.Emotions;
import com.cattong.weibo.Weibo;
import com.cattong.weibo.entity.DirectMessage;
import com.cattong.weibo.entity.Group;
import com.cattong.weibo.entity.RateLimitStatus;
import com.cattong.weibo.entity.ResponseCount;
import com.cattong.weibo.entity.UnreadCount;
import com.cattong.weibo.entity.UnreadType;
/**
* Tencent微博API实现
*
* @version
* @author
* @time
* identifyName = userId
* displayName = name
*/
public class Tencent extends Weibo {
private static final long serialVersionUID = -1486360080128882436L;
private static final Logger logger = LoggerFactory.getLogger(Tencent.class);
private static final String RESPONSE_FORMAT = "json";
private transient ResponseHandler<String> responseHandler;
private transient User user = null;
public Tencent(Authorization auth) {
super(auth);
responseHandler = new TencentResponseHandler();
}
/**
* 返回认证用户的昵称<br>
*
* @return 认证用户昵称
* @throws LibException
* @throws IllegalStateException
*/
public String getScreenName() throws LibException, IllegalStateException {
return getUser().getScreenName();
}
/**
* 返回认证用户的用户ID。<br>
*
* @return 认证用户的用户ID
* @throws LibException
* @throws IllegalStateException
*/
public String getUserId() throws LibException, IllegalStateException {
return getUser().getUserId();
}
private User getUser() throws LibException, IllegalStateException{
if (null == user) {
user = verifyCredentials();
}
return user;
}
/* Status Methods */
@Override
public List<Status> getPublicTimeline() throws LibException {
return getStatusList(conf.getPublicTimelineUrl(), null, null);
}
@Override
public List<Status> getHomeTimeline(Paging<Status> paging) throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()){
initCursorPaging(paging);
}
return getStatusList(conf.getFriendTimelineUrl(), paging, null);
}
@Override
public List<Status> getFriendsTimeline(Paging<Status> paging) throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()){
initCursorPaging(paging);
}
return getStatusList(conf.getFriendTimelineUrl(), paging, null);
}
/**
* @param identityName
* 用户唯一标识,本接口只支持使用用户UserId
* @param paging
* 分页控制参数,不能为空
*/
@Override
public List<Status> getUserTimeline(String identityName, Paging<Status> paging) throws LibException {
if (paging == null || StringUtil.isEmpty(identityName)){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isCursorPaging()) {
initCursorPaging(paging);
}
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("name", identityName); //userId
return getStatusList(conf.getUserTimelineUrl(), paging, parameters);
}
@Override
public List<Status> getMentionTimeline(Paging<Status> paging) throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isCursorPaging()){
initCursorPaging(paging);
}
return getStatusList(conf.getMentionTimelineUrl(), paging, null);
}
/**
* {@inheritDoc}
* <p><Strong>Tencent不提供此接口</Strong></p>
*/
@Override
@Deprecated
public List<Status> getRetweetedByMe(Paging<Status> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Status showStatus(String id) throws LibException {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", id);
return getStatus(conf.getShowStatusUrl(), parameters);
}
/**
* {@inheritDoc}
*/
public Status updateStatus(StatusUpdate latestStatus) throws LibException {
if (latestStatus == null || StringUtil.isEmpty(latestStatus.getStatus())){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
boolean isRetweet = false;
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("content", Emotions.specializeEmotion(
ServiceProvider.Tencent, latestStatus.getStatus()));
if (latestStatus.getInReplyToStatusId()!= null){
parameters.put("reid", latestStatus.getInReplyToStatusId());
isRetweet = true;
}
if (latestStatus.getLocation() != null) {
parameters.put("wei", latestStatus.getLocation().getLatitude());
parameters.put("jing", latestStatus.getLocation().getLongitude());
}
//0同步到QQ空间, 1不同步
parameters.put("syncflag", 0);
boolean isUpload = false;
if (latestStatus.getImage() != null){
if (!isRetweet) {
//图片上传只有在发原创微博的时候可用,转发时不允许上传图片
verifyImageFile(latestStatus.getImage());
parameters.put("pic", latestStatus.getImage());
isUpload = true;
} else {
logger.debug("Image file {} is ignored in retweet", latestStatus.getImage().getName());
}
}
String requestUrl = conf.getUpdateStatusUrl();
if (isUpload){
requestUrl = conf.getUploadStatusUrl();
}
try {
Status status = null;
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, requestUrl, auth);
httpRequestWrapper.addParameters(parameters);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String resopnse = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(resopnse);
String statusId = ParseUtil.getRawString("id", json);
long timestamp = ParseUtil.getLong("time", json);
status = new Status();
status.setStatusId(statusId);
status.setUser(getUser());
status.setText(latestStatus.getStatus());
status.setCreatedAt(new Date(timestamp * 1000L));
status.setSource(conf.getSource());
status.setServiceProvider(ServiceProvider.Tencent);
return status;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
public Status destroyStatus(String statusId) throws LibException {
try {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getDestroyStatusUrl(), auth);
httpRequestWrapper.addParameter("id", statusId);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String resopnse = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(resopnse);
String id = ParseUtil.getRawString("id", json);
Status deleted = new Status();
deleted.setStatusId(id);
deleted.setServiceProvider(ServiceProvider.Tencent);
return deleted;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
public Status retweetStatus(String sourceId, String rtStatus, boolean isComment) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getRetweetStatusUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("reid", sourceId);
if (StringUtil.isNotEmpty(rtStatus)) {
httpRequestWrapper.addParameter("content",
Emotions.specializeEmotion(ServiceProvider.Tencent, rtStatus));
}
try {
Status status = null;
String resopnse = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(resopnse);
String statusId = ParseUtil.getRawString("id", json);
long timestamp = ParseUtil.getLong("time", json);
status = new Status();
status.setStatusId(statusId);
status.setUser(getUser());
status.setText(rtStatus);
status.setCreatedAt(new Date(timestamp * 1000L));
status.setSource(conf.getSource());
Status retweetedStatus = new Status();
retweetedStatus.setStatusId(sourceId);
status.setRetweetedStatus(retweetedStatus);
status.setServiceProvider(ServiceProvider.Tencent);
if (isComment) {
createComment(rtStatus, sourceId);
}
return status;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
public List<Status> getRetweetsOfStatus(String statusId, Paging<Status> paging) throws LibException {
if (StringUtil.isEmpty(statusId) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
Map<String, Object> parameters = getPagingParamsMap(paging);
parameters.put("rootid", statusId);
parameters.put("flag", 0); //获取微博转发列表
parameters.put("format", RESPONSE_FORMAT);
List<Status> statusList = getStatusList(conf.getRetweetsOfStatusUrl(), paging, parameters);
return statusList;
}
/* User Methods */
@Override
public User showUser(String identifyName) throws LibException {
if (StringUtil.isEmpty(identifyName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("name", identifyName);
User user = getUser(conf.getShowUserUrl(), params);
//获取最新的一条微博
Paging<Status> paging = new Paging<Status>();
paging.setPageSize(1);
paging.moveToNext();
List<Status> listStatus = getUserTimeline(identifyName, paging);
if (ListUtil.isNotEmpty(listStatus)) {
user.setStatus(listStatus.get(0));
}
return user;
}
@Override
public User showUserByDisplayName(String displayName) throws LibException {
User user = showUser(displayName);
return user;
}
@Override
public List<User> searchUsers(String query, Paging<User> paging) throws LibException {
if (StringUtil.isEmpty(query) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isCursorPaging()){
initPagePaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getSearchUserUrl(), auth);
httpRequestWrapper.addParameter("keyword", query); //关键字
httpRequestWrapper.addParameter("page", paging.getPageIndex());
httpRequestWrapper.addParameter("pagesize", paging.getPageSize());
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<User> userList = TencentUserAdaptor.createUserList(response);
updatePaging(userList, paging);
return userList;
}
@Override
public List<User> getFriends(Paging<User> paging) throws LibException {
return getUserFriends(this.getUserId(), paging);
}
@Override
public List<User> getUserFriends(String identifyName, Paging<User> paging) throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()){
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getFriendsUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
if (paging.getPageIndex() > 0) {
httpRequestWrapper.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize());
}
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<User> userList = TencentUserAdaptor.createPagableUserList(response);
updatePaging(userList, paging);
return userList;
}
@Override
public List<User> getFollowers(Paging<User> paging) throws LibException {
return getUserFollowers(this.getUserId(), paging);
}
@Override
public List<User> getUserFollowers(String identifyName, Paging<User> paging) throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isCursorPaging()){
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getFollowsUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
if (paging.getPageIndex() > 0) {
httpRequestWrapper.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize());
}
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<User> userList = TencentUserAdaptor.createPagableUserList(response);
updatePaging(userList, paging);
return userList;
}
/* Direct Message Methods */
@Override
public List<DirectMessage> getInboxDirectMessages(Paging<DirectMessage> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getInboxTimelineUrl(), auth);
httpRequestWrapper.addParameters(getPagingParamsMap(paging));
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<DirectMessage> directMessageList = TencentDirectMessageAdaptor.createPagableDirectMessageList(response, 1);
clearDirectMessage(directMessageList, paging);
for (DirectMessage dmsg : directMessageList) {
dmsg.setRecipient(getUser());
dmsg.setRecipientId(getUserId());
dmsg.setRecipientScreenName(getScreenName());
dmsg.setServiceProvider(ServiceProvider.Tencent);
}
updatePaging(directMessageList, paging);
if (!paging.isLastPage() && directMessageList.size() > 0) {
setNextPageMax(paging, directMessageList.get(directMessageList.size() - 1));
}
return directMessageList;
}
@Override
public List<DirectMessage> getOutboxDirectMessages(Paging<DirectMessage> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getOutboxTimelineUrl(), auth);
httpRequestWrapper.addParameters(getPagingParamsMap(paging));
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<DirectMessage> directMessageList = TencentDirectMessageAdaptor.createPagableDirectMessageList(response, 0);
clearDirectMessage(directMessageList, paging);
updatePaging(directMessageList, paging);
if (!paging.isLastPage() && directMessageList.size() > 0) {
setNextPageMax(paging, directMessageList.get(directMessageList.size() - 1));
}
return directMessageList;
}
private void clearDirectMessage(List<DirectMessage> dmsgList, Paging<DirectMessage> paging){
if (paging == null || dmsgList == null) {
return;
}
DirectMessage since = paging.getSince();
long sinceTime = (since == null) ? 0L : getUnixTimestamp(since.getCreatedAt());
Iterator<DirectMessage> iterator = dmsgList.iterator();
DirectMessage tmpMsg = null;
boolean isExist = false;
while (iterator.hasNext()) {
tmpMsg = iterator.next();
long timestamp = tmpMsg.getCreatedAt().getTime() / 1000L;
isExist = (isExist || (sinceTime > 0L && sinceTime >= timestamp));
if (isExist) {
iterator.remove();
}
}
}
@Override
public DirectMessage sendDirectMessage(String displayName, String text) throws LibException {
if (StringUtil.isEmpty(displayName) || StringUtil.isEmpty(text)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getSendDirectMessageUrl(), auth);
httpRequestWrapper.addParameter("name", displayName);
httpRequestWrapper.addParameter("content", Emotions.specializeEmotion(ServiceProvider.Tencent, text));
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
try {
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(response);
String id = ParseUtil.getRawString("id", json);
long time = ParseUtil.getLong("timestamp", json);
DirectMessage msg = new DirectMessage();
msg.setSenderId(getUserId());
msg.setRecipientId(displayName);
msg.setId(id);
msg.setCreatedAt(new Date(time * 1000L));
msg.setText(text);
msg.setServiceProvider(ServiceProvider.Tencent);
return msg;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
} catch (LibException e) {
if (e.getErrorCode() == LibResultCode.API_MB_PERMISSION_ACCESS_DENIED) {
e.setErrorCode(LibResultCode.API_MB_MESSAGE_RECEIVER_NOT_FOLLOWER);
}
throw e;
}
}
private DirectMessage destroyDirectMessage(String directMessageid) throws LibException {
assert (directMessageid != null);
Status status = destroyStatus(directMessageid);
DirectMessage msg = new DirectMessage();
msg.setId(status.getStatusId());
msg.setServiceProvider(ServiceProvider.Tencent);
return msg;
}
@Override
public DirectMessage destroyInboxDirectMessage(String directMessageid) throws LibException {
return destroyDirectMessage(directMessageid);
}
@Override
public DirectMessage destroyOutboxDirectMessage(String directMessageid) throws LibException {
return destroyDirectMessage(directMessageid);
}
@Override
public User createFriendship(String identifyName) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getCreateFriendshipUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
User user = new User();
user.setUserId(identifyName);
user.setName(identifyName);
user.setServiceProvider(ServiceProvider.Tencent);
return user;
}
@Override
public User destroyFriendship(String identifyName) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getDestroyFriendshipUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
User user = new User();
user.setUserId(identifyName);
user.setName(identifyName);
user.setServiceProvider(ServiceProvider.Tencent);
return user;
}
/*
* 只能检测当前用户与target之间的关系
*/
@Override
public Relationship showRelationship(String sourceIdentifyName, String targetIdentifyName) throws LibException {
if (StringUtil.isEmpty(targetIdentifyName) || StringUtil.isEmpty(targetIdentifyName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.GET, conf.getShowFriendshipUrl(), auth);
httpRequestWrapper.addParameter("names", targetIdentifyName);
// 0 检测粉丝,1检测偶像,2两种都检测
httpRequestWrapper.addParameter("flag", 2);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Relationship relationship = TencentRelationshipAdaptor.createRelationship(response, targetIdentifyName);
if (relationship != null) {
relationship.setSourceUserId(sourceIdentifyName);
relationship.setTargetUserId(targetIdentifyName);
} else {
User user = showUser(targetIdentifyName);
relationship = user.getRelationship();
if (relationship != null) {
relationship.setSourceUserId(user.getUserId());
relationship.setTargetUserId(targetIdentifyName);
}
}
if (user != null
&& StringUtil.isEquals(sourceIdentifyName, user.getUserId())
&& relationship != null) {
relationship.setSourceBlockingTarget(existsBlock(targetIdentifyName));
}
return relationship;
}
private boolean existsBlock(String identifyName) throws LibException {
if (StringUtil.isEmpty(identifyName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
//User user = showUser(identifyName);
return false;
}
/* Account Methods */
@Override
public User verifyCredentials() throws LibException {
User user = getUser(conf.getVerifyCredentialsUrl(), null);
if (null != user) {
this.user = user;
}
return user;
}
@Override
public RateLimitStatus getRateLimitStatus() throws LibException {
return null;
}
@Override
public User updateProfile(String screenname, String email, String url, String location, String description)
throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getUpdateProfileUrl(), auth);
httpRequestWrapper.addParameter("nick", screenname);
httpRequestWrapper.addParameter("introduction", description);
httpRequestWrapper.addParameter("sex", 0);
httpRequestWrapper.addParameter("year", "2010");
httpRequestWrapper.addParameter("month", "10");
httpRequestWrapper.addParameter("day", "10");
httpRequestWrapper.addParameter("countrycode", "1");
httpRequestWrapper.addParameter("provincecode", "44");
httpRequestWrapper.addParameter("citycode", "3");
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
return verifyCredentials();
}
@Override
public User updateProfileImage(File image) throws LibException {
verifyImageFile(image);
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getUpdateProfileImageUrl(), auth);
httpRequestWrapper.addParameter("pic", image);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
return verifyCredentials();
}
/**
* 判断文件合法性
*
* @param image
* 将被上传的图片文件
* @throws LibException
*/
private void verifyImageFile(File image) throws LibException {
if (!image.exists()) {
throw new LibException(LibResultCode.FILE_NOT_FOUND);
}
if (!image.isFile()) {
throw new LibException(LibResultCode.FILE_TYPE_INVALID);
}
}
@Override
public List<Status> getFavorites(Paging<Status> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
return getStatusList(conf.getFavoritesTimelineUrl(), paging, null);
}
@Override
@Deprecated
public List<Status> getFavorites(String identifyName, Paging<Status> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Status createFavorite(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
try {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getCreateFavoriteUrl(), auth);
httpRequestWrapper.addParameter("id", statusId);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(response);
Status status = new Status();
status.setStatusId(ParseUtil.getRawString("id", json));
status.setServiceProvider(ServiceProvider.Tencent);
return status;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
public Status destroyFavorite(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
try {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getDestroyFavoriteUrl(), auth);
httpRequestWrapper.addParameter("id", statusId);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(response);
Status status = new Status();
status.setStatusId(ParseUtil.getRawString("id", json));
status.setServiceProvider(ServiceProvider.Tencent);
return status;
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
public List<Status> searchStatuses(String keyword, Paging<Status> paging) throws LibException {
if (paging == null || StringUtil.isEmpty(keyword)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getSearchStatusUrl(), auth);
httpRequestWrapper.addParameter("page", paging.getPageIndex());
httpRequestWrapper.addParameter("pagesize", paging.getPageSize());
httpRequestWrapper.addParameter("keyword", keyword);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<Status> statusList = TencentStatusAdaptor.createStatusSearchResult(response);
updatePaging(statusList, paging);
return statusList;
}
@Override
public Comment createComment(String comment, String statusId) throws LibException {
if (StringUtil.isEmpty(statusId) || StringUtil.isEmpty(comment)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getCommentStatusUrl(), auth);
httpRequestWrapper.addParameter("reid", statusId);
httpRequestWrapper.addParameter("content", Emotions.specializeEmotion(ServiceProvider.Tencent, comment));
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
try {
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
JSONObject json = new JSONObject(response);
String id = ParseUtil.getRawString("id", json);
long timestamp = ParseUtil.getLong("time", json);
Status status = new Status();
status.setStatusId(id);
status.setUser(getUser());
status.setText(comment);
status.setCreatedAt(new Date(timestamp * 1000L));
status.setSource(conf.getSource());
Status retweetedStatus = new Status();
retweetedStatus.setStatusId(statusId);
status.setServiceProvider(ServiceProvider.Tencent);
return TencentCommentAdaptor.createCommentFromStatus(status);
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR, e);
}
}
@Override
@Deprecated
public Comment createComment(String comment, String statusId, String commentId) throws LibException {
return createComment(comment, statusId);
}
@Override
public Comment destroyComment(String commentId) throws LibException {
Status status = destroyStatus(commentId);
return TencentCommentAdaptor.createCommentFromStatus(status);
}
@Override
public List<Comment> getCommentsOfStatus(String statusId, Paging<Comment> paging) throws LibException {
if (paging == null || StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()) {
initCursorPaging(paging);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getCommentTimelineOfStatusUrl(), auth);
httpRequestWrapper.addParameter("rootid", statusId);
httpRequestWrapper.addParameter("flag", 1); //获取微博点评列表
httpRequestWrapper.addParameters(getPagingParamsMap(paging));
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
ArrayList<Status> statusList = TencentStatusAdaptor.createPagableStatusList(response);
updatePaging(statusList, paging);
ArrayList<Comment> commentsList = new ArrayList<Comment>(statusList.size());
for (int i = 0; i < statusList.size(); i++) {
if (statusList.get(i).getRetweetedStatus() != null) {
commentsList.add(TencentCommentAdaptor.createCommentFromStatus(statusList.get(i)));
}
}
if (!paging.isLastPage() && statusList.size() > 0) {
setNextPageMax(paging, commentsList.get(commentsList.size() - 1));
}
return commentsList;
}
@Override
@Deprecated
public List<Comment> getCommentsToMe(Paging<Comment> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
@Deprecated
public List<Comment> getCommentsByMe(Paging<Comment> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
@Deprecated
public List<Comment> getCommentTimeline(Paging<Comment> paging) throws LibException {
return new ArrayList<Comment>();
}
@Override
public ResponseCount getResponseCount(Status status) throws LibException {
if (status == null) {
return null;
}
Status updated = showStatus(status.getStatusId());
ResponseCount count = new ResponseCount();
count.setStatusId(updated.getStatusId());
count.setCommentCount(updated.getCommentCount());
count.setRetweetCount(updated.getRetweetCount());
count.setServiceProvider(ServiceProvider.Tencent);
return count;
}
@Override
@Deprecated
public List<ResponseCount> getResponseCountList(List<Status> listStatus) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public UnreadCount getUnreadCount() throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getUnreadCountUrl(), auth);
httpRequestWrapper.addParameter("op", 0); //只请求更新数,不清除更新数
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
return TencentCountAdaptor.createRemindCount(response);
}
@Override
public boolean resetUnreadCount(UnreadType remindType) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getResetUnreadCountUrl(), auth);
httpRequestWrapper.addParameter("op", 1); // 请求更新数,并对更新数清零
int type = 5; //默认清除首页未读微博计数
switch (remindType) {
case MENTION:
type = 6;
break;
case DIRECT_MESSAGE:
type = 7;
break;
case FOLLOWER:
type = 8;
case COMMENT:
default:
break;
}
httpRequestWrapper.addParameter("type", type);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
boolean isSuccess = false;
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
isSuccess = TencentCountAdaptor.createResetRemindCount("{\"result\":true}");
return isSuccess;
}
private List<Status> getStatusList(String url, Paging<Status> paging, Map<String, Object> params)
throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, url, auth);
httpRequestWrapper.addParameters(getPagingParamsMap(paging));
httpRequestWrapper.addParameters(params);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
List<Status> statusList = TencentStatusAdaptor.createPagableStatusList(response);
clearStatus(statusList, paging);
updatePaging(statusList, paging);
if (paging!= null && !paging.isLastPage() && statusList.size() > 0) {
setNextPageMax(paging, statusList.get(statusList.size() - 1));
}
return statusList;
}
private void clearStatus(List<Status> statusList, Paging<Status> paging){
if (paging == null || statusList == null) {
return;
}
Status since = paging.getSince();
long sinceTime = (since == null) ? 0L : getUnixTimestamp(since.getCreatedAt());
Iterator<Status> iterator = statusList.iterator();
Status tmpStatus = null;
boolean isExist = false;
while (iterator.hasNext()) {
tmpStatus = iterator.next();
long timestamp = getUnixTimestamp(tmpStatus.getCreatedAt());
isExist = (isExist || (sinceTime > 0L && sinceTime >= timestamp));
if (isExist) {
iterator.remove();
}
}
}
private Status getStatus(String url, Map<String, Object> params) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, url, auth);
httpRequestWrapper.addParameters(params);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
return TencentStatusAdaptor.createStatus(response);
}
private User getUser(String url, Map<String, Object> params) throws LibException {
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, url, auth);
httpRequestWrapper.addParameters(params);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
return TencentUserAdaptor.createUser(response);
}
private Map<String, Object> getPagingParamsMap(Paging<?> paging) {
if (paging == null) {
return null;
}
Map<String, Object> pagingParameters = new HashMap<String, Object>();
pagingParameters.put("reqnum", paging.getPageSize());
if (paging.getMax() != null) {
pagingParameters.put("pagetime", extractBoundaryValue(paging.getMax()));
pagingParameters.put("pageflag", 1); //下翻
} else if (paging.getSince() != null) {
pagingParameters.put("pagetime", extractBoundaryValue(paging.getSince()));
pagingParameters.put("pageflag", 0); //取第一页
} else {
pagingParameters.put("pageflag", 0);
pagingParameters.put("pagetime", 0);
}
return pagingParameters;
}
private <T> String extractBoundaryValue(T entity) {
String boundaryValue = null;
if (entity instanceof Status) {
Status status = (Status) entity;
boundaryValue = String.valueOf(getUnixTimestamp(status.getCreatedAt()));
} else if (entity instanceof Comment) {
Comment comment = (Comment) entity;
boundaryValue = String.valueOf(getUnixTimestamp(comment.getCreatedAt()));
} else if (entity instanceof DirectMessage) {
DirectMessage msg = (DirectMessage) entity;
boundaryValue = String.valueOf(getUnixTimestamp(msg.getCreatedAt()));
} else if (entity instanceof String) {
boundaryValue = String.valueOf(entity);
}
return boundaryValue;
}
private static long getUnixTimestamp(Date date){
if (date == null) {
return 0;
}
return date.getTime() / 1000L;
}
@Override
public User createBlock(String identifyName) throws LibException {
if (StringUtil.isEmpty(identifyName)){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getCreateBlockUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
User user = new User();
user.setServiceProvider(ServiceProvider.Tencent);
user.setName(identifyName);
user.setUserId(identifyName);
return user;
}
@Override
public User destroyBlock(String identifyName) throws LibException {
if (StringUtil.isEmpty(identifyName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.POST, conf.getDestroyBlockUrl(), auth);
httpRequestWrapper.addParameter("name", identifyName);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
User user = new User();
user.setServiceProvider(ServiceProvider.Tencent);
user.setName(identifyName);
user.setUserId(identifyName);
return user;
}
@Override
public List<User> getBlockingUsers(Paging<User> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(HttpMethod.GET, conf.getBlockingUsersUrl(), auth);
httpRequestWrapper.addParameter("reqnum", paging.getPageSize());
httpRequestWrapper.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize());
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
List<User> userList = TencentUserAdaptor.createPagableUserList(response);
updatePaging(userList, paging);
return userList;
}
@Override
public Group createGroup(String groupName, boolean isPublicList,
String description) throws LibException {
if (StringUtil.isEmpty(groupName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getCreateGroupUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("name", groupName);
if (isPublicList) {
httpRequestWrapper.addParameter("access", "0");
} else {
httpRequestWrapper.addParameter("access", "1");
}
if (StringUtil.isNotEmpty(description)) {
httpRequestWrapper.addParameter("description", description);
}
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Group group = TencentGroupAdaptor.createGroup(response);
group = showGroup(group.getId());
return group;
}
@Override
public Group updateGroup(String groupId, String newGroupName,
boolean isPublicList, String newDescription) throws LibException {
if (StringUtil.isEmpty(groupId) || StringUtil.isEmpty(newGroupName)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getUpdateGroupUrl(), auth);
httpRequestWrapper.addParameter("name", newGroupName);
if (isPublicList) {
httpRequestWrapper.addParameter("access", "0");
} else {
httpRequestWrapper.addParameter("access", "1");
}
if (StringUtil.isNotEmpty(newDescription)) {
httpRequestWrapper.addParameter("description", newDescription);
}
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Group group = TencentGroupAdaptor.createGroup(response);
return group;
}
@Override
public List<Group> getGroups(String listOwnerIdentifyName,
Paging<Group> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getGroupListUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
List<Group> groupList = TencentGroupAdaptor.createPagableGroupList(response);
paging.setLastPage(true);//只能取一页
return groupList;
}
@Override
public Group showGroup(String groupId) throws LibException {
if (StringUtil.isEmpty(groupId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getShowGroupUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("listids", groupId);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
List<Group> groupList = TencentGroupAdaptor.createPagableGroupList(response);
Group group = null;
if (ListUtil.isNotEmpty(groupList)) {
group = groupList.get(0);
}
return group;
}
@Override
public Group destroyGroup(String groupId) throws LibException {
if (StringUtil.isEmpty(groupId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getDestroyGroupUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("listid", groupId);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Group group = null;
if (StringUtil.isNotEmpty(response)) {
group = new Group();
group.setId(groupId);
}
return group;
}
@Override
public List<Status> getGroupStatuses(String listId, Paging<Status> paging)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Group> getGroupMemberships(String listMemberIdentifyName,
Paging<Group> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Group> getAllGroups(String identifyName)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<User> getGroupMembers(String groupId, Paging<User> paging)
throws LibException {
if (StringUtil.isEmpty(groupId) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
if (paging.getPageSize() != 15) {
paging.setPageSize(15);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getGroupMembersUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("listid", groupId);
httpRequestWrapper.addParameter("pageflag", paging.getPageIndex());
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
List<User> userList = TencentGroupAdaptor.createGroupMemberList(response);
//updatePaging(userList, paging);
if (ListUtil.isEmpty(userList)
|| userList.size() <= paging.getPageIndex() - 1) {
paging.setLastPage(true);
}
return userList;
}
@Override
public Group createGroupMember(String groupId, String userId)
throws LibException {
if (StringUtil.isEmpty(groupId) || StringUtil.isEmpty(userId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getCreateGroupMemberUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("names", userId);
httpRequestWrapper.addParameter("listid", groupId);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Group group = null;
if (StringUtil.isNotEmpty(response)) {
group = new Group();
group.setId(groupId);
}
return group;
}
@Override
public Group createGroupMembers(String groupId, String[] userIds)
throws LibException {
if (StringUtil.isEmpty(groupId) || userIds == null ||userIds.length == 0) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
StringBuffer idSb = new StringBuffer();
for (String userId : userIds) {
idSb.append(userId).append(",");
}
idSb.deleteCharAt(idSb.length() - 1);
Group group = createGroupMember(groupId, idSb.toString());
return group;
}
@Override
public Group destroyGroupMember(String groupId, String userId)
throws LibException {
if (StringUtil.isEmpty(groupId) || StringUtil.isEmpty(userId)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.POST, conf.getDestroyGroupMemberUrl(), auth);
httpRequestWrapper.addParameter("format", RESPONSE_FORMAT);
httpRequestWrapper.addParameter("names", userId);
httpRequestWrapper.addParameter("listId", groupId);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Group group = null;
if (StringUtil.isNotEmpty(response)) {
group = new Group();
group.setId(groupId);
}
return group;
}
@Override
public User showGroupMember(String listId, String identifyName)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Status> getDailyHotRetweets(Paging<Status> paging)
throws LibException {
if (paging == null){
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (paging.isPagePaging()){
initCursorPaging(paging);
}
return getStatusList(conf.getDailyHotRetweetsUrl(), paging, null);
}
@Override
public List<Status> getWeeklyHotRetweets(Paging<Status> paging)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Status> getDailyHotComments(Paging<Status> paging)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Status> getWeeklyHotComments(Paging<Status> paging)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
protected void updatePaging(List<?> list, Paging<?> paging) {
if (list == null || paging == null) {
return;
}
if (paging.isCursorPaging() && list instanceof PagableList<?>) {
long nextCursor = Paging.CURSOR_START;
if (list.size() <= paging.getPageSize() / 2) {
nextCursor = Paging.CURSOR_END;
} else {
nextCursor = ((PagableList<?>) list).getNextCursor();
}
setNextPageCursor(paging, nextCursor);
if (nextCursor == Paging.CURSOR_END) {
paging.setLastPage(true);
}
} else {
if (list.size() <= paging.getPageSize() / 2) {
paging.setLastPage(true);
}
}
}
@Override
public String toString() {
return "Tencent{" + "auth='" + auth + '\'' + '}';
}
}