新浪微博信息站外同步的完整實現


最近遇到一個項目,其中需要將用戶的微博信息與自己的網站項目上同步,好在新浪微博是提供了API的,大概查閱了一下,信息同步需要調用的是https://api.weibo.com/2/statuses/user_timeline.json,需要驗證用戶登錄,返回的是JSON格式的數據。

在關於授權機制說明中,新浪微博的API一共有兩種驗證機制,分別是:OAuth和Basic Auth,OAuth沒有細看,不去管他,在Basic Auth授權介紹部分提到了cnblogs上的一篇文章, http://www.cnblogs.com/QLeelulu/archive/2009/11/22/1607898.html,這篇文章給出了在asp.net中如何去以GET方式提交一個http請求,並給出返回內容的代碼,順着這篇文章又找到了另一篇博客園團隊的文章:http://www.cnblogs.com/cmt/archive/2010/05/13/1733904.html,這篇文章實現了站外發送微博的功能。結合這兩篇文章,實現了新浪微博同步的功能。

下面介紹實現微博同步的步驟:

1.首先為了實現http請求,需要引入using System.Net;命名空間,同時后面在轉換字符集部分及取得返回內容部分,需要另外兩個命名空間:using System.Text;和using System.IO;

接下來就可以開始編寫代碼實現取得json數據了。

(1)准備用戶驗證數據

string usernamePassword = username + ":" + password;

username是你的微博登錄用戶名,password是你的博客密碼。

(2)准備API的URL,URL中的參數直接以GET方式附在URL中,剛開始博客園的文章沒有細看,直接貼過來代碼,把參數附加在data中,總是返回400錯誤,后來查了一下msdn,發現HttpWebRequest的默認請求方式就是GET,再者既然是GET方式,應該就是以URL來傳遞參數的。

string url = "https://api.weibo.com/2/statuses/user_timeline.json?source="+apikey+"&count="+count+"";

上面的apikey是做為新浪微博用戶的開發者申請的,應該是唯一的,博客園的文章中說需要發一封郵件審核,我沒有發郵件,直接申請,也得到了一個APIKEY,信息也可以同步,只不過當在站外發送微博信息時,在來源部分會是:未審核應用。后面還有uid和screen_name 等參數,具體的參數API文檔都有說明。

(3)組織代碼實現HttpWebRequest請求

WebRequest webRequest = System.Net.WebRequest.Create(url);
HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest;

CredentialCache mycache = new CredentialCache();
mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
myReq.Credentials = mycache;
//驗證用戶授權機制
myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

(4)取得返回內容,其中用到了Stream類。

WebResponse wr = myReq.GetResponse();
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();


上面的content即為取得的微博信息的json格式的內容,到此為止,已經實現了如何獲得微博內容的功能。接下來的部分就是如何格式化json內容,以相應的形式顯示在網頁中。

2.在asp.net中格式化json數據。

取得json數據后,到網上搜了一下,大多都是介紹如何在javascript中去以鍵值形式讀取的,本人對javascript比較畏懼。其中有兩篇文章是以類的形式實現了如何在asp.net中讀取json數據,沒有去實踐。后來在一篇文章中發現Jayrock.Json,使用起來比較簡單,同時有一篇word的使用說明文檔。下面的代碼實現是基於Jayrock.Json實現的。Jayrock.Json中基本是以JsonArray和JsonObject的轉換來實現以鍵值方式讀取json數據,我是將取得的數據放入DataTable中,后來想想這樣也有好處,前台的UI可以隨意設計,最終綁定到DataTabel即可。

下面是格式化Json數據並實現DataTable的代碼。

JsonReader jsonRead = new JsonTextReader(new StringReader(content));
JsonObject jsonobj = new JsonObject();
jsonobj.Import(jsonRead);

JsonArray wiboArr = jsonobj["statuses"] as JsonArray;

DataTable wibo = new DataTable();
wibo.Columns.Add("id", typeof(Int64));
wibo.Columns.Add("screen_name", typeof(string));
wibo.Columns.Add("profile_image_url", typeof(string));
wibo.Columns.Add("text", typeof(string));
wibo.Columns.Add("source", typeof(string));
wibo.Columns.Add("created_at", typeof(DateTime));

foreach (JsonObject wibolist in wiboArr)
{
DataRow dr = wibo.NewRow();
dr["id"] = Convert.ToInt64(wibolist["id"]);
JsonObject user = wibolist["user"] as JsonObject;
dr["screen_name"] = user["screen_name"].ToString();
dr["profile_image_url"] = user["profile_image_url"].ToString();
dr["text"] = wibolist["text"].ToString();
dr["source"] = wibolist["source"].ToString();
dr["created_at"] = DateTime.ParseExact(wibolist["created_at"].ToString(), "ddd MMM dd HH:mm:ss K yyyy", new System.Globalization.CultureInfo("en-GB"));
wibo.Rows.Add(dr);
}

通過上面的兩大步驟,實現了取得微博信息,並將其放入DataTable中的功能。

后記:新浪微博的創建時間格式是:Tue May 31 17:46:55 +0800 2011,網上也沒找到相關資料,開始的時候是自己專門編寫了兩個函數用來解析這個時間字符串,后來csdn上的一個朋友dalmeeme以一行代碼的形式(DateTime自帶的一個方法)就實現了,在此一並感謝!


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM