package net.dev123.mblog.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 net.dev123.commons.PagableList; import net.dev123.commons.Paging; import net.dev123.commons.ServiceProvider; import net.dev123.commons.http.HttpMethod; import net.dev123.commons.http.HttpRequestHelper; import net.dev123.commons.http.HttpRequestMessage; import net.dev123.commons.http.auth.Authorization; import net.dev123.commons.util.ListUtil; import net.dev123.commons.util.ParseUtil; import net.dev123.commons.util.StringUtil; import net.dev123.entity.StatusUpdate; import net.dev123.exception.ExceptionCode; import net.dev123.exception.LibException; import net.dev123.mblog.Emotions; import net.dev123.mblog.MicroBlog; import net.dev123.mblog.entity.Comment; import net.dev123.mblog.entity.DirectMessage; import net.dev123.mblog.entity.Group; import net.dev123.mblog.entity.RateLimitStatus; import net.dev123.mblog.entity.Relationship; import net.dev123.mblog.entity.ResponseCount; import net.dev123.mblog.entity.Status; import net.dev123.mblog.entity.Trends; import net.dev123.mblog.entity.UnreadCount; import net.dev123.mblog.entity.UnreadType; import net.dev123.mblog.entity.User; import org.apache.http.client.ResponseHandler; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Tencent微博API实现 * * @version * @author 马庆升 * @time 2010-8-31 上午11:38:20 * identifyName = id * displayName = name */ public class Tencent extends MicroBlog { private static final long serialVersionUID = -1486360080128882436L; private static final Logger logger = LoggerFactory.getLogger(Tencent.class.getSimpleName()); 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().getId(); } 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(ExceptionCode.PARAMETER_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(ExceptionCode.PARAMETER_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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()){ 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> getMentions(Paging<Status> paging) throws LibException { if (paging == null){ throw new LibException(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()){ initCursorPaging(paging); } return getStatusList(conf.getMetionsTimelineURL(), paging, null); } /** * {@inheritDoc} * <p><Strong>Tencent不提供此接口</Strong></p> */ @Override @Deprecated public List<Status> getRetweetedByMe(Paging<Status> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public Status showStatus(String id) throws LibException { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("id", id); return getStatus(conf.getShowOfStatusURL(), parameters); } /** * {@inheritDoc} */ public Status updateStatus(StatusUpdate latestStatus) throws LibException { if (latestStatus == null || StringUtil.isEmpty(latestStatus.getStatus())){ throw new LibException(ExceptionCode.PARAMETER_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()); } 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; HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, requestUrl, auth); httpRequestMessage.addParameters(parameters); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String resopnse = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(resopnse); String statusId = ParseUtil.getRawString("id", json); long timestamp = ParseUtil.getLong("time", json); status = new Status(); status.setId(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(ExceptionCode.JSON_PARSE_ERROR, e); } } @Override public Status destroyStatus(String statusId) throws LibException { try { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getDestroyStatusURL(), auth); httpRequestMessage.addParameter("id", statusId); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String resopnse = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(resopnse); String id = ParseUtil.getRawString("id", json); Status deleted = new Status(); deleted.setId(id); deleted.setServiceProvider(ServiceProvider.Tencent); return deleted; } catch (JSONException e) { throw new LibException(ExceptionCode.JSON_PARSE_ERROR, e); } } @Override public Status retweetStatus(String sourceId, String rtStatus, boolean isComment) throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getRetweetStatusURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("reid", sourceId); if (StringUtil.isNotEmpty(rtStatus)) { httpRequestMessage.addParameter("content", Emotions.specializeEmotion(ServiceProvider.Tencent, rtStatus)); } try { Status status = null; String resopnse = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(resopnse); String statusId = ParseUtil.getRawString("id", json); long timestamp = ParseUtil.getLong("time", json); status = new Status(); status.setId(statusId); status.setUser(getUser()); status.setText(rtStatus); status.setCreatedAt(new Date(timestamp * 1000L)); status.setSource(conf.getSource()); Status retweetedStatus = new Status(); retweetedStatus.setId(sourceId); status.setRetweetedStatus(retweetedStatus); status.setServiceProvider(ServiceProvider.Tencent); if (isComment) { createComment(rtStatus, sourceId); } return status; } catch (JSONException e) { throw new LibException(ExceptionCode.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(ExceptionCode.PARAMETER_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(ExceptionCode.PARAMETER_NULL); } Map<String, Object> params = new HashMap<String, Object>(); params.put("name", identifyName); User user = getUser(conf.getShowOfUserURL(), 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(ExceptionCode.PARAMETER_NULL); } if (paging.isCursorPaging()){ initPagePaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getSearchUserURL(), auth); httpRequestMessage.addParameter("keyword", query); //关键字 httpRequestMessage.addParameter("page", paging.getPageIndex()); httpRequestMessage.addParameter("pagesize", paging.getPageSize()); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()){ initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getFriendsURL(), auth); httpRequestMessage.addParameter("name", identifyName); if (paging.getPageIndex() > 0) { httpRequestMessage.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize()); } httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()){ initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getFollowsURL(), auth); httpRequestMessage.addParameter("name", identifyName); if (paging.getPageIndex() > 0) { httpRequestMessage.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize()); } httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()) { initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getInboxTimelineURL(), auth); httpRequestMessage.addParameters(getPagingParamsMap(paging)); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()) { initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getOutboxTimelineURL(), auth); httpRequestMessage.addParameters(getPagingParamsMap(paging)); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getSendDirectMessageURL(), auth); httpRequestMessage.addParameter("name", displayName); httpRequestMessage.addParameter("content", Emotions.specializeEmotion(ServiceProvider.Tencent, text)); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); try { String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.JSON_PARSE_ERROR, e); } catch (LibException e) { if (e.getExceptionCode() == ExceptionCode.MicroBlog.API_PERMISSION_ACCESS_DENIED) { e.setExceptionCode(ExceptionCode.MicroBlog.API_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.getId()); 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 { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getCreateFriendshipURL(), auth); httpRequestMessage.addParameter("name", identifyName); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); User user = new User(); user.setId(identifyName); user.setName(identifyName); user.setServiceProvider(ServiceProvider.Tencent); return user; } @Override public User destroyFriendship(String identifyName) throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getDestroyFriendshipURL(), auth); httpRequestMessage.addParameter("name", identifyName); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); User user = new User(); user.setId(identifyName); user.setName(identifyName); user.setServiceProvider(ServiceProvider.Tencent); return user; } /* * 只能检测当前用户与target之间的关系 */ @Override @Deprecated public Relationship showRelationship(String sourceId, String targetId) throws LibException { /* HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getShowOfFriendshipURL(), auth); httpRequestMessage.addParameter("names", targetId); httpRequestMessage.addParameter("flag", 2); // 0 检测粉丝,1检测偶像,2两种都检测 String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject responseJson = new JSONObject(response); JSONObject relationJson = responseJson.getJSONObject(targetId); Relationship relationship = new Relationship(); relationship.setFollowing(relationJson.getBoolean("isidol")); relationship.setFollowed(relationJson.getBoolean("isfans")); relationship.setBlocking(relationJson.getBoolean("ismyblack")); relationship.setSourceUserId(getUserId()); relationship.setTargetUserId(targetId); */ User user = showUser(targetId); Relationship relationship = new Relationship(); relationship.setFollowing(user.isFollowing()); relationship.setFollowed(user.isFollowedBy()); relationship.setBlocking(user.isBlocking()); relationship.setSourceUserId(getUserId()); relationship.setTargetUserId(targetId); return relationship; } /* Social Graph Methods */ @Override @Deprecated public List<String> getFriendsIDs(Paging<String> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override @Deprecated public List<String> getFriendsIDs(String userId, Paging<String> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override @Deprecated public List<String> getFollowersIDs(Paging<String> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override @Deprecated public List<String> getFollowersIDs(String userId, Paging<String> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @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 { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getUpdateProfileURL(), auth); httpRequestMessage.addParameter("nick", screenname); httpRequestMessage.addParameter("introduction", description); httpRequestMessage.addParameter("sex", 0); httpRequestMessage.addParameter("year", "2010"); httpRequestMessage.addParameter("month", "10"); httpRequestMessage.addParameter("day", "10"); httpRequestMessage.addParameter("countrycode", "1"); httpRequestMessage.addParameter("provincecode", "44"); httpRequestMessage.addParameter("citycode", "3"); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); return verifyCredentials(); } @Override public User updateProfileImage(File image) throws LibException { verifyImageFile(image); HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getUpdateProfileImageURL(), auth); httpRequestMessage.addParameter("pic", image); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); return verifyCredentials(); } /** * 判断文件合法性 * * @param image * 将被上传的图片文件 * @throws LibException */ private void verifyImageFile(File image) throws LibException { if (!image.exists()) { throw new LibException(ExceptionCode.FILE_NOT_FOUND); } if (!image.isFile()) { throw new LibException(ExceptionCode.NOT_A_FILE); } } @Override public List<Status> getFavorites(Paging<Status> paging) throws LibException { if (paging == null) { throw new LibException(ExceptionCode.PARAMETER_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(ExceptionCode.UNSUPPORTED_API); } @Override public Status createFavorite(String statusId) throws LibException { if (StringUtil.isEmpty(statusId)) { throw new LibException(ExceptionCode.PARAMETER_NULL); } try { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getCreateFavoriteURL(), auth); httpRequestMessage.addParameter("id", statusId); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(response); Status status = new Status(); status.setId(ParseUtil.getRawString("id", json)); status.setServiceProvider(ServiceProvider.Tencent); return status; } catch (JSONException e) { throw new LibException(ExceptionCode.JSON_PARSE_ERROR, e); } } @Override public Status destroyFavorite(String statusId) throws LibException { if (StringUtil.isEmpty(statusId)) { throw new LibException(ExceptionCode.PARAMETER_NULL); } try { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getDestroyFavoriteURL(), auth); httpRequestMessage.addParameter("id", statusId); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(response); Status status = new Status(); status.setId(ParseUtil.getRawString("id", json)); status.setServiceProvider(ServiceProvider.Tencent); return status; } catch (JSONException e) { throw new LibException(ExceptionCode.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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()) { initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getSearchStatusURL(), auth); httpRequestMessage.addParameter("page", paging.getPageIndex()); httpRequestMessage.addParameter("pagesize", paging.getPageSize()); httpRequestMessage.addParameter("keyword", keyword); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getCommentStatusURL(), auth); httpRequestMessage.addParameter("reid", statusId); httpRequestMessage.addParameter("content", Emotions.specializeEmotion(ServiceProvider.Tencent, comment)); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); try { String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); JSONObject json = new JSONObject(response); String id = ParseUtil.getRawString("id", json); long timestamp = ParseUtil.getLong("time", json); Status status = new Status(); status.setId(id); status.setUser(getUser()); status.setText(comment); status.setCreatedAt(new Date(timestamp * 1000L)); status.setSource(conf.getSource()); Status retweetedStatus = new Status(); retweetedStatus.setId(statusId); status.setServiceProvider(ServiceProvider.Tencent); return TencentCommentAdaptor.createCommentFromStatus(status); } catch (JSONException e) { throw new LibException(ExceptionCode.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(ExceptionCode.PARAMETER_NULL); } if (paging.isPagePaging()) { initCursorPaging(paging); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getCommentsOfStatusURL(), auth); httpRequestMessage.addParameter("rootid", statusId); httpRequestMessage.addParameter("flag", 1); //获取微博点评列表 httpRequestMessage.addParameters(getPagingParamsMap(paging)); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.UNSUPPORTED_API); } @Override @Deprecated public List<Comment> getCommentsByMe(Paging<Comment> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override @Deprecated public List<Comment> getCommentsTimeline(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.getId()); ResponseCount count = new ResponseCount(); count.setStatusId(updated.getId()); count.setCommentsCount(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(ExceptionCode.UNSUPPORTED_API); } @Override public UnreadCount getUnreadCount() throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getUnreadCountURL(), auth); httpRequestMessage.addParameter("op", 0); //只请求更新数,不清除更新数 httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); return TencentCountAdaptor.createRemindCount(response); } @Override public boolean resetUnreadCount(UnreadType remindType) throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getResetUnreadCountURL(), auth); httpRequestMessage.addParameter("op", 1); // 请求更新数,并对更新数清零 int type = 5; //默认清除首页未读微博计数 switch (remindType) { case METION: type = 6; break; case DIRECT_MESSAGE: type = 7; break; case FOLLOWER: type = 8; case COMMENT: default: break; } httpRequestMessage.addParameter("type", type); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); boolean isSuccess = false; HttpRequestHelper.execute(httpRequestMessage, responseHandler); isSuccess = TencentCountAdaptor.createResetRemindCount("{\"result\":true}"); return isSuccess; } private List<Status> getStatusList(String url, Paging<Status> paging, Map<String, Object> params) throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, url, auth); httpRequestMessage.addParameters(getPagingParamsMap(paging)); httpRequestMessage.addParameters(params); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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 { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, url, auth); httpRequestMessage.addParameters(params); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); return TencentStatusAdaptor.createStatus(response); } private User getUser(String url, Map<String, Object> params) throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, url, auth); httpRequestMessage.addParameters(params); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); return TencentUserAdaptor.createUser(response); } @Override public Trends getCurrentTrends() throws LibException { List<Trends> trendsList = getDailyTrends(); Trends trends = null; if (trendsList.size() > 0) { trends = trendsList.get(0); } return trends; } @Override public List<Trends> getDailyTrends() throws LibException { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getDailyTrendsURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); return TencentTrendsAdapter.createTrends(response); } @Override public List<Trends> getWeeklyTrends() throws LibException { return getDailyTrends(); } 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getCreateBlockURL(), auth); httpRequestMessage.addParameter("name", identifyName); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); User user = new User(); user.setServiceProvider(ServiceProvider.Tencent); user.setName(identifyName); user.setId(identifyName); user.setBlocking(true); return user; } @Override public User destroyBlock(String identifyName) throws LibException { if (StringUtil.isEmpty(identifyName)) { throw new LibException(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.POST, conf.getDestroyBlockURL(), auth); httpRequestMessage.addParameter("name", identifyName); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); HttpRequestHelper.execute(httpRequestMessage, responseHandler); User user = new User(); user.setServiceProvider(ServiceProvider.Tencent); user.setName(identifyName); user.setId(identifyName); user.setBlocking(false); return user; } @Override public boolean existsBlock(String identifyName) throws LibException { if (StringUtil.isEmpty(identifyName)) { throw new LibException(ExceptionCode.PARAMETER_NULL); } User user = showUser(identifyName); return user.isBlocking(); } @Override public List<User> getBlockingUsers(Paging<User> paging) throws LibException { if (paging == null) { throw new LibException(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.GET, conf.getBlockingUsersURL(), auth); httpRequestMessage.addParameter("reqnum", paging.getPageSize()); httpRequestMessage.addParameter("startindex", (paging.getPageIndex() - 1) * paging.getPageSize()); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, responseHandler); List<User> userList = TencentUserAdaptor.createPagableUserList(response); updatePaging(userList, paging); return userList; } @Override public List<String> getBlockingUsersIDs(Paging<String> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public Group createGroup(String groupName, boolean isPublicList, String description) throws LibException { if (StringUtil.isEmpty(groupName)) { throw new LibException(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getCreateGroupURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("name", groupName); if (isPublicList) { httpRequestMessage.addParameter("access", "0"); } else { httpRequestMessage.addParameter("access", "1"); } if (StringUtil.isNotEmpty(description)) { httpRequestMessage.addParameter("description", description); } String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getUpdateGroupURL(), auth); httpRequestMessage.addParameter("name", newGroupName); if (isPublicList) { httpRequestMessage.addParameter("access", "0"); } else { httpRequestMessage.addParameter("access", "1"); } if (StringUtil.isNotEmpty(newDescription)) { httpRequestMessage.addParameter("description", newDescription); } String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getGroupListURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getShowOfGroupURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("listids", groupId); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getDestroyGroupURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("listid", groupId); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.UNSUPPORTED_API); } @Override public List<Group> getGroupMemberships(String listMemberIdentifyName, Paging<Group> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public List<Group> getGroupSubscriptions( String listOwnerIdentifyName, Paging<Group> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public List<Group> getAllGroups(String identifyName) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public List<User> getGroupMembers(String groupId, Paging<User> paging) throws LibException { if (StringUtil.isEmpty(groupId) || paging == null) { throw new LibException(ExceptionCode.PARAMETER_NULL); } if (!paging.isPagePaging()) { initPagePaging(paging); } if (paging.getPageSize() != 15) { paging.setPageSize(15); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getGroupMembersURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("listid", groupId); httpRequestMessage.addParameter("pageflag", paging.getPageIndex()); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getCreateGroupMemberURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("names", userId); httpRequestMessage.addParameter("listid", groupId); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.PARAMETER_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(ExceptionCode.PARAMETER_NULL); } HttpRequestMessage httpRequestMessage = new HttpRequestMessage( HttpMethod.POST, conf.getDestroyGroupMemberURL(), auth); httpRequestMessage.addParameter("format", RESPONSE_FORMAT); httpRequestMessage.addParameter("names", userId); httpRequestMessage.addParameter("listId", groupId); String response = HttpRequestHelper.execute(httpRequestMessage, 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(ExceptionCode.UNSUPPORTED_API); } @Override public List<User> getGroupSubscribers(String listId, Paging<User> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public Group createGroupSubscriber(String listId) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public Group destroyGroupSubscriber(String listId) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public User showGroupSubscriber(String listId, String identifyName) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public List<Status> getDailyHotRetweets(Paging<Status> paging) throws LibException { if (paging == null){ throw new LibException(ExceptionCode.PARAMETER_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(ExceptionCode.UNSUPPORTED_API); } @Override public List<Status> getDailyHotComments(Paging<Status> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } @Override public List<Status> getWeeklyHotComments(Paging<Status> paging) throws LibException { throw new LibException(ExceptionCode.UNSUPPORTED_API); } 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 + '\'' + '}'; } }