基于开放平台的政务微博管理系统的设计与实现(2)——系统开发实例

政务微博,微博管理系统,微博开放平台,Web系统开发

前面提到针对腾讯微博JSON数据的处理类,同理我们也可以针对新浪微博的数据构造相应的处理类,由于对数据处理方式的不同,这里的类的写法也略有不同。新浪微博给出的字段命名与腾讯不同,但主体信息是基本一致的,具体的字段含义可参考新浪微博开放平台中的字段说明。新浪微博提供的信息也是基于JSON数据的方式,给开发者提供了处理上的便捷。对于腾讯的数据,我们采用的是JsonMapper类进行的处理,而对于新浪的数据,我们则采用的是另外的一种映射的处理方式。以下是部分代码:

public class WeiBo_SN_Status{
        public WeiBo_SN_Status()
        { }
        public string idstr { set; get; }
        public long id { set; get; }
        public string created_at { set; get; }
        public string text { set; get; }
        public string source { set; get; }
        public bool favorited { set; get; }
        public bool truncated { set; get; }
        public string in_reply_to_status_id { set; get; }
        public string in_reply_to_user_id { set; get; }
        public string in_reply_to_screen_name { set; get; }
        public long mid { set; get; }
        public string thumbnail_pic { set; get; }
        public string bmiddle_pic { set; get; }
        public string original_pic { set; get; }
        public int reposts_count { set; get; }
        public int comments_count { set; get; }
        public object annotations { set; get; }
        public object geo { set; get; }
        public WeiBo_SN_User user { set; get; }
        public WeiBo_SN_Status retweeted_status { set; get; }
    }

这里对于微博用户User,微博状态Status等采取了对象化的处理方式。当信息对象建立后,下面就是处理数据交互了,需要分别调用相应平台的SDK,针对腾讯和新浪的微博时间线数据的调用代码分别如下:

public static WeiBoSite.Model.WeiBo_T_Data Q_broadcast_timeline(int pageflag, int pagetime, int reqnum, Int64 lastid)
        {
            QWeiboSDK.statuses obj = new QWeiboSDK.statuses(Q_GetOauthKey(), "json");
            string str = obj.broadcast_timeline(pageflag, pagetime, reqnum, lastid);
            if ((int)JsonMapper.ToObject(str)["ret"] == 0)
            {
                JsonData js = JsonMapper.ToObject(str);
                if (js["data"] != null)
                    return new WeiBoSite.Model.WeiBo_T_Data(js["data"]);
            }
            return null;
        }
public static WeiBoSite.Model.WeiBo_SN_Status_List SN_user_timeline(long uid, string screen_name, long since_id, 
long max_id, int count, int page, int base_app, int feature, int trim_user)
        {
            try
            {
                SNWeiboSDK.statuses obj = new SNWeiboSDK.statuses();
                UTF8Encoding utf8 = new UTF8Encoding();
                string str = obj.user_timeline(SN_GetOauthKey(), uid, screen_name, since_id, max_id, count, page,
 base_app, feature, trim_user);
                return ParseJson<WeiBoSite.Model.WeiBo_SN_Status_List>(str);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

以上代码分别调用各自的SDK接口接收JSON数据,经解析后生成相应的数据对象,可供后续程序进行模块化处理。以上接口的调用均需要使用到微博开放平台AppKey及AppSecret等数据,由于该帐户数据一旦确定,在系统的使用过程中用户层面基本将不会涉及,所以我们将各微博账户的信息存储在系统的配置文件中而不是数据库中。后面我们是通过调用以上函数接收数据,再通过微博基本数据对象转换后存储在数据库中。

下一步的工作就是将存储在数据库中的微博信息数据在前台呈现出来,尽管数据来自不同的微博平台,但是所有数据的主体信息是基本一致的,存储在数据库中的数据的字段也是一致的。因此,前台呈现的工作并不算困难,这里唯一需要注意的是需要对回复信息、引用信息、图片及视频信息等进行单独处理,我们这里采用的是绑定到Repeater控件后,在数据绑定事件中进行处理。

前台仿腾讯微博的呈现界面,代码如下:

<WBControl:Repeater ID="rptWeiBoInfo" runat="server" onload="WeiBo_T_Data_Info_Keyword_List_DataBind" 
OnItemDataBound="rptWeiBoInfo_ItemDataBound" Where='<%#this.pwhere %>' PageSize='<%#this.pagesize %>' 
PageIndex='<%#this.page %>'>
                <ItemTemplate>
                <li id="<%#Eval("Id")%>">
    <div class="pubDate" style="display:none;">
        <span class="pDate">
            <%#Utils.GetRealTime(Eval("Timestamp").ToString()).ToString("yyyy-MM-dd") %>
        </span>
    </div>
    <div class="userPic"><a href="http://t.qq.com/<%#Eval("Name")%
>" title="<%#Eval("Name")%>"><img src="<%#Utils.GetHeadImg(Eval("head").ToString().Trim())%>"/></a></div>
    <div class="msgBox">
        <div class="userName">
            <strong>
                <a href="http://t.qq.com/<%#Eval("Name")%>" title="<%#Eval("Name")%>(@<%#Eval("Name")%>)">
<%#Eval("nick")%></a>
            </strong>
            <%#Utils.GetTweetType(Convert.ToInt32(Eval("Type")))%>:
        </div>
        <div class="msgCnt">
           <%#Eval("Origtext")%>
           <asp:Literal ID="txtImgList" runat="server"></asp:Literal>
        </div>
        <asp:Literal ID="txtSource" runat="server"></asp:Literal>
        <div class="pubInfo">
            <span class="left">
                <a class="time" target="_blank" href='http://t.qq.com/p/t/<%#Eval("Id")%>'>
<%#Utils.GetRealTime(Eval("Timestamp").ToString()).ToString("yyyy-MM-dd")%></a>
                <a href="http://t.qq.com" class="f" target="_blank">来自<%#Eval("From")%></a>
                <a href='http://t.qq.com/p/t/<%#Eval("Id")%>' target="_blank" class="zfNum2" 
title="<%#Eval("Name")%> 转播后引发的转播次数">该条转播(<b class="relayNum"><%#Eval("Count")%></b>)</a>
            </span>
            <div class="funBox">
                <a href="http://t.qq.com/p/t/<%#Eval("Id")%>" class="relay">转播</a>
                <span>|</span>
                <a href="http://t.qq.com/p/t/<%#Eval("Id")%>" class="comt">评论</a>
                <span>|</span>
                <div class="mFun">
                    <a href="http://t.qq.com/p/t/<%#Eval("Id")%>">更多<em class="btn_ldrop"></em></a>
                </div>
            </div>
        </div>
    </div>
</li></ItemTemplate>
</WBControl:Repeater>

请注意,这里没有对微博信息的类型(来源于新浪或腾讯)进行区分,也没有对相应的跳转链结进行区分。而仅仅只是展示仿腾讯界面的呈现,并且省略掉了样式设置CSS代码。实际应用中的呈现界面要相对复杂,因此以上代码仅作为示例。其相应的后台绑定代码如下:

protected void rptWeiBoInfo_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                string imgTag = "<img src=\"{0}/120\" />";
                string repText = "<div class=\"replyBox\"><div class=\"msgBox\"> <div class=\"msgCnt\"><strong>
<a href=\"http://t.qq.com/{0}\" title=\"{6}(@{0})\">{6}</a></strong>{1}$ImgList$</div> <div class=\"pubInfo\">
<span class=\"left\"><a class=\"time\" target=\"_blank\" href=\"http://t.qq.com/p/t/{2}\">{3}</a> 
<a href=\"http://t.qq.com\" class=\"f\" target=\"_blank\">来自{4}</a> 
<a class=\"zfNum\" href=\"http://t.qq.com/p/t/{2}\" target=\"_blank\">全部转播和评论(<b class=\"relayNum\">{5}</b>)
</a></span></div></div></div>";
                System.Data.DataRowView data = e.Item.DataItem as System.Data.DataRowView;
                if (data["image"].ToString().Trim()!= "")
                {
                    Literal txtImgList = e.Item.FindControl("txtImgList") as Literal;
                    string[] imgList = data["image"].ToString().Trim(new char[] { '[', ']' }).Split(new char[] { ',' });
                    foreach (string str in imgList)
                    {
                        if (str.Trim(new char[] { '"' }) != "")
                            txtImgList.Text += string.Format(imgTag, str.Trim(new char[] { '"' }));
                    }
                    if (txtImgList.Text != "")
                        txtImgList.Text = "<div class=\"picBox\">" + txtImgList.Text + "</div>";
                }
                if (Convert.ToInt32(data["type"].ToString()) != 1 && data["source"].ToString().Trim() != "")
                {
                    Literal txtSource = e.Item.FindControl("txtSource") as Literal;
                    WeiBoSite.Model.WeiBo_T_Data_Info_Source item = 
new WeiBoSite.Model.WeiBo_T_Data_Info_Source(LitJson.JsonMapper.ToObject(data["source"].ToString().Trim()));
                    string strSource = string.Format(repText, item.name, item.text, item.id,
Utils.GetRealTime(item.timestamp.ToString()).ToString("yyyy-MM-dd"), item.from, item.count, item.nick);
                    string strImgList = "";
                    if (item.image.Trim() != "")
                    {
                        string jsStr=item.image.Replace("\\\"","").Trim(new char[] { '"' });
                        string[] imgList = jsStr.Trim(new char[] { '[', ']' }).Split(new char[] { ',' });
                        foreach (string str in imgList)
                        {
                            if(str.Trim(new char[] { '"' })!="")
                                strImgList += string.Format(imgTag, str.Trim(new char[] { '"' }));
                        }
                        if(strImgList!="")
                            strImgList = "<div class=\"picBox\">" + strImgList + "</div>";
                    } 
                    strSource = strSource.Replace("$ImgList$", strImgList);
                    txtSource.Text = strSource;
                }
            }
        }

这样就基本上完成了微博系统的数据接收、存储、呈现等系列流程,以上代码的调试结果截图如下:

政务微博信息系统

以类似的方法,还可以开发相应的发送微博、回复、私信、搜索等一系列功能。

(注:本文为 [风影网络工作室] 原创文章,未经书面许可,严禁转载和复制本站的任何信息,违者必究)