package com.cattong.weibo.impl.sohu;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpStatus;
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.StringUtil;
import com.cattong.commons.util.UrlUtil;
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.FeaturePatternUtils;
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;
/**
* Sohu微博API实现
*
* @version
* @author
* 搜狐平台属性声明:
* identifyName = userId
* displayName = screenName
*/
public class Sohu extends Weibo {
private static final long serialVersionUID = -1486360080128882436L;
private static final Logger logger = LoggerFactory.getLogger(Sohu.class);
private transient ResponseHandler<String> responseHandler;
private transient String screenName = null;
private transient String userId = null;
public Sohu(Authorization auth) {
super(auth);
responseHandler = new SohuResponseHandler();
}
public String getScreenName() throws LibException {
if (StringUtil.isEmpty(screenName)) {
verifyCredentials();
}
return screenName;
}
public String getUserId() throws LibException {
if (StringUtil.isEmpty(userId)) {
verifyCredentials();
}
return userId;
}
/* Timeline Methods */
@Override
public List<Status> getPublicTimeline() throws LibException {
HttpRequestWrapper request = null;
request = new HttpRequestWrapper(HttpMethod.GET, conf.getPublicTimelineUrl(), auth);
String response = HttpRequestHelper.execute(request, responseHandler);
List<Status> listStatus = SohuStatusAdaptor.createStatusList(response);
return listStatus;
}
@Override
public List<Status> getHomeTimeline(Paging<Status> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
this.initPagePaging(paging);
}
List<Status> listStatus = getStatusList(conf.getHomeTimelineUrl(), paging, null);
return listStatus;
}
@Override
public List<Status> getFriendsTimeline(Paging<Status> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
this.initPagePaging(paging);
}
List<Status> listStatus = getStatusList(conf.getFriendTimelineUrl(), paging, null);
return listStatus;
}
@Override
public List<Status> getUserTimeline(String identityName, Paging<Status> paging) throws LibException {
if (StringUtil.isEmpty(identityName) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
this.initPagePaging(paging);
}
String url = String.format(conf.getUserTimelineUrl(), identityName);
List<Status> listStatus = getStatusList(url, paging, null);
return listStatus;
}
@Override
public List<Status> getMentionTimeline(Paging<Status> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
this.initPagePaging(paging);
}
List<Status> listStatus = getStatusList(conf.getMentionTimelineUrl(), paging, null);
return listStatus;
}
/**
* <Strong>Sohu不提供此接口</Strong><BR>
* <BR>
*
* {@inheritDoc}
*/
@Override
@Deprecated
public List<Status> getRetweetedByMe(Paging<Status> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
/* StatusMethod */
@Override
public Status showStatus(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getShowStatusUrl(), statusId);
Status status = getStatus(url, null);
return status;
}
public Status updateStatus(StatusUpdate latestStatus) throws LibException {
if (latestStatus == null || StringUtil.isEmpty(latestStatus.getStatus())) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
boolean isRetweet = false;
String url = conf.getUpdateStatusUrl();
Map<String, Object> parameters = new HashMap<String, Object>();
String specializeText = SohuEmotions.specializeEmotion(ServiceProvider.Sohu, latestStatus.getStatus());
parameters.put("status", specializeText);
if (latestStatus.getInReplyToStatusId() != null) {
parameters.put("in_reply_to_status_id", latestStatus.getInReplyToStatusId());
isRetweet = true;
}
if (latestStatus.getImage() != null && !isRetweet) {
//图片上传只有在发原创微博的时候可用,转发时不允许上传图片
checkFileValidity(latestStatus.getImage());
parameters.put("pic", latestStatus.getImage());
parameters.put("status", UrlUtil.encode(latestStatus.getStatus()));
url = conf.getUploadStatusUrl();
}
if (latestStatus.getImage() != null && isRetweet) {
logger.debug("Image file {} is ignored in retweet", latestStatus.getImage().getName());
}
Status status = updateStatus(url, parameters);
return status;
}
@Override
public Status destroyStatus(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getDestroyStatusUrl(), statusId);
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.DELETE, url, auth);
String response = HttpRequestHelper.execute(request, responseHandler);
Status status = SohuStatusAdaptor.createStatus(response);
return status;
}
@Override
public Status retweetStatus(String statusId, String status, boolean isComment) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("id", statusId);
if (StringUtil.isEmpty(status)) {
status = "";
}
String specializeText = SohuEmotions.specializeEmotion(ServiceProvider.Sohu, status);
params.put("status", specializeText);
String url = String.format(conf.getRetweetStatusUrl(), statusId);
Status newStatus = updateStatus(url, params);
if (isComment) {
//TODO:调用评论接口;
}
return newStatus;
}
@Override
@Deprecated
public List<Status> getRetweetsOfStatus(String statusId, Paging<Status> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Status> searchStatuses(String keyword, Paging<Status> paging) throws LibException {
if (StringUtil.isEmpty(keyword) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
if (!paging.isPagePaging()) {
initCursorPaging(paging);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("q", keyword);
if (paging.getPageSize() > 0) {
params.put("rpp", paging.getPageSize());
}
if (paging.getSince() != null) {
params.put("since_id", paging.getSince());
}
if (paging.getPageIndex() > 0) {
params.put("page", paging.getPageIndex());
}
HttpRequestWrapper request = new HttpRequestWrapper(
HttpMethod.GET, conf.getSearchStatusUrl(),
auth, params);
String response = HttpRequestHelper.execute(request, responseHandler);
List<Status> listStatus = null;
listStatus = SohuStatusAdaptor.createStatusSearchResultList(response);
updatePaging(listStatus, paging);
return listStatus;
}
/* User Methods */
@Override
public User showUser(String identifyName) throws LibException {
if (StringUtil.isEmpty(identifyName)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getShowUserUrl(), identifyName);
User user = getUser(url, null);
//获取最新的一条微博
Paging<Status> paging = new Paging<Status>();
paging.setPageSize(1);
paging.moveToNext();
List<Status> statusList = getUserTimeline(identifyName, paging);
if (ListUtil.isNotEmpty(statusList)) {
user.setStatus(statusList.get(0));
}
return user;
}
@Override
public User showUserByDisplayName(String displayName) throws LibException {
if (StringUtil.isEmpty(displayName)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getShowUserUrl(), displayName);
User user = getUser(url, null);
//获取最新的一条微博
Paging<Status> paging = new Paging<Status>();
paging.setPageSize(1);
paging.moveToNext();
List<Status> statusList = getUserTimeline(user.getUserId(), paging);
if (ListUtil.isNotEmpty(statusList)) {
user.setStatus(statusList.get(0));
}
return user;
}
@Override
public List<User> searchUsers(String keyword, Paging<User> paging) throws LibException {
if (StringUtil.isEmpty(keyword) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("q", keyword);
List<User> listUser = getUserList(conf.getSearchUserUrl(), paging, params);
return listUser;
}
@Override
public List<User> getFriends(Paging<User> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
String url = String.format(conf.getFriendsUrl(), "");
List<User> listUser = getUserList(url, paging, null);
return listUser;
}
@Override
public List<User> getUserFriends(String identifyName, Paging<User> paging) throws LibException {
if (StringUtil.isEmpty(identifyName) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
String url = String.format(conf.getFriendsUrl(), "/" + identifyName);
List<User> listUser = getUserList(url, paging, null);
return listUser;
}
@Override
public List<User> getFollowers(Paging<User> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
String url = String.format(conf.getFollowsUrl(), "");
List<User> listUser = getUserList(url, paging, null);
return listUser;
}
@Override
public List<User> getUserFollowers(String identifyName, Paging<User> paging) throws LibException {
if (StringUtil.isEmpty(identifyName) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
String url = String.format(conf.getFollowsUrl(), "/" + identifyName);
List<User> listUser = getUserList(url, paging, null);
return listUser;
}
/* Direct Message Methods */
@Override
public List<DirectMessage> getInboxDirectMessages(Paging<DirectMessage> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
return getDirectMessageList(conf.getInboxTimelineUrl(), paging, null);
}
@Override
public List<DirectMessage> getOutboxDirectMessages(Paging<DirectMessage> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
return getDirectMessageList(conf.getOutboxTimelineUrl(), paging, null);
}
@Override
public DirectMessage sendDirectMessage(String displayName, String text) throws LibException {
if (StringUtil.isEmpty(displayName) || StringUtil.isEmpty(text)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
//用了统一display的接口,做一次转换
User user = showUser(displayName);
displayName = user.getUserId();
Map<String, Object> params = new HashMap<String, Object>();
params.put("user", displayName);
String specializeText = SohuEmotions.specializeEmotion(ServiceProvider.Sohu, text);
params.put("text", specializeText);
DirectMessage message = updateDirectMessage(conf.getSendDirectMessageUrl(), params);
return message;
}
@Override
public DirectMessage destroyInboxDirectMessage(String messageId) throws LibException {
if (StringUtil.isEmpty(messageId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
return destroyDirectMessage(messageId, "in");
}
@Override
public DirectMessage destroyOutboxDirectMessage(String messageId) throws LibException {
if (StringUtil.isEmpty(messageId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
return destroyDirectMessage(messageId, "out");
}
/* Friendship methods */
@Override
public User createFriendship(String identityName) throws LibException {
if (StringUtil.isEmpty(identityName)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getCreateFriendshipUrl(), identityName);
User user = updateUser(url, null);
return user;
}
@Override
public User destroyFriendship(String identityName) throws LibException {
if (StringUtil.isEmpty(identityName)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getDestroyFriendshipUrl(), identityName);
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.DELETE, url, auth);
String response = HttpRequestHelper.execute(request, responseHandler);
return SohuUserAdaptor.createUser(response);
}
@Override
public Relationship showRelationship(String sourceIdentifyName, String targetIdentifyName) throws LibException {
if (StringUtil.isEmpty(sourceIdentifyName)
|| StringUtil.isEmpty(targetIdentifyName)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper httpRequestWrapper = new HttpRequestWrapper(
HttpMethod.GET, conf.getShowFriendshipUrl(), auth);
httpRequestWrapper.addParameter("source_id", sourceIdentifyName);
httpRequestWrapper.addParameter("target_id", targetIdentifyName);
String response = HttpRequestHelper.execute(httpRequestWrapper, responseHandler);
Relationship relationship = SohuRelationshipAdaptor.createRelationship(response);
if (StringUtil.isEquals(sourceIdentifyName, userId) && relationship != null) {
relationship.setSourceBlockingTarget(existsBlock(targetIdentifyName));
}
return relationship;
}
private boolean existsBlock(String identifyName) throws LibException {
//throw new LibException(LibResultCode.API_UNSUPPORTED);
return false;
}
/* Account Methods */
@Override
public User verifyCredentials() throws LibException {
User user = getUser(conf.getVerifyCredentialsUrl(), null);
if (user != null) {
this.screenName = user.getScreenName();
this.userId = user.getUserId();
}
return user;
}
@Override
public RateLimitStatus getRateLimitStatus() throws LibException {
HttpRequestWrapper request = null;
request = new HttpRequestWrapper(HttpMethod.GET, conf.getRateLimitStatusUrl(), auth);
String response = HttpRequestHelper.execute(request, responseHandler);
return SohuRateLimitStatusAdaptor.createRateLimitStatus(response);
}
@Override
public User updateProfileImage(File image) throws LibException {
if (image == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
checkFileValidity(image);
Map<String, Object> params = new HashMap<String, Object>();
params.put("image", image);
User user = updateUser(conf.getUpdateProfileImageUrl(), params);
return user;
}
@Override
public User updateProfile(String screenName, String email, String url, String location, String description)
throws LibException {
if (StringUtil.isEmpty(screenName)
&& StringUtil.isEmpty(email)
&& StringUtil.isEmpty(description)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
Map<String, Object> params = new HashMap<String, Object>();
if (StringUtil.isNotEmpty(screenName)) {
params.put("nick_name", screenName);
}
if (StringUtil.isNotEmpty(email)) {
params.put("email", email);
}
if (StringUtil.isNotEmpty(description)) {
params.put("description", description);
}
User user = updateUser(conf.getUpdateProfileUrl(), params);
return user;
}
/* Favorite Methods */
@Override
public Status createFavorite(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getCreateFavoriteUrl(), statusId);
Status status = updateStatus(url, null);
return status;
}
@Override
public Status destroyFavorite(String statusId) throws LibException {
if (StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getDestroyFavoriteUrl(), statusId);
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.DELETE, url, auth);
String response = HttpRequestHelper.execute(request, responseHandler);
Status status = SohuStatusAdaptor.createStatus(response);
return status;
}
@Override
public List<Status> getFavorites(Paging<Status> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("page", paging.getPageIndex());
List<Status> listStatus = getStatusList(conf.getFavoritesTimelineUrl(), paging, params);
return listStatus;
}
@Deprecated
@Override
public List<Status> getFavorites(String identifyName, Paging<Status> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
/* Comment Methods */
@Override
public Comment createComment(String comment, String statusId) throws LibException {
if (StringUtil.isEmpty(comment) || StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", statusId);
String specializeText = SohuEmotions.specializeEmotion(ServiceProvider.Sohu, comment);
params.put("comment", specializeText);
Comment newComment = updateComment(conf.getCommentStatusUrl(), params);
return newComment;
}
/*
* 搜狐api不存直接回复评论的接口,
* 官网回复评论的方式,在评论内容前加@用户
* 这个由外部接口,在comment文本内进行确保
*
*/
@Override
public Comment createComment(String comment, String statusId, String commentId) throws LibException {
if (StringUtil.isEmpty(comment)
|| StringUtil.isEmpty(statusId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
Pattern p = FeaturePatternUtils.getMentionPattern(ServiceProvider.Sohu);
Matcher m = p.matcher(comment);
if (!m.find()) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", statusId);
String specializeText = SohuEmotions.specializeEmotion(ServiceProvider.Sohu, comment);
params.put("comment", specializeText);
Comment newComment = updateComment(conf.getCommentStatusUrl(), params);
return newComment;
}
@Override
public Comment destroyComment(String commentId) throws LibException {
if (StringUtil.isEmpty(commentId)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
String url = String.format(conf.getDestroyCommentUrl(), commentId);
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.DELETE, url, auth);
String response = HttpRequestHelper.execute(request, responseHandler);
Comment comment = SohuCommentAdaptor.createComment(response);
return comment;
}
@Override
public List<Comment> getCommentsOfStatus(String statusId, Paging<Comment> paging) throws LibException {
if (StringUtil.isEmpty(statusId) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
String url = String.format(conf.getCommentTimelineOfStatusUrl(), statusId);
Map<String, Object> params = new HashMap<String, Object>();
params.put("count", paging.getPageSize());
params.put("page", paging.getPageIndex());
List<Comment> listComment = getCommentList(url, paging, params);
return listComment;
}
@Deprecated
@Override
public List<Comment> getCommentTimeline(Paging<Comment> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Deprecated
@Override
public List<Comment> getCommentsByMe(Paging<Comment> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Comment> getCommentsToMe(Paging<Comment> paging) throws LibException {
if (paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
if (!paging.isPagePaging()) {
initPagePaging(paging);
}
Comment since = paging.getSince();
Comment max = paging.getMax();
String url = conf.getCommentsToMeUrl();
Map<String, Object> params = new HashMap<String, Object>();
params.put("count", paging.getPageSize());
params.put("page", paging.getPageIndex());
if (since != null) {
params.put("since_id", since.getCommentId());
}
if (max != null) {
params.put("max_id", max.getCommentId());
}
List<Comment> listComment = getCommentList(url, paging, params);
return listComment;
}
/* Count Methods */
@Override
public ResponseCount getResponseCount(Status status) throws LibException {
if (status == null || StringUtil.isEmpty(status.getStatusId())) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
List<Status> listStatus = new ArrayList<Status>();
listStatus.add(status);
List<ResponseCount> listCount = getResponseCountList(listStatus);
if (listCount != null && listCount.size() > 0) {
return listCount.get(0);
}
return null;
}
@Override
public List<ResponseCount> getResponseCountList(List<Status> listStatus) throws LibException {
if (listStatus == null || listStatus.size() == 0) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
List<ResponseCount> listCount = null;
Map<String, Object> params = new HashMap<String, Object>();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < listStatus.size(); i++) {
if (i == 0) {
sb.append(listStatus.get(i).getStatusId());
} else {
sb.append("," + listStatus.get(i).getStatusId());
}
}
params.put("ids", sb.toString());
HttpRequestWrapper request = new HttpRequestWrapper(
HttpMethod.GET, conf.getResponseCountOfStatusUrl(),
auth, params);
String response = HttpRequestHelper.execute(request, responseHandler);
listCount = SohuCountAdaptor.createCountList(response);
if (listCount != null && listCount.size() > 0) {
for (ResponseCount count : listCount) {
for (Status status : listStatus) {
if (status.getStatusId() != null
&& status.getStatusId().equals(count.getStatusId())) {
status.setRetweetCount(count.getRetweetCount());
status.setCommentCount(count.getCommentCount());
break;
}
}
}
}
return listCount;
}
@Override
@Deprecated
public UnreadCount getUnreadCount() throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
@Deprecated
public boolean resetUnreadCount(UnreadType type) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
private List<Status> getStatusList(String url, Paging<Status> paging, Map<String, Object> params)
throws LibException {
if (StringUtil.isEmpty(url) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
Status max = paging.getMax();
Status since = paging.getSince();
List<Status> listStatus = null;
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
if (max != null) {
request.addParameter("max_id", max.getStatusId());
}
if (since != null) {
request.addParameter("since_id", since.getStatusId());
}
request.addParameter("count", paging.getPageSize());
String response = HttpRequestHelper.execute(request, responseHandler);
if (paging.isCursorPaging()) {
try {
listStatus = SohuStatusAdaptor.createPagableStatusList(response);
if (listStatus != null && listStatus.size() <= paging.getPageSize() / 2) {
((PagableList<?>) listStatus).setNextCursor(Paging.CURSOR_END);
}
} catch (Exception e) {
listStatus = SohuStatusAdaptor.createStatusList(response);
}
} else {
listStatus = SohuStatusAdaptor.createStatusList(response);
}
listStatus = ListUtil.truncate(listStatus, max, since);
updatePaging(listStatus, paging);
if (!paging.isLastPage() && listStatus.size() > 0) {
setNextPageMax(paging, listStatus.get(listStatus.size() - 1));
}
return listStatus;
}
private Status getStatus(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
Status status = SohuStatusAdaptor.createStatus(response);
return status;
}
private Status updateStatus(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.POST, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
Status status = SohuStatusAdaptor.createStatus(response);
return status;
}
private User getUser(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
User user = SohuUserAdaptor.createUser(response);
return user;
}
private List<User> getUserList(String url, Paging<User> paging, Map<String, Object> params)
throws LibException {
if (StringUtil.isEmpty(url) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_NULL);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
request.addParameter("page", paging.getPageIndex());
int count = paging.getPageSize() > 20 ? 20 : paging.getPageSize();
request.addParameter("count", count); //cout <= 20;
String response = HttpRequestHelper.execute(request, responseHandler);
List<User> listUser = null;
if (paging.isCursorPaging()) {
listUser = SohuUserAdaptor.createPagableUserList(response);
} else {
listUser = SohuUserAdaptor.createUserList(response);
}
if (ListUtil.isNotEmpty(listUser)) {
for (User user : listUser) {
Status status = user.getStatus();
Status retweet = null;
if (status != null) {
retweet = status.getRetweetedStatus();
}
if (retweet != null
&& StringUtil.isNotEmpty(retweet.getStatusId())
&& StringUtil.isEmpty(retweet.getText())) {
retweet = showStatus(retweet.getStatusId());
status.setRetweetedStatus(retweet);
}
}
}
updatePaging(listUser, paging);
return listUser;
}
private User updateUser(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.POST, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
User user = SohuUserAdaptor.createUser(response);
return user;
}
private List<DirectMessage> getDirectMessageList(String url, Paging<DirectMessage> paging,
Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
DirectMessage max = paging.getMax();
DirectMessage since = paging.getSince();
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
if (since != null) {
request.addParameter("since_id", since.getId());
}
request.addParameter("page", paging.getPageIndex());
request.addParameter("count", paging.getPageSize());
//由于私信接口不支持max,取更多数据,再根据max截取
if (max != null) {
request.addParameter("count", 60);
}
String response = HttpRequestHelper.execute(request, responseHandler);
List<DirectMessage> listMessage = new ArrayList<DirectMessage>();
listMessage.addAll(SohuDirectMessageAdaptor.createDirectMessageList(response));
if (max != null && !listMessage.contains(max)) {
listMessage.clear();
if (paging.moveToNext()) {
request.addParameter("page", paging.getPageIndex());
response = HttpRequestHelper.execute(request, responseHandler);
listMessage.addAll(SohuDirectMessageAdaptor.createDirectMessageList(response));
}
}
ListUtil.truncate(listMessage, max, since);
updatePaging(listMessage, paging);
return listMessage;
}
private DirectMessage updateDirectMessage(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.POST, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
DirectMessage message = SohuDirectMessageAdaptor.createDirectMessage(response);
return message;
}
private DirectMessage destroyDirectMessage(String messageId, String type) throws LibException {
if (StringUtil.isEmpty(messageId) ||
StringUtil.isEmpty(type) ||
(!type.equals("in") && !type.equals("out"))
) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
DirectMessage message = null;
try {
Map<String, Object> params = new HashMap<String, Object>();
params.put("type", type);
String url = String.format(conf.getDestroyDirectMessageUrl(), messageId);
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.DELETE, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
JSONObject json = new JSONObject(response);
// 删除成功的响应:{"code":200,"error":"Delete direct-message successfully.","request":"/direct_messages/destroy/5600.json"}
if (json.getInt("code") == HttpStatus.SC_OK) {
message = new DirectMessage();
message.setId(messageId);
message.setServiceProvider(ServiceProvider.Sohu);
}
} catch (JSONException e) {
throw new LibException(LibResultCode.JSON_PARSE_ERROR);
}
return message;
}
private List<Comment> getCommentList(String url, Paging<Comment> paging, Map<String, Object> params)
throws LibException {
if (StringUtil.isEmpty(url) || paging == null) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.GET, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
List<Comment> listComment = SohuCommentAdaptor.createCommentList(response);
updatePaging(listComment, paging);
return listComment;
}
private Comment updateComment(String url, Map<String, Object> params) throws LibException {
if (StringUtil.isEmpty(url)) {
throw new LibException(LibResultCode.E_PARAM_ERROR);
}
HttpRequestWrapper request = new HttpRequestWrapper(HttpMethod.POST, url, auth);
request.addParameters(params);
String response = HttpRequestHelper.execute(request, responseHandler);
Comment comment = SohuCommentAdaptor.createComment(response);
return comment;
}
/* Block methods */
@Deprecated
@Override
public User createBlock(String identifyName) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Deprecated
@Override
public User destroyBlock(String identifyName) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Deprecated
@Override
public List<User> getBlockingUsers(Paging<User> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group createGroup(String listName, boolean isPublicList,
String description) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group updateGroup(String listId, String newListName,
boolean isPublicList, String newDescription) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public List<Group> getGroups(String listOwnerIdentifyName,
Paging<Group> paging) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group showGroup(String listId) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group destroyGroup(String listId) throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@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 listId, Paging<User> paging)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group createGroupMember(String listId, String identifyName)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group createGroupMembers(String listId, String[] identifyNames)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@Override
public Group destroyGroupMember(String listId, String identifyName)
throws LibException {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@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 {
throw new LibException(LibResultCode.API_UNSUPPORTED);
}
@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);
}
@Override
public String toString() {
return "Sohu{" + "auth='" + auth + '\'' + '}';
}
}