package com.sina.microblog { import com.adobe.crypto.HMAC; import com.adobe.crypto.SHA1; import com.dynamicflash.util.Base64; import com.sina.microblog.data.MicroBlogComment; import com.sina.microblog.data.MicroBlogCount; import com.sina.microblog.data.MicroBlogDirectMessage; import com.sina.microblog.data.MicroBlogProfileUpdateParams; import com.sina.microblog.data.MicroBlogRateLimit; import com.sina.microblog.data.MicroBlogStatus; import com.sina.microblog.data.MicroBlogUser; import com.sina.microblog.data.MicroBlogUsersRelationship; import com.sina.microblog.events.MicroBlogErrorEvent; import com.sina.microblog.events.MicroBlogEvent; import com.sina.microblog.utils.GUID; import com.sina.microblog.utils.StringEncoders; import com.ut.nm_test_internal; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestHeader; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.net.getClassByAlias; import flash.net.navigateToURL; import flash.system.ApplicationDomain; import flash.system.Capabilities; import flash.utils.ByteArray; import flash.utils.Dictionary; import flash.utils.Endian; import flash.utils.getDefinitionByName; use namespace nm_test_internal; /** * 当OAuth过程发生错误时触发该事件. * * <p>当consumerKey和consumerSecret不为空时,使用OAuth方式进行认证</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="oauthCertifcateError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载公共微博消息成功时触发该事件. * * <p>调用loadPublicTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadPublicTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载公共微博消息失败时触发该事件. * * <p>调用loadPublicTimeLine失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadPublicTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载用户所有关注的用户最新的n条微博消息成功时触发该事件. * * <p>调用loadFriendsTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载用户所有关注的用户最新的n条微博消息失败时触发该事件. * * <p>调用loadFriendsTimeLine失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载指定用户的微博消息成功时触发该事件. * * <p>调用loadUserTimeLine成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadUserTimeLineResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载指定用户的微博消息失败时触发该事件. * * <p>调用loadUserTimeLine失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadUserTimeLineError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载提及博主的微博消息成功时触发该事件. * * <p>调用loadMensions成功时,事件的<code>result</code>属性为一个<code>MicroBlogStatus</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadMensionsResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载指定用户的微博消息失败时触发该事件. * * <p>调用loadMensions失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadMensionsError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载对博主所发微博消息的评论成功时触发该事件. * * <p>调用loadCommentsTimeline成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadCommentsTimelineResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载指定用户的微博消息失败时触发该事件. * * <p>调用loadMensions失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadCommentsTimelineError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载博主所发表评论成功时触发该事件. * * <p>调用loadMyComments成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadMyCommentsResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载博主所发表评论失败时触发该事件. * * <p>调用loadMyComments失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadMyCommentsError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载对微博消息的评论成功时触发该事件. * * <p>调用loadComments成功时,事件的<code>result</code>属性为一个<code>MicroBlogComment</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadCommentsResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载对微博消息的评论失败时触发该事件. * * <p>调用loadComments失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadCommentsError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载微博消息相关统计数据成功时触发该事件. * * <p>调用loadStatusCounts成功时,事件的<code>result</code>属性为一个<code>MicroBlogCount</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadStatusCountsResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载微博消息相关统计数据失败时触发该事件. * * <p>调用loadStatusCounts失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadStatusCountsError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当发布微博消息成功时触发该事件. * * <p>调用updateStatus成功时,事件的<code>result</code>属性为刚发布的<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当发布微博消息失败时触发该事件. * * <p>调用updateStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当删除微博消息成功时触发该事件. * * <p>调用deleteStatus成功时,事件的<code>result</code>属性为被删除的<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当删除微博消息失败时触发该事件. * * <p>调用deleteStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载某个微博消息成功时触发该事件. * * <p>调用loadStatusInfo成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadStatusInfoResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载某个微博消息失败时触发该事件. * * <p>调用loadStatusInfo失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadStatusInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当删除某个微博消息评论成功时触发该事件. * * <p>调用deleteComment成功时,事件的<code>result</code>属性为<code>MicroBlogComment</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteCommentResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当删除某个微博消息评论失败时触发该事件. * * <p>调用deleteComment失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteCommentError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当评论某个微博消息成功时触发该事件. * * <p>调用commentStatus成功时,事件的<code>result</code>属性为<code>MicroBlogComment</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="commentStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当评论某个微博消息失败时触发该事件. * * <p>调用commentStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="commentStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当转发某个微博消息成功时触发该事件. * * <p>调用repostStatus成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="repostStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当转发某个微博消息失败时触发该事件. * * <p>调用repostStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="repostStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当回复某个微博评论成功时触发该事件. * * <p>调用replyStatus成功时,事件的<code>result</code>属性为<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="replyStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当回复某个微博评论失败时触发该事件. * * <p>调用replyStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="replyStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载接收到的私信列表成功时触发该事件. * * <p>调用loadDirectMessagesReceived成功时,事件的<code>result</code>属性为<code>MicroBlogDirectMessage</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadDirectMessagesReceivedResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载接收到的私信列表失败时触发该事件. * * <p>调用loadDirectMessagesReceived失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadDirectMessagesReceivedError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载发出的私信列表成功时触发该事件. * * <p>调用loadDirectMessagesSent成功时,事件的<code>result</code>属性为<code>MicroBlogDirectMessage</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadDicrectMessagesSentResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载发出的私信列表失败时触发该事件. * * <p>调用loadDirectMessagesSent失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadDicrectMessagesSentError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当删除私信成功时触发该事件. * * <p>调用deleteDirectMessage成功时,事件的<code>result</code>属性为被删除的<code>MicroBlogDirectMessage</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteDirectMessageResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当删除私信失败时触发该事件. * * <p>调用deleteDirectMessage失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="deleteDirectMessageError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当发送私信成功时触发该事件. * * <p>调用sendDirectMessage成功时,事件的<code>result</code>属性<code>MicroBlogDirectMessage</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="sendDirectMessageResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当发送私信失败时触发该事件. * * <p>调用deleteDirectMessage失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="sendDirectMessageSentError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载指定用户信息成功时触发该事件. * * <p>调用loadUserInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadUserInfoResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载指定用户信息失败时触发该事件. * * <p>调用loadUserInfo失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadUserInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载用户关注的博主列表成功时触发该事件. * * <p>调用loadFriendsInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsInfoResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载用户关注的博主列表失败时触发该事件. * * <p>调用loadFriendsInfo失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载关注用户的博主列表成功时触发该事件. * * <p>调用loadFollowersInfo成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFollowersInfoResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载关注用户的博主列表失败时触发该事件. * * <p>调用loadFollowersInfo失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFollowersInfoError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当关注某博主成功时触发该事件. * * <p>调用follow成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="followResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当关注某博主失败时触发该事件. * * <p>调用follow失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="followError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当取消关注某博主成功时触发该事件. * * <p>调用cancelFollowing成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="cancelFollowingResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当取消关注某博主失败时触发该事件. * * <p>调用cancelFollowing失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="cancelFollowingError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当查询两个微博用户关系成功返回时触发该事件. * * <p>调用checkIsFollowing成功时,事件的<code>result</code>属性<code>MicroBlogRelationship</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="checkIsFollowingResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当查询两个微博用户关系失败时触发该事件. * * <p>调用checkIsFollowing失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="checkIsFollowingError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载博主关注的用户id列表成功时触发该事件. * * <p>调用loadFriendsIDList成功时,事件的<code>result</code>属性<code>uint</code> * 数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsIDListResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载博主关注的用户id列表失败时触发该事件. * * <p>调用loadFriendsIDList失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFriendsIDListError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加关注载博主的用户id列表成功时触发该事件. * * <p>调用loadFollowersIDList成功时,事件的<code>result</code>属性<code>uint</code> * 数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFollowersIDListResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载关注博主的用户id列表失败时触发该事件. * * <p>调用loadFollowersIDList失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFollowersIDListError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当验证用户信息成功和登陆成功时触发该事件. * * <p>调用verifyCrendentials成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * <p>注意:当使用Basic方式验证的时候调用login成功时也会触发该事件</p> * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="verifyCredentialsResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当验证用户信息失败时触发该事件. * * <p>调用verifyCrendentials失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="verifyCredentialsError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当获取调用速率限制信息成功时触发该事件. * * <p>调用getRateLimitStatus成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="getRateLimitStatusResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当获取调用速率限制信息失败时触发该事件. * * <p>调用getRateLimitStatus失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="getRateLimitStatusError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当用户成功注销时触发该事件. * * <p>调用logout成功时,事件的<code>result</code>属性<code>MicroBlogRateLimit</code> * 数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="logoutResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当用户注销失败时触发该事件. * * <p>调用logout失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="logoutError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当更新用户信息成功时触发该事件. * * <p>调用updateProfile成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateProfileResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当更新用户信息失败时触发该事件. * * <p>调用updateProfile失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateProfileError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当更新用户头像成功时触发该事件. * * <p>调用updateProfileImage成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateProfileImageResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当更新用户头像失败时触发该事件. * * <p>调用updateProfileImage失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="updateProfileImageError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当加载用户收藏列表成功时触发该事件. * * <p>调用loadFavoriteList成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code> * 对象数组.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFavoriteListResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当加载用户收藏列表失败时触发该事件. * * <p>调用loadFavoriteList失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadFavoriteListError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当收藏微博消息成功时触发该事件. * * <p>调用addToFavorites成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="addToFavoritesResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当收藏微博消息失败时触发该事件. * * <p>调用addToFavorites失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="addToFavoritesError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当将微博消息移出收藏列表成功时触发该事件. * * <p>调用removeFromFavorites成功时,事件的<code>result</code>属性<code>MicroBlogStatus</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="removeFromFavoritesResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当将微博消息移出收藏列表失败时触发该事件. * * <p>调用addToFavorites失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="removeFromFavoritesError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当允许/不允许某用户通知成功时触发该事件. * * <p>调用enableNotification成功时,事件的<code>result</code>属性<code>MicroBlogUser</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="enableNotificationResult", type="com.sina.microblog.events.MicroBlogEvent")] /** * 当允许/不允许某用户通知失败时触发该事件. * * <p>调用enableNotification失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="enableNotificationError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当请求省份,城市与id对应列表成功时触发该事件. * * <p>调用loadProvinceCityIDList成功时,事件的<code>result</code>属性<code>XML</code> * 对象.</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadProvinceCityIdListResult", type="flash.events.MicroBlogEvent")] /** * 当请求省份,城市与id对应列表失败时触发该事件. * * <p>调用loadProvinceCityIDList失败时,事件的<code>message</code>为失败原因描述</p> * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="loadProvinceCityIdListError", type="com.sina.microblog.events.MicroBlogErrorEvent")] /** * 当请求未被验证,服务器调用产生安全错误时触发该事件. * * @see flash.events.SecurityErrorEvent * * @langversion 3.0 * @productversion MicroBlog-API */ [Event(name="securityError", type="flash.events.SecurityErrorEvent")] /** * MicroBlog是新浪微博AS3 API的核心类. * * <p>其主要功能包括:</br> * <ul> * <li>封装核心的平台API</li> * <li>封装了两种用户认证方式:用户名/密码和OAuth方式</li> * <li>使用事件来返回API调用结果</li> * <li>对API调用的结果(XML)进行强类型的封装</li> * </ul> * 一般情况下,当一个API调用成功时,将会抛出一个<b>MicroBlogEvent</b>事件,而调用失败将会抛出<b>MicroBlogErrorEvent</b>事件。</br> * 具体事件类型请参照函数说明文档。 * </p> * <p> * <b>例1 使用用户名密码进行用户认证</b> * <pre><br/> * private var mb:MicroBlog = new MicroBlog(); * public function init():void * { * mb.login(username, password); * }</pre> * </p> * <p> * <b>例2 使用OAuth进行认证</b> * <pre><br/> * private var mb:MicroBlog = new MicroBlog(); * public function init():void * { * mb.consumerKey = xxxxxx; * mb.consumerSecret = xxxxxx; * if ( accessTokenKey && accessTokenSecret ) * //如果保存了用户认证过的Token,则不需要登陆,也不需要pin_onClick的调用过程 * { * mb.accessTokenKey = accessTokenKey; * mb.accessTokenSecret = accessTokenSecret; * } else * { * mb.login(); * } * } * //当用户在网页上认证了该请求以后 * private function pin_onClick():void * { * mb.pin = xxxxx;//如果不使用pin码,将pin置为空即可mb.pin=""; * } * //然后就可以访问微博数据了 * </pre> * </p> * <p> * <b>例3 一个典型的服务器调用过程,包括调用api,监听事件</b> * <pre><br/> * private var mb:MicroBlog = new MicroBlog(); * private function initListeners():void * { * mb.addEventListener(MicroBlogEvent.LOAD_PUBLIC_TIMELINE_RESULT, mb_onPublicTimeline, false, 0, true); * mb.addEventListener(MicroBlogErrorEvent.LOAD_PUBLIC_TIMELINE_ERROR, mb_onError, false, 0, true); * } * public function loadPublicTimeline():void * { * mb.loadPublicTimeline(); * } * private function mb_onPublicTimeline(event:MicroBlogEvent):void * { * //处理成功返回的数据 * var data:Array = event.result; * xxxxxx * } * private function mb_onError(event:MicroBlogErrorEvent):void * { * var msg:String = event.message; * xxxxxxx * } * </pre> * </p> * */ public class MicroBlog extends EventDispatcher { private static const API_BASE_URL:String="http://api.t.sina.com.cn/"; private static const OAUTH_REQUEST_TOKEN_REQUEST_URL:String=API_BASE_URL + "oauth/request_token"; //private static const OAUTH_REQUEST_TOKEN_REQUEST_URL:String="http://twitter.com/oauth/request_token"; private static const OAUTH_AUTHORIZE_REQUEST_URL:String=API_BASE_URL + "oauth/authorize"; private static const OAUTH_ACCESS_TOKEN_REQUEST_URL:String=API_BASE_URL + "oauth/access_token"; private static const PUBLIC_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/public_timeline.xml"; private static const FRIENDS_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/friends_timeline.xml"; private static const USER_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/user_timeline$user.xml"; private static const MENTIONS_REQUEST_URL:String=API_BASE_URL + "statuses/mentions.xml"; private static const COMMENTS_TIMELINE_REQUEST_URL:String=API_BASE_URL + "statuses/comments_timeline.xml"; private static const COMMENTS_BY_ME_REQUEST_URL:String=API_BASE_URL + "statuses/comments_by_me.xml"; private static const COMMENTS_REQUEST_URL:String=API_BASE_URL + "statuses/comments.xml"; private static const STATUS_COUNTS_REQUEST_URL:String=API_BASE_URL + "statuses/counts.xml"; private static const UPDATE_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/update.xml"; private static const UPDATE_STATUS_WITH_IMAGE_REQUEST_URL:String=API_BASE_URL + "statuses/upload.xml"; private static const SHOW_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/show/$id.xml"; private static const DELETE_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/destroy/$id.xml"; private static const COMMENT_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/comment.xml"; private static const DELETE_COMMENT_REQUEST_URL:String=API_BASE_URL + "statuses/comment_destroy/$id.xml"; private static const REPOST_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/repost.xml"; private static const REPLY_STATUS_REQUEST_URL:String=API_BASE_URL + "statuses/reply.xml"; private static const LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL:String=API_BASE_URL + "direct_messages.xml"; private static const LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL:String=API_BASE_URL + "direct_messages/sent.xml"; private static const SEND_DIRECT_MESSAGE_REQUEST_URL:String=API_BASE_URL + "direct_messages/new.xml"; private static const DELETE_DIRECT_MESSAGE_REQUEST_URL:String=API_BASE_URL + "direct_messages/destroy/$id.xml"; private static const LOAD_USER_INFO_REQUEST_URL:String=API_BASE_URL + "users/show$user.xml"; private static const LOAD_FRIENDS_INFO_REQUEST_URL:String=API_BASE_URL + "statuses/friends$user.xml"; private static const LOAD_FOLLOWERS_INFO_REQUEST_URL:String=API_BASE_URL + "statuses/followers$user.xml"; private static const FOLLOW_REQUEST_URL:String=API_BASE_URL + "friendships/create$user.xml"; private static const CANCEL_FOLLOWING_REQUEST_URL:String=API_BASE_URL + "friendships/destroy$user.xml"; private static const CHECK_IS_FOLLOWING_REQUEST_URL:String=API_BASE_URL + "friendships/show.xml"; private static const LOAD_FRIENDS_ID_LIST_REQUEST_URL:String=API_BASE_URL + "friends/ids$user.xml"; private static const LOAD_FOLLOWERS_ID_LIST_REQUEST_URL:String=API_BASE_URL + "followers/ids$user.xml"; private static const VERIFY_CREDENTIALS_REQUEST_URL:String=API_BASE_URL + "account/verify_credentials.xml"; private static const GET_RATE_LIMIT_STATUS_REQUEST_URL:String=API_BASE_URL + "account/rate_limit_status.xml"; private static const LOGOUT_REQUEST_URL:String=API_BASE_URL + "account/end_session.xml"; private static const UPDATE_PROFILE_IMAGE_REQUEST_URL:String=API_BASE_URL + "account/update_profile_image.xml"; private static const UPDATE_PROFILE_REQUEST_URL:String=API_BASE_URL + "account/update_profile.xml"; private static const LOAD_FAVORITE_LIST_REQUEST_URL:String=API_BASE_URL + "favorites.xml"; private static const ADD_TO_FAVORITES_REQUEST_URL:String=API_BASE_URL + "favorites/create.xml"; private static const REMOVE_FROM_FAVORITES_REQUEST_URL:String=API_BASE_URL + "favorites/destroy/$id.xml"; private static const ENABLE_NOTIFICATION_REQUEST_URL:String=API_BASE_URL + "notifications/$enabled$user.xml"; private static const LOAD_PROVINCE_CITY_ID_LIST:String=API_BASE_URL + "provinces.xml"; // private static const VERIFY_CREDENTIALS:String = "1"; // private static const LOGOUT:String = "2"; private static const USER_ID:String="user_id"; private static const SCREEN_NAME:String="screen_name"; private static const SINCE_ID:String="since_id"; private static const MAX_ID:String="max_id"; private static const COUNT:String="count"; private static const PAGE:String="page"; private static const ROLE:String="role"; private static const ID:String="id"; private static const CURSOR:String="cursor"; private static const FOLLOW:String="follow"; private static const SOURCE_ID:String="source_id"; private static const SOURCE_SCREEN_NAME:String="source_screen_name"; private static const TARGET_ID:String="target_id"; private static const TARGET_SCREEN_NAME:String="target_screen_name"; private static const MULTIPART_FORMDATA:String="multipart/form-data; boundary="; private static const CONTENT_DISPOSITION_BASIC:String=‘Content-Disposition: form-data; name="$name"‘; private static const CONTENT_TYPE_JPEG:String="Content-Type: image/pjpeg"; private static const CONTENT_TRANSFER_ENCODING:String="Content-Transfer-Encoding: binary"; private static const SOURCE_ADOBE_AIR_CLIENT:String = "Adobe Air Client"; private var _consumerKey:String=""; private var _consumerSecret:String=""; private var _accessTokenKey:String=""; private var _accessTokenSecret:String=""; private var _pin:String=""; private var _source:String = SOURCE_ADOBE_AIR_CLIENT; private var authHeader:URLRequestHeader; private var serviceLoader:Dictionary=new Dictionary(); private var loaderMap:Dictionary=new Dictionary(); private var oauthLoader:URLLoader; /** * @private Used for test purpose. */ nm_test_internal var lastLoader:URLLoader; nm_test_internal var lastRequest:URLRequest; public function MicroBlog() { } /** * consumerKey是一个只写属性,用于验证客户端的合法性, * 必须在调用login之前将其设置为合适值. */ public function set consumerKey(value:String):void { if ( value ) { _consumerKey=value; } else { _consumerKey = ""; } } /** * consumerSecret是一个只写属性,用于和consumerKey一起验证客户端的合法性, * 必须在调用login之前将其设置为合适值. */ public function set consumerSecret(value:String):void { if ( value ) { _consumerSecret=value; } else { _consumerSecret = ""; } } /** * pin是用于OAuth认证用的属性,由登陆页面生成.仅在登陆时使用. * */ public function set pin(value:String):void { _pin=value; //Case that the saved user come back. //The oauthLoader will not created before login //Actually, the application could save last token and //reset after the application restarted. if ( oauthLoader ) { var url:String=OAUTH_ACCESS_TOKEN_REQUEST_URL; var req:URLRequest=signRequest(URLRequestMethod.GET, url, null); oauthLoader.load(req); _pin = ""; // Just use once. } } /** * accessTokenKey是用于OAuth认证的访问资源的token,由用户授权. * */ public function set accessTokenKey(value:String):void { if (null != value) { _accessTokenKey=value; } else { _accessTokenKey = ""; } } public function get accessTokenKey():String { return _accessTokenKey; } /** * accessTokenSecret是用于OAuth认证的访问资源的token的密钥. * */ public function get accessTokenSecrect():String { return _accessTokenSecret; } public function set accessTokenSecrect(value:String):void { if (null != value) { _accessTokenSecret=value; } else { _accessTokenSecret = ""; } } /** * source是标识客户端来源.必须设置为新浪认证的应用程序id * */ public function set source(value:String):void { _source = StringEncoders.urlEncodeUtf8String(value); } public function get source():String { return _source; } /** * login函数封装了OAuth所要求的验证的三个步骤, * 调用者只需要将新浪微博的用户名和密码 * (之前输入的consumerKey和consumerSecret) * 传入函数即可. * * @param userName 是合法的新浪微博用户名. * @param password 是与用户名对应的密码. * * login函数没有返回值,验证结果将采用消息的方式通知api调用者. * @see com.sina.microblog.events.MicroBlogEvent#LOGIN_RESULT * */ public function login(userName:String=null, password:String=null):void { if (_accessTokenKey.length > 0 && _accessTokenSecret.length > 0) { return; } if (_consumerKey.length > 0 && _consumerSecret.length > 0) { if (null == oauthLoader) { oauthLoader=new URLLoader(); oauthLoader.addEventListener(Event.COMPLETE, oauthLoader_onComplete, false, 0, true); oauthLoader.addEventListener(IOErrorEvent.IO_ERROR, oauthLoader_onError, false, 0, true); oauthLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, oauthLoader_onSecurityError, false, 0, true); } var req:URLRequest=signRequest(URLRequestMethod.GET, OAUTH_REQUEST_TOKEN_REQUEST_URL, null); oauthLoader.load(req); } else if (userName != null && password != null) { var creds:String=userName + ":" + password; var encodedCredentials:String=Base64.encode(creds); authHeader=new URLRequestHeader("Authorization", "Basic " + encodedCredentials); verifyCredentials(); } } /** * 返回最新更新的20条公共微博消息. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件<br/> * type为<b>MicroBlogEvent.STATUS_PUBLIC_TIMELINE_RESULT</b><br/> * success为<b>true</b>如果该属性为false,则表示该次操作失败<br/> * result为一个MicroBlogStatus数组,该数组包含了最新的20条微博消息.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_PUBLIC_TIMELINE_ERROR</b></p> * */ public function loadPublicTimeline():void { addProcessor(PUBLIC_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_PUBLIC_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_PUBLIC_TIMELINE_ERROR); executeRequest(PUBLIC_TIMELINE_REQUEST_URL, getMicroBlogRequest(PUBLIC_TIMELINE_REQUEST_URL, null, URLRequestMethod.GET)); } /** * 返回用户所有关注的用户最新的n条微博消息. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_FRIENDS_TIMELINE_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_FRIENDS_TIMELINE_ERROR</b><br/></p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * */ public function loadFriendsTimeline(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { addProcessor(FRIENDS_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_FRIENDS_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_TIMELINE_ERROR); var url:String=FRIENDS_TIMELINE_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(FRIENDS_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户发布的最新的n条微博消息. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_USER_TIMELINE_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息. * 由于分页限制,最多只能返回用户最新的300条微博信息</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_USER_TIMELINE_ERROR</b></p> * * @param id 可选参数. 根据指定用户UID或用户帐号来返回微博信息. * @param userID 可选参数. 指定用户UID来返回微博信息,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 可选参数,指定用户的微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候。 * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * * */ public function loadUserTimeline(id:*=null, userID:uint=0, screenName:String=null, sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url. addProcessor(USER_TIMELINE_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_USER_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_USER_TIMELINE_ERROR); var user:String; if (id) { user="/" + String(id); } else { user=""; } var url:String=USER_TIMELINE_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, -1); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(USER_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回最近n条提及我的微博消息. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_MENTIONS_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_MENTIONS_ERROR</b></p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * */ public function loadMentions(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url. addProcessor(MENTIONS_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_MENSIONS_RESULT, MicroBlogErrorEvent.LOAD_MENSIONS_ERROR); var url:String=MENTIONS_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(MENTIONS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回最近n条评论. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_COMMENTS_TIMELINE_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_COMMENTS_TIMELINE_ERROR</b></p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * */ public function loadCommentsTimeline(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { addProcessor(COMMENTS_TIMELINE_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_COMMENTS_TIMELINE_RESULT, MicroBlogErrorEvent.LOAD_COMMENTS_TIMELINE_ERROR); var url:String=COMMENTS_TIMELINE_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(COMMENTS_TIMELINE_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回我发表的评论. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_COMMENTS_BY_ME_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.STATUS_COMMENTS_TIMELINE_ERROR</b></p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * */ public function loadMyComments(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { addProcessor(COMMENTS_BY_ME_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_MY_COMMENTS_RESULT, MicroBlogErrorEvent.LOAD_MY_COMMENTS_ERROR); var url:String=COMMENTS_BY_ME_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(COMMENTS_BY_ME_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回指定微博的最新n条评论. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_COMMENTS_RESULT</b><br/> * result为一个MicroBlogStatus数组,该数组包含了所请求的微博消息.</p> * * @param id 必选参数,指定微博ID. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. */ public function loadCommentList(id:uint, count:uint=0, page:uint=0):void { addProcessor(COMMENTS_REQUEST_URL, processCommentArray, MicroBlogEvent.LOAD_COMMENTS_RESULT, MicroBlogErrorEvent.LOAD_COMMENTS_ERROR); var url:String=COMMENTS_REQUEST_URL; var params:Object=new Object(); params[ID]=id; makeQueryCombinatory(params, 0, 0, count, page); executeRequest(COMMENTS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 批量统计微薄的评论数,转发数.单次最多获取100个. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.STATUS_COUNTS_RESULT</b><br/> * result为一个MicroBlogCounts实例.</p> * * @param ids 必选参数,指定微博ID数组. * */ public function loadStatusCounts(ids:Array):void { addProcessor(STATUS_COUNTS_REQUEST_URL, processCounts, MicroBlogEvent.LOAD_STATUS_COUNTS_RESULT, MicroBlogErrorEvent.LOAD_STATUS_COUNTS_ERROR); var idsParam:String=""; if (null == ids || ids.length == 0) { return; } var len:int=ids.length - 1; for (var i:int=0; i < len; ++i) { idsParam+=ids[i].toString() + ","; } idsParam+=ids[len].toString(); var params:Object=new Object(); params["ids"]=idsParam; var url:String=STATUS_COUNTS_REQUEST_URL; executeRequest(STATUS_COUNTS_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 获取单条ID的微博信息,作者信息将同时返回. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.SHOW_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * @param id 必选参数,指定微博消息ID. * */ public function loadStatusInfo(id:uint):void { addProcessor(SHOW_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.LOAD_STATUS_INFO_RESULT, MicroBlogErrorEvent.LOAD_STATUS_INFO_ERROR); var url:String=SHOW_STATUS_REQUEST_URL.replace("$id", id); executeRequest(SHOW_STATUS_REQUEST_URL, getMicroBlogRequest(url, null, URLRequestMethod.GET)); } /** * 发布一条微博信息.为防止重复,发布的信息与当前最新信息一样话,将会被忽略. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.UPDATE_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * @param status 必选参数,要更新的微博信息,信息内容部超过140个汉字. * @param filename 可选参数,上传的jpeg文件名. * @param imgData 可选参数,为需要上传的jpeg文件数据,为空则不上传图片. * * 如果没有登录或超过发布上限,将返回错误 * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息. */ public function updateStatus(status:String, filename:String=null, imgData:ByteArray=null):void { addProcessor(UPDATE_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.UPDATE_STATUS_RESULT, MicroBlogErrorEvent.UPDATE_STATUS_ERROR); var req:URLRequest; var params:URLVariables=new URLVariables(); if ( status ) { params.status= encodeMsg(status); } else { if ( imgData == null ) { return; } } var url:String; if (imgData) { url=UPDATE_STATUS_WITH_IMAGE_REQUEST_URL; req=getMicroBlogRequest(url, params, URLRequestMethod.POST); var boundary:String=makeBoundary(); req.contentType=MULTIPART_FORMDATA + boundary; req.data=makeMultipartPostData(boundary, "pic", filename, imgData, params); } else { url=UPDATE_STATUS_REQUEST_URL; req=getMicroBlogRequest(url, params, URLRequestMethod.POST); req.data=params; } executeRequest(UPDATE_STATUS_REQUEST_URL, req); } /** * 返回发布一条带图片的微博信息的<code>URLRequest对象</code>. * * * <p>如果消息成功发送,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.UPDATE_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * * @return <code>URLRequest</code>对象,用于在flash中用File对象上传图片,在调用File对象的upload时uploadDataFieldName必须为pic。 * * 如果没有登录或超过发布上限,将返回错误 * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息. * * @see #updateStatus() */ public function getUploadImageRequest(status:String):URLRequest { var req:URLRequest; var url:String=UPDATE_STATUS_WITH_IMAGE_REQUEST_URL; var data:URLVariables=new URLVariables(); data.status=encodeMsg(status); req=getMicroBlogRequest(url, data, URLRequestMethod.POST); req.data=data; return req; } /** * 删除微博信息.注意:只能删除自己发布的信息. * * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.DELETE_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * @param id 必填参数,要删除的微博信息ID. * */ public function deleteStatus(id:uint):void { addProcessor(DELETE_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.DELETE_STATUS_RESULT, MicroBlogErrorEvent.DELETE_STATUS_ERROR); var url:String=DELETE_STATUS_REQUEST_URL.replace("$id", id); var postData:URLVariables = new URLVariables(); var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST); req.data = postData; executeRequest(DELETE_STATUS_REQUEST_URL, req); } /** * 转发一条微博信息.为防止重复,发布的信息与当前最新信息一样话,将会被忽略. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.REPOST_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * @param id 必填参数,转发的微博ID. * @param status 可选参数,要更新的微博信息,信息内容部超过140个汉字. * * <p>如果没有登录或超过发布上限,将返回错误 * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息. * </p> */ public function repostStatus(id:uint, status:String=null):void { addProcessor(REPOST_STATUS_REQUEST_URL, processStatus, MicroBlogEvent.REPOST_STATUS_RESULT, MicroBlogErrorEvent.REPOST_STATUS_ERROR); var variable:URLVariables=new URLVariables(); variable.id=id; if (status && status.length > 0) { variable.status=encodeMsg(status); } var req:URLRequest=getMicroBlogRequest(REPOST_STATUS_REQUEST_URL, variable, URLRequestMethod.POST); req.data=variable; executeRequest(REPOST_STATUS_REQUEST_URL, req); } /** * 对一条微博信息进行评论.为防止重复,发布的信息与当前最新信息一样话,将会被忽略. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件 * type为<b>MicroBlogEvent.COMMENT_STATUS_RESULT</b><br/> * result为一个MicroBlogComment实例.</p> * * <p>如果没有登录或超过发布上限,将返回错误<br/> * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息.</p> * * @param id 必填参数, 要评论的微博ID. * @param comment 必选参数,要更新的微博信息,信息内容部超过140个汉字. * @param cid 选填参数,要评论的评论ID. * */ public function commentStatus(id:uint, comment:String, cid:uint=0):void { addProcessor(COMMENT_STATUS_REQUEST_URL, processComment, MicroBlogEvent.COMMENT_STATUS_RESULT, MicroBlogErrorEvent.COMMENT_STATUS_ERROR); var variable:URLVariables=new URLVariables(); variable.id=id; if (comment ) { variable.comment=encodeMsg(comment); } if (cid > 0) { variable.cid=cid; } var req:URLRequest=getMicroBlogRequest(COMMENT_STATUS_REQUEST_URL, variable, URLRequestMethod.POST); req.data=variable; executeRequest(COMMENT_STATUS_REQUEST_URL, req); } /** * 删除评论.注意:只能删除自己发布的信息. * * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.DELETE_STATUS_COMMENT_RESULT</b><br/> * result为一个MicroBlogComment实例.</p> * * @param id 必填参数,要删除的微博评论信息ID. * */ public function deleteComment(id:uint):void { addProcessor(DELETE_COMMENT_REQUEST_URL, processComment, MicroBlogEvent.DELETE_COMMENT_RESULT, MicroBlogErrorEvent.DELETE_COMMENT_ERROR); var url:String=DELETE_COMMENT_REQUEST_URL.replace("$id", id); var postData:URLVariables = new URLVariables(); var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST); req.data = postData; executeRequest(DELETE_COMMENT_REQUEST_URL, req); } /** * 对一条微博评论信息进行回复.为防止重复,发布的信息与当前最新信息一样话,将会被忽略. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.REPLY_STATUS_RESULT</b><br/> * result为一个MicroBlogStatus实例.</p> * * @param id 必填参数, 要评论的微博消息ID. * @param comment 必选参数,要更新的微博信息,信息内容部超过140个汉字. * @param cid 必选参数,要评论的评论ID. * * <p>如果没有登录或超过发布上限,将返回错误 * 系统将忽略重复发布的信息.每次发布将比较最后一条发布消息,如果一样将被忽略.因此用户不能连续提交相同信息. * </p> */ public function replyStatus(id:uint, comment:String, cid:uint):void { addProcessor(REPLY_STATUS_REQUEST_URL, processComment, MicroBlogEvent.REPLY_STATUS_RESULT, MicroBlogErrorEvent.REPLY_STATUS_ERROR); var variable:URLVariables=new URLVariables(); variable.id=id; if ( comment ) { variable.comment=encodeMsg(comment); } variable.cid=cid; var req:URLRequest=getMicroBlogRequest(REPLY_STATUS_REQUEST_URL, variable, URLRequestMethod.POST); req.data=variable; executeRequest(REPLY_STATUS_REQUEST_URL, req); } /** * 按用户UID或昵称返回用户资料,同时也将返回用户的最新发布的微博. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.SHOW_USERS_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * @param user 用户UID或用户帐号. * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * * <br/> * <b>以上三个参数必须至少给一个</b> * 为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回. */ public function loadUserInfo(user:String=null, userID:uint=0, screenName:String=null):void { addProcessor(LOAD_USER_INFO_REQUEST_URL, processUser, MicroBlogEvent.LOAD_USER_INFO_RESULT, MicroBlogErrorEvent.LOAD_USER_INFO_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=LOAD_USER_INFO_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, -1); executeRequest(LOAD_USER_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户关注实例列表,并返回最新微博文章.按关注人的关注时间倒序返回, * 每次返回100个,通过cursor参数来取得多于100的关注人. * 也可以通过ID,nickname,user_id参数来获取其他人的关注人列表. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.FRIENDS_RESULT</b><br/> * result为一个MicroBlogUser数组.</p> * * @param user 用户UID或用户帐号. * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * @param cursor 选填参数. 单页只能包含100个关注列表,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表. * * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p> */ public function loadFriendsInfo(user:String=null, userID:uint=0, screenName:String=null, cursor:Number=-1):void { addProcessor(LOAD_FRIENDS_INFO_REQUEST_URL, processUserArray, MicroBlogEvent.LOAD_FRIENDS_INFO_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_INFO_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=LOAD_FRIENDS_INFO_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, cursor); executeRequest(LOAD_FRIENDS_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户的粉丝列表,并返回粉丝的最新微博.按粉丝的关注时间倒序返回, * 每次返回100个,通过cursor参数来取得多于100的粉丝. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.FOLLOWERS_RESULT</b><br/> * result为一个MicroBlogUser数组.</p> * * @param user 用户UID或用户帐号. * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * @param cursor 选填参数. 单页只能包含100个关注列表,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表. * * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p> */ public function loadFollowersInfo(user:String=null, userID:uint=0, screenName:String=null, cursor:int=-1):void { addProcessor(LOAD_FOLLOWERS_INFO_REQUEST_URL, processUserArray, MicroBlogEvent.LOAD_FOLLOWERS_INFO_RESULT, MicroBlogErrorEvent.LOAD_FOLLOWERS_INFO_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=LOAD_FOLLOWERS_INFO_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, cursor); executeRequest(LOAD_FOLLOWERS_INFO_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户的最新n条私信. * * <b>有请求数限制</b> * * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.DIRECT_MESSAGES_RESULT</b><br/> * result为一个MicroBlogDirectMessage数组.</p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p> */ public function loadDirectMessagesReceived(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { addProcessor(LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL, processDirectMessageArray, MicroBlogEvent.LOAD_DIRECT_MESSAGES_RECEIVED_RESULT, MicroBlogErrorEvent.LOAD_DIRECT_MESSAGES_RECEIVED_ERROR); var url:String=LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(LOAD_DIRECT_MESSAGES_RECEIVED_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回登录用户已发送最新n条私信. * * <b>有请求数限制</b> * * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.SENT_DIRECT_MESSAGES_RESULT</b><br/> * result为一个MicroBlogDirectMessage数组.</p> * * @param sinceID 请求大于该id的所有消息更新,默认值为0,表示不限制. * @param maxID 请求小于该id的所有消息更新,默认为0,表示不限制. * @param count 请求的页大小,即一页包含多少条记录;默认值0,表示使用服务器默认分页大小. * @param page 请求的页序号,默认值0,返回第一页. * * <p>为了保护用户隐私,只有用户设置了公开或对粉丝设置了公开的数据才会返回.</p> */ public function loadDirectMessagesSent(sinceID:uint=0, maxID:uint=0, count:uint=0, page:uint=0):void { addProcessor(LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL, processDirectMessageArray, MicroBlogEvent.LOAD_DIRECT_MESSAGES_SENT_RESULT, MicroBlogErrorEvent.LOAD_DIRECT_MESSAGES_SENT_ERROR); var url:String=LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL; var params:Object=new Object(); makeQueryCombinatory(params, sinceID, maxID, count, page); executeRequest(LOAD_DIRECT_MESSAGES_SENT_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返发送一条私信.必须包含参数user和message, * userID和screenName必须选一个. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.NEW_DIRECT_MESSAGES_RESULT</b><br/> * result为一个MicroBlogDirectMessage实例.</p> * * @param user 用户UID或用户帐号. * @param message 必须参数. 要发生的消息内容,文本大小必须小于140个汉字. * @param userID 指定用户UID,主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * */ public function sendDirectMessage(user:String, message:String, userID:uint=0, screenName:String=null):void { //curl -u user:password -d "text=all your bases are belong to us&user=user_2" http://api.t.sina.com.cn/direct_messages/new.xml addProcessor(SEND_DIRECT_MESSAGE_REQUEST_URL, processDirectMessage, MicroBlogEvent.SEND_DIRECT_MESSAGE_RESULT, MicroBlogErrorEvent.SEND_DIRECT_MESSAGE_ERROR); if (userID == 0 && screenName == null) { var e:MicroBlogErrorEvent=new MicroBlogErrorEvent(MicroBlogErrorEvent.SEND_DIRECT_MESSAGE_ERROR); e.message="参数错误"; dispatchEvent(e); } var data:URLVariables=new URLVariables(); if (userID > 0) { data.user_id=userID; } if (screenName) { data.screen_name=screenName; } data.id = user; data.text = encodeMsg(message); var req:URLRequest=getMicroBlogRequest(SEND_DIRECT_MESSAGE_REQUEST_URL, data, URLRequestMethod.POST); req.data=data; executeRequest(SEND_DIRECT_MESSAGE_REQUEST_URL, req); } /** * 按ID删除私信.操作用户必须为私信的接收人. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.DELETE_DIRECT_MESSAGES_RESULT</b><br/> * result为一个MicroBlogDirectMessage实例.</p> * * @param id 必填参数,要删除的私信主键ID. * */ public function deleteDirectMessage(id:uint):void { //curl -u user:password --http-request DELETE http://api.t.sina.com.cn/direct_messages/destroy/88619848.xml addProcessor(DELETE_DIRECT_MESSAGE_REQUEST_URL, processDirectMessage, MicroBlogEvent.DELETE_DIRECT_MESSAGE_RESULT, MicroBlogErrorEvent.DELETE_DIRECT_MESSAGE_ERROR); var url:String=DELETE_DIRECT_MESSAGE_REQUEST_URL.replace("$id", id); var postData:URLVariables = new URLVariables(); var req:URLRequest = getMicroBlogRequest(url, postData, URLRequestMethod.POST); req.data = postData; executeRequest(DELETE_DIRECT_MESSAGE_REQUEST_URL, req); } /** * 关注一个用户.成功则返回关注人的资料, * 失败则返回一条字符串的说明. * * <p> 如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.CREATE_FRIENDSHIPS_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * @param user 用户UID或用户帐号. * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * @param isFollow 可选参数.将是自己粉丝的用户加为关注. * */ public function follow(user:String, userID:uint, screenName:String, isFollow:Boolean=true):void { //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url. addProcessor(FOLLOW_REQUEST_URL, processUser, MicroBlogEvent.FOLLOW_RESULT, MicroBlogErrorEvent.FOLLOW_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=FOLLOW_REQUEST_URL.replace("$user", user); var params:URLVariables=new URLVariables(); if ( userID > 0 ) { params.user_id = userID; } if ( screenName && screenName.length > 0 ) { params.screen_name = screenName; } params.follow = isFollow; var req:URLRequest=getMicroBlogRequest(url, params, URLRequestMethod.POST); req.data = params; executeRequest(FOLLOW_REQUEST_URL, req); } /** * 取消关注某用户.成功则返回被取消关注人的资料, * 失败则返回一条字符串的说明. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.DESTROY_FRIENDSHIPS_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * @param user 用户UID或用户帐号. * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * */ public function cancelFollowing(user:String, userID:uint, screenName:String):void { //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url. addProcessor(CANCEL_FOLLOWING_REQUEST_URL, processUser, MicroBlogEvent.CANCEL_FOLLOWING_RESULT, MicroBlogErrorEvent.CANCEL_FOLLOWING_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=CANCEL_FOLLOWING_REQUEST_URL.replace("$user", user); var params:URLVariables=new URLVariables(); if ( userID > 0 ) { params.user_id = userID; } if ( screenName && screenName.length > 0 ) { params.screen_name = screenName; } var req:URLRequest=getMicroBlogRequest(url, params, URLRequestMethod.POST); req.data = params; executeRequest(CANCEL_FOLLOWING_REQUEST_URL, req); } /** * 返回两个用户关系的详细情况. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.CHECK_FRIENDSHIPS_RESULT</b><br/> * result为<code>MicroBlogUsersRelationship</code>值.</p> * * @param targetID 选填参数,要判断的目标用户的uid. * @param targetScreenName 选填参数,要判断的目标用户的昵称.targetID和targetScreenName两个参数必须填一个. * @param sourceID 选填参数,要判断的源用户的uid * @param sourceScreenName 选填参数,要判断的源用户的昵称.如果sourceID和sourceScreenName均未填,则以当前用户为源用户 * */ public function checkIsFollowing(targetID:uint=0, targetScreenName:String=null, sourceID:uint=0, sourceScreenName:String=null):void { addProcessor(CHECK_IS_FOLLOWING_REQUEST_URL, processRelationship, MicroBlogEvent.CHECK_IS_FOLLOWING_RESULT, MicroBlogErrorEvent.CHECK_IS_FOLLOWING_ERROR); var params:Object=new Object(); var needExecute:Boolean=false; if (targetID > 0) { params[TARGET_ID]=targetID; needExecute=true; } if (targetScreenName && targetScreenName.length > 0) { params[TARGET_SCREEN_NAME]=StringEncoders.urlEncodeUtf8String(targetScreenName); needExecute=true; } if (!needExecute) { return; } if (sourceID > 0) { params[SOURCE_ID]=sourceID; } if (sourceScreenName && sourceScreenName.length > 0) { params[SOURCE_SCREEN_NAME]=StringEncoders.urlEncodeUtf8String(sourceScreenName); } var url:String=CHECK_IS_FOLLOWING_REQUEST_URL; executeRequest(CHECK_IS_FOLLOWING_REQUEST_URL,getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户关注对象的user_id列表. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.LOAD_FRIENDS_ID_LIST_RESULT</b><br/> * result为<code>uint数组</code>实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.LOAD_FRIENDS_ID_LIST_ERROR</b><br/> * message为错误描述.</p> * * @param user 用户UID或用户帐号. * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * @param cursor 选填参数. 单页只能包含5000个id,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表. * @param count 可选参数. 每次返回的最大记录数(即页面大小),不大于5000。 */ public function loadFriendsIDList(user:String, userID:uint=0, screenName:String=null, cursor:Number=-1, count:uint=5000):void { addProcessor(LOAD_FRIENDS_ID_LIST_REQUEST_URL, processIDSArray, MicroBlogEvent.LOAD_FRIENDS_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_FRIENDS_ID_LIST_ERROR); if (user && user.length > 0) { user="/" + user; } else { user=""; } var url:String=LOAD_FRIENDS_ID_LIST_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, cursor); params["count"] = count; executeRequest(LOAD_FRIENDS_ID_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 返回用户粉丝的user_id列表. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.LOAD_FOLLOWERS_ID_LIST_RESULT</b><br/> * result为<code>uint数组</code>实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.LOAD_FOLLOWERS_ID_LIST_ERROR</b><br/> * message为错误描述.</p> * * @param user 用户UID或用户帐号. * @param userID 主要是用来区分用户UID跟用户账号一样,产生歧义的时候,特别是在用户账号为数字导致和用户Uid发生歧义. * @param screenName 指定微博昵称,主要是用来区分用户UID跟用户账号一样,产生歧义的时候. * @param cursor 选填参数. 单页只能包含5000个id,为了获取更多则cursor默认从-1开始,通过增加或减少cursor来获取更多的关注列表. * @param count 可选参数. 每次返回的最大记录数(即页面大小),不大于5000。 */ public function loadFollowersIDList(user:String, userID:uint=0, screenName:String=null, cursor:Number=-1, count:uint=5000):void { addProcessor(LOAD_FOLLOWERS_ID_LIST_REQUEST_URL, processIDSArray, MicroBlogEvent.LOAD_FOLLOWERS_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_FOLLOWERS_ID_LIST_ERROR); if (user && user.length>0) { user="/" + user; } else { user=""; } var url:String=LOAD_FOLLOWERS_ID_LIST_REQUEST_URL.replace("$user", user); var params:Object=new Object(); makeUserParams(params, userID, screenName, cursor); params["count"]=count; executeRequest(LOAD_FOLLOWERS_ID_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 判断用户身份是否合法. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.VERIFY_CREDENTIALS_RESULT</b><br/> * result为<code>MicroBlogUser</code>实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.VERIFY_CREDENTIALS_ERROR</b><br/> * message为错误描述.</p> * */ public function verifyCredentials():void { //TO-DO: if the parameter equals to zero, don‘t include this parameter when build request url. //curl -u user:password http://api.t.sina.com.cn/account/verify_credentials.xml addProcessor(VERIFY_CREDENTIALS_REQUEST_URL, processUser, MicroBlogEvent.VERIFY_CREDENTIALS_RESULT, MicroBlogErrorEvent.VERIFY_CREDENTIALS_ERROR); executeRequest(VERIFY_CREDENTIALS_REQUEST_URL, getMicroBlogRequest(VERIFY_CREDENTIALS_REQUEST_URL, null)); } /** * 获取当前的API调用次数限制. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.RATE_LIMIT_INFO_RESULT</b><br/> * result为<code>MicroBlogRateInfo</code>实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.RATE_LIMIT_INFO_ERROR</b><br/> * message为错误描述.</p> * */ public function getRateLimitInfo():void { //curl -u user:password http://api.t.sina.com.cn/account/rate_limit_status.xml addProcessor(GET_RATE_LIMIT_STATUS_REQUEST_URL, processRateLimit, MicroBlogEvent.GET_RATE_LIMIT_STATUS_RESULT, MicroBlogErrorEvent.GET_RATE_LIMIT_STATUS_ERROR); executeRequest(GET_RATE_LIMIT_STATUS_REQUEST_URL, getMicroBlogRequest(GET_RATE_LIMIT_STATUS_REQUEST_URL, null) ); } /** * 登陆用户退出. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.LOGOUT_RESULT</b><br/></p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.LOGOUT_ERROR</b><br/> * message为错误描述.</p> * */ public function logout():void { //curl -u user:password -d "" http://api.t.sina.com.cn/account/end_session.xml addProcessor(LOGOUT_REQUEST_URL, processLogout, MicroBlogEvent.LOGOUT_RESULT, MicroBlogErrorEvent.LOGOUT_ERROR); var postData:URLVariables = new URLVariables(); postData.source = "air client"; var req:URLRequest = getMicroBlogRequest(LOGOUT_REQUEST_URL, postData, URLRequestMethod.POST); req.data = postData; executeRequest(LOGOUT_REQUEST_URL, req ); } /** * 用户可以通过此接口来更新头像. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.UPDATE_PROFILE_IMAGE_ERROR</b><br/> * message为错误描述.</p> * * @param imgData 必须为小于700K的有效的GIF, JPG, 或 PNG 图片. 如果图片大于500像素将按比例缩放 * */ public function updateProfileImage(imgData:ByteArray, filename:String):void { //TO-DO: Need to be verified. addProcessor(UPDATE_PROFILE_IMAGE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_IMAGE_ERROR); var boundary:String=makeBoundary(); var postData:Object = {image:imgData}; var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, postData, URLRequestMethod.POST); delete postData["image"]; req.contentType=MULTIPART_FORMDATA + boundary; req.data=makeMultipartPostData(boundary, "image", filename, imgData, postData); executeRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, req); } /** * 用户可以通过此接口来更改微博信息的来源.用于无法传递ByteArray为参数的情况. * * <p>如果图片上传成功,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.UPDATE_DELIVERY_DEVICE_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * <p>如果图片上传失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.UPDATE_DELIVERY_DEVICE_ERROR</b><br/> * message为错误描述.</p> * * @return 返回用于上传图片的URLRequest.用于在flash中用File对象上传图片,在调用File对象的upload时uploadDataFieldName必须为image * */ public function getUpdateProfileImageRequest():URLRequest { addProcessor(UPDATE_PROFILE_IMAGE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_IMAGE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_IMAGE_ERROR); var postData:URLVariables = new URLVariables(); var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_IMAGE_REQUEST_URL, postData, URLRequestMethod.POST); req.data=postData; return req; } /** * 用户可以通过此接口来更新微博页面参数. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.UPDATE_PROFILE_RESULT</b><br/> * result为一个MicroBlogUser实例.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.UPDATE_PROFILE_ERROR</b><br/> * message为错误描述.</p> * * @param params MicroBlogProfileUpdateParams对象,用于更新个人设置@see com.sina.microblog.data.MicroBlogProfileUpdateParams. * * */ public function updateProfile(params:MicroBlogProfileUpdateParams):void { //curl -u user:password -d "update_delivery_device=none" http://api.t.sina.com.cn/account/update_profile_colors.xml addProcessor(UPDATE_PROFILE_REQUEST_URL, processUser, MicroBlogEvent.UPDATE_PROFILE_RESULT, MicroBlogErrorEvent.UPDATE_PROFILE_ERROR); if (null==params || params.isEmpty) { return; } var postData:URLVariables = params.postData; var req:URLRequest=getMicroBlogRequest(UPDATE_PROFILE_REQUEST_URL, postData, URLRequestMethod.POST); req.data=postData; executeRequest(UPDATE_PROFILE_REQUEST_URL, req); } /** * 返回用户的最近20条收藏信息,和用户收藏页面返回内容是一致的. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.LOAD_FAVORIT_LIST_RESULT</b><br/> * result为一个MicroBlogStatus对象数组.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.LOAD_FAVORIT_LIST_ERROR</b><br/> * message为错误描述.</p> * * @param page 可选参数. 返回结果的页序号。注意:有分页限制. * * */ public function loadFavoriteList(page:uint=0):void { addProcessor(LOAD_FAVORITE_LIST_REQUEST_URL, processStatusArray, MicroBlogEvent.LOAD_FAVORITE_LIST_RESULT, MicroBlogErrorEvent.LOAD_FAVORITE_LIST_ERROR); var url:String=LOAD_FAVORITE_LIST_REQUEST_URL; var params:Object=new Object(); if ( page > 0 ) { params["page"]=page.toString(); } executeRequest(LOAD_FAVORITE_LIST_REQUEST_URL, getMicroBlogRequest(url, params, URLRequestMethod.GET)); } /** * 收藏一条微博信息. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.ADD_TO_FAVORITES_RESULT</b><br/> * result为一个MicroBlogStatus对象.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.ADD_TO_FAVORITES_ERROR</b><br/> * message为错误描述.</p> * * @param statusID 必填参数, 要收藏的微博id. * */ public function addToFavorites(statusID:uint):void { if ( statusID <= 0 ) { return; } addProcessor(ADD_TO_FAVORITES_REQUEST_URL, processStatus, MicroBlogEvent.ADD_TO_FAVORITES_RESULT, MicroBlogErrorEvent.ADD_TO_FAVORITES_ERROR); var postData:URLVariables=new URLVariables(); postData.id=statusID.toString(); var req:URLRequest=getMicroBlogRequest(ADD_TO_FAVORITES_REQUEST_URL, postData, URLRequestMethod.POST); req.data=postData; executeRequest(ADD_TO_FAVORITES_REQUEST_URL, req); } /** * 从收藏列表里删除一条微博信息. * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.ADD_TO_FAVORITES_RESULT</b><br/> * result为一个MicroBlogStatus对象.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.ADD_TO_FAVORITES_ERROR</b><br/> * message为错误描述.</p> * * @param statusID 必填参数, 要收藏的微博id. * */ public function removeFromFavorites(statusID:uint):void { if ( statusID <= 0) { return; } addProcessor(REMOVE_FROM_FAVORITES_REQUEST_URL, processStatus, MicroBlogEvent.REMOVE_FROM_FAVORITES_RESULT, MicroBlogErrorEvent.REMOVE_FROM_FAVORITES_ERROR); var postData:URLVariables = new URLVariables(); var req:URLRequest=getMicroBlogRequest(REMOVE_FROM_FAVORITES_REQUEST_URL.replace("$id", statusID), postData, URLRequestMethod.POST); req.data = postData; executeRequest(REMOVE_FROM_FAVORITES_REQUEST_URL, req); } // /** // * 允许/禁止通知更新给指定用户. // * // * <b>有请求数限制</b> // * // * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> // * type为<b>MicroBlogEvent.FOLLOW_NOTIFICATION_RESULT</b><br/> // * result为一个MicroBlogUser对象.</p> // * // * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> // * type为<b>MicroErrorEvent.FOLLOW_NOTIFICATION_ERROR</b><br/> // * message为错误描述.</p> // * // * @param isEnable 必选参数 // * @param user 指定的用户ID或用户帐号. // * @param page 指定的用户UID. // * @param screenName 指定的用户帐号 // * // * 以上三个可选参数必须设置一个 // * // */ // public function enableNotification(isEnable:Boolean, user:String=null, userID:uint=0, screenName:String=null):void // { // addProcessor(ENABLE_NOTIFICATION_REQUEST_URL, processUser, MicroBlogEvent.ENABLE_NOTIFICATION_RESULT, MicroBlogErrorEvent.ENABLE_NOTIFICATION_ERROR); // var hasParam:Boolean=false; // if (user && user.length > 0) // { // user="/" + user; // hasParam=true; // } // else // { // user=""; // } // var url:String; // if (isEnable) // { // url=ENABLE_NOTIFICATION_REQUEST_URL.replace("$enabled", "follow"); // } // else // { // url=ENABLE_NOTIFICATION_REQUEST_URL.replace("$enabled", "leave"); // } // url=url.replace("$user", user); // var postData:URLVariables=new URLVariables(); // if (userID > 0) // { // postData.user_id=userID; // hasParam=true; // } // if (screenName && screenName.length > 0) // { // postData.screen_name=StringEncoders.urlEncodeUtf8String(screenName); // hasParam=true; // } // if (!hasParam) // { // return; // } // var req:URLRequest=getMicroBlogRequest(url, postData, URLRequestMethod.POST); // req.data=postData; // executeRequest(ENABLE_NOTIFICATION_REQUEST_URL, req); // } // /** * 返回省份,城市的名字对应id的列表,为xml格式. * * <b>有请求数限制</b> * * <p>如果该函数被成功执行,将会抛出MicroBlogEvent事件,该事件<br/> * type为<b>MicroBlogEvent.LOAD_PROVINCE_CITY_ID_LIST_RESULT</b><br/> * result为一个XML对象.</p> * * <p>如果该函数调用失败,将会抛出MicroBlogErrorEvent事件,该事件<br/> * type为<b>MicroErrorEvent.LOAD_PROVINCE_CITY_ID_LIST_ERROR</b><br/> * message为错误描述.</p> * * <p>返回的xml数据格式请参看新浪微博开放平台 http://open.t.sina.com.cn * </p> * * <p>要想获取省份id为11,城市id为1的地址信息可以参考以下方法<br/> * <pre> * var prov:XML = provinces.province.(@id == "11")[0]; * province = prov.@name; * city = prov.city.(@id == "1")[0].@name; * </pre> * 通过名字得到id可以参考如下方法<br/> * <pre> * var prov:XML = provinces.province.(@name == "北京")[0]; * provinceID = prov.@id; * cityID = prov.city.(@name == "东城区")[0].@id; * </pre> * </p> */ public function loadProvinceCityIDList():void { addProcessor(LOAD_PROVINCE_CITY_ID_LIST, processProvincesXML, MicroBlogEvent.LOAD_PROVINCE_CITY_ID_LIST_RESULT, MicroBlogErrorEvent.LOAD_PROVINCE_CITY_ID_LIST_ERROR); executeRequest(LOAD_PROVINCE_CITY_ID_LIST, getMicroBlogRequest(LOAD_PROVINCE_CITY_ID_LIST, null) ); } //Event handler private function addProcessor(name:String, dataProcess:Function, resultEventType:String, errorEventType:String):void { if (null == serviceLoader[name]) { var loader:URLLoader=new URLLoader(); loader.addEventListener(Event.COMPLETE, loader_onComplete); loader.addEventListener(IOErrorEvent.IO_ERROR, loader_onError); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_onSecurityError); serviceLoader[name]=loader; loaderMap[loader]={dataFunc: dataProcess, resultEvent: resultEventType, errorEvent: errorEventType}; } } private function executeRequest(name:String, req:URLRequest):void { var urlLoader:URLLoader = serviceLoader[name] as URLLoader; lastLoader = urlLoader; lastRequest = req; urlLoader.load(req); } private function loader_onComplete(event:Event):void { var loader:URLLoader=event.target as URLLoader; var processor:Object=loaderMap[loader]; var dataStr:String = loader.data as String; if ( dataStr.length <= 0 ) { var ioError:MicroBlogErrorEvent = new MicroBlogErrorEvent(MicroBlogErrorEvent.NET_WORK_ERROR); ioError.message = "The network error"; dispatchEvent(ioError); return; } var result:XML=new XML(loader.data); if (result.child("error").length() > 0) { var error:MicroBlogErrorEvent=new MicroBlogErrorEvent(processor.errorEvent); error.message="Error " + result.error_code + " : " + result.error; dispatchEvent(error); } else { var e:MicroBlogEvent=new MicroBlogEvent(processor.resultEvent); e.result=processor.dataFunc(result); e.nextCursor=Number(result.next_cursor); e.previousCursor=Number(result.previous_cursor); dispatchEvent(e); } //trace(loader.data); } private function loader_onError(event:IOErrorEvent):void { var loader:URLLoader=event.target as URLLoader; var processor:Object=loaderMap[loader]; var error:MicroBlogErrorEvent=new MicroBlogErrorEvent(processor.errorEvent); error.message=event.text; dispatchEvent(error); } private function loader_onSecurityError(event:SecurityErrorEvent):void { dispatchEvent(event); } private function getMicroBlogRequest(url:String, params:Object, requestMethod:String="GET"):URLRequest { var req:URLRequest; if ( null == params ) { params = new Object(); } params["source"] = source; if ( accessTokenKey.length > 0) { req=signRequest(requestMethod, url, params, false); } else { if (requestMethod == URLRequestMethod.GET) { url+=makeGETParamString(params); } req=new URLRequest(url); if ( authHeader ) { req.requestHeaders.push(authHeader); } } req.method=requestMethod; return req; } private function processStatusArray(statuses:XML):Array { var microBlogStatus:MicroBlogStatus; var statusArray:Array=[]; for each (var status:XML in statuses.status) { microBlogStatus=new MicroBlogStatus(status); statusArray.push(microBlogStatus); } return statusArray; } private function processStatus(status:XML):MicroBlogStatus { return new MicroBlogStatus(status); } private function processCommentArray(comments:XML):Array { var microBlogComment:MicroBlogComment; var commentArray:Array=[]; for each (var comment:XML in comments.comment) { microBlogComment=new MicroBlogComment(comment); commentArray.push(microBlogComment); } return commentArray; } private function processComment(comment:XML):MicroBlogComment { return new MicroBlogComment(comment); } private function processCounts(counts:XML):Array { var countArray:Array=[]; var count:MicroBlogCount; for each (var countValue:XML in counts.children()) { count=new MicroBlogCount(countValue); countArray.push(count); } return countArray; } private function processUser(user:XML):MicroBlogUser { return new MicroBlogUser(user); } private function processUserArray(users:XML):Array { var userArray:Array=[]; var mbUser:MicroBlogUser; for each (var userValue:XML in users.user) { mbUser=new MicroBlogUser(userValue); userArray.push(mbUser); } return userArray; } private function processDirectMessageArray(messages:XML):Array { var messageArray:Array=[]; var mbMessage:MicroBlogDirectMessage; for each (var messageValue:XML in messages.direct_message) { mbMessage=new MicroBlogDirectMessage(messageValue); messageArray.push(mbMessage); } return messageArray; } private function processDirectMessage(message:XML):MicroBlogDirectMessage { return new MicroBlogDirectMessage(message); } // private function processBoolean(message:XML):Boolean // { // return message.toString() == "true"; // } private function processRelationship(message:XML):MicroBlogUsersRelationship { return new MicroBlogUsersRelationship(message); } private function processIDSArray(message:XML):Array { var ar:Array=[]; for each (var id:XML in message.ids[0].children()) { ar.push(uint(id.toString())); } return ar; } private function processRateLimit(message:XML):MicroBlogRateLimit { return new MicroBlogRateLimit(message); } private function processLogout(user:XML):MicroBlogUser { _accessTokenKey = ""; _accessTokenSecret = ""; authHeader = null; return new MicroBlogUser(user); } private function processProvincesXML(result:XML):XML { return result; } private function makeGETParamString(parameters:Object):String { var paramStr:String=makeParamsToUrlString(parameters); if (paramStr.length > 0) { paramStr="?" + paramStr; } return paramStr; } private function makeQueryCombinatory(params:Object, sinceID:uint, maxID:uint, count:uint, page:uint):void { if (sinceID > 0) { params[SINCE_ID]=sinceID; } if (maxID > 0) { params[MAX_ID]=maxID; } if (count > 0) { params[COUNT]=count; } if (page > 0) { params[PAGE]=page; } } private function makeUserParams(params:Object, userID:uint, screenName:String, cursor:Number):void { if (userID > 0) { params[USER_ID]=userID; } if (screenName) { params[SCREEN_NAME]=screenName; } if (cursor >= 0) { params[CURSOR]=cursor; } } private function makeBoundary():String { var boundary:String=""; for (var i:int=0; i < 13; i++) { boundary+=String.fromCharCode(int(97 + Math.random() * 25)); } boundary="---------------------------" + boundary; return boundary; } private function encodeMsg(status:String):String { return StringEncoders.urlEncodeSpecial(status); } private function makeMultipartPostData(boundary:String, imgFieldName:String, filename:String, imgData:ByteArray, params:Object):Object { var req:URLRequest=new URLRequest(); var postData:ByteArray=new ByteArray(); postData.endian=Endian.BIG_ENDIAN; var value:String; //add params to the post data. if (params) { for (var name:String in params) { boundaryPostData(postData, boundary); addLineBreak(postData); //writeStringToByteArray(postData, CONTENT_DISPOSITION_BASIC.replace("$name", name)); postData.writeUTFBytes(CONTENT_DISPOSITION_BASIC.replace("$name", name)); addLineBreak(postData); addLineBreak(postData); postData.writeUTFBytes(params[name]); addLineBreak(postData); } } //add image; // --BbC04y // Content-Disposition: file; filename="file2.jpg" // Content-Type: image/jpeg // Content-Transfer-Encoding: binary // // ...contents of file2.jpg... // --BbC04y-- boundaryPostData(postData, boundary); addLineBreak(postData); //writeStringToByteArray(postData, CONTENT_DISPOSITION_BASIC.replace("$name", "files") + ‘; filename="‘+filename + ‘"‘); postData.writeUTFBytes(CONTENT_DISPOSITION_BASIC.replace("$name", imgFieldName) + ‘; filename="‘ + filename + ‘"‘); addLineBreak(postData); //writeStringToByteArray(postData, CONTENT_TYPE_JPEG); postData.writeUTFBytes(CONTENT_TYPE_JPEG); addLineBreak(postData); //writeStringToByteArray(postData,CONTENT_TRANSFER_ENCODING); //postData.writeUTFBytes(CONTENT_TRANSFER_ENCODING); //addLineBreak(postData); addLineBreak(postData); postData.writeBytes(imgData, 0, imgData.length); addLineBreak(postData); boundaryPostData(postData, boundary); addDoubleDash(postData); trace(postData.toString()); postData.position=0; return postData; } private function boundaryPostData(data:ByteArray, boundary:String):void { var len:int=boundary.length; addDoubleDash(data); for (var i:int=0; i < len; ++i) { data.writeByte(boundary.charCodeAt(i)); } } private function addDoubleDash(data:ByteArray):void { data.writeShort(0x2d2d); } private function addLineBreak(data:ByteArray):void { data.writeShort(0x0d0a); } private function signRequest(requestMethod:String, url:String, requestParams:Object, useHead:Boolean=false):URLRequest { var method:String=requestMethod.toUpperCase(); var oauthParams:Object=getOAuthParams(); var params:Object=new Object; for (var key:String in oauthParams) { params[key]=oauthParams[key]; } for (var key1:String in requestParams) { params[key1]=requestParams[key1]; } var req:URLRequest=new URLRequest(); req.method=method; req.url=url; var paramsStr:String=makeSignableParamStr(params); var msgStr:String=StringEncoders.urlEncodeUtf8String(requestMethod.toUpperCase()) + "&"; msgStr+=StringEncoders.urlEncodeUtf8String(url); msgStr+="&"; msgStr+=StringEncoders.urlEncodeUtf8String(paramsStr); var secrectStr:String=_consumerSecret + "&"; if (_accessTokenSecret.length > 0 && _accessTokenKey.length > 0) { secrectStr+=_accessTokenSecret; } var sig:String=Base64.encode(HMAC.hash(secrectStr, msgStr, SHA1)); // The matchers are specified in OAuth only. sig = sig.replace(/\+/g, "%2B"); oauthParams["oauth_signature"]=sig; trace("BaseString:::::", msgStr); trace("signature::::", sig); if (method == URLRequestMethod.GET) { if (useHead) { req.url+=("?" + makeSignableParamStr(requestParams)); req.requestHeaders.push(makeOauthHeaderFromArray(oauthParams)); } else { req.url+=("?" + paramsStr + ‘&oauth_signature=‘ + sig); } } else if (requestMethod == URLRequestMethod.POST) { req.requestHeaders.push(makeOauthHeaderFromArray(oauthParams)); } return req; } private function makeSignableParamStr(params:Object):String { var retParams:Array=[]; for (var param:String in params) { if (param != "oauth_signature") { retParams.push(param + "=" + StringEncoders.urlEncodeUtf8String(params[param].toString())); //retParams.push(param + "=" +params[param].toString()); } } retParams.sort(); return retParams.join("&"); } private function makeParamsToUrlString(params:Object):String { var retParams:Array=[]; for (var param:String in params) { retParams.push(param + "=" + params[param].toString()); } retParams.sort(); return retParams.join("&"); } private function makeOauthHeaderFromArray(params:Object):URLRequestHeader { var oauthHeaderValue:String=‘OAuth realm="‘ + API_BASE_URL + ‘",‘; var parseParams:Array=[]; for (var key:String in params) { parseParams.push(key + ‘="‘ + params[key] + ‘"‘); } oauthHeaderValue+=parseParams.join(","); var reqHeader:URLRequestHeader=new URLRequestHeader("Authorization", oauthHeaderValue); return reqHeader; } private function getOAuthParams():Object { var params:Object=new Object; var now:Date=new Date(); params["oauth_consumer_key"]=_consumerKey; if (_accessTokenKey.length > 0) { params["oauth_token"]=_accessTokenKey; } if ( _pin && _pin.length > 0 ) { params["oauth_verifier"] = _pin; } params["oauth_signature_method"]="HMAC-SHA1"; params["oauth_timestamp"]=now.time.toString().substr(0, 10); params["oauth_nonce"]=GUID.createGUID(); params["oauth_version"]="1.0"; params["oauth_callback"]="oob"; return params; } private function oauthLoader_onComplete(event:Event):void { trace(oauthLoader.data); var needRequestAuthorize:Boolean=_accessTokenKey.length == 0; var result:String=oauthLoader.data as String; if (result.length > 0) { var urlVar:URLVariables=new URLVariables(oauthLoader.data); _accessTokenKey=urlVar.oauth_token; _accessTokenSecret=urlVar.oauth_token_secret; if (needRequestAuthorize) { requestAuthorize(); needRequestAuthorize=false; } else { var e:MicroBlogEvent=new MicroBlogEvent(MicroBlogEvent.OAUTH_CERTIFICATE_RESULT); e.result={oauthTokenKey: _accessTokenKey, oauthTokenSecrect: _accessTokenSecret}; dispatchEvent(e); verifyCredentials(); } } } private function oauthLoader_onError(event:IOErrorEvent):void { //var urlData:URLVariables = new URLVariables(oauthLoader.data); var e:MicroBlogErrorEvent = new MicroBlogErrorEvent(MicroBlogErrorEvent.OAUTH_CERTIFICATE_ERROR); e.message = oauthLoader.data; dispatchEvent(e); } private function oauthLoader_onSecurityError(event:SecurityErrorEvent):void { dispatchEvent(event); } private function requestAuthorize():void { var url:String=OAUTH_AUTHORIZE_REQUEST_URL; url+="?oauth_token=" + StringEncoders.urlEncodeUtf8String(_accessTokenKey); url+="&oauth_callback=oob"; navigateToURL(new URLRequest(url)); } } }
时间: 2024-10-22 16:03:05