這個禮拜初,最後總算弄好標記閱讀(Mark Read)後,Google Reader App總算也完成了。不過由於接下來可能會把一些時間拿去研究iOS。最後決定把這部份的研究做一個總整理。這一篇文章會包括以下的技術:
-
Google API 在Windows Phone 7.1上面的相關使用
-
對於Google Reader API的JSON的相關使用
-
一些簡單的Windows Phone原始碼(source code)的討論
關於RSS Reader App:
首先我想在這裡先稍微整理一下,一個簡單的RSS Reader的Windows Phone APP是相當簡單的。其實只要會簡單的Webclient加上去使用內建的資料格式就可以完成,這裡微軟也提供完整的原始碼與介紹。本篇介紹的部分主要都是專注在Google Reader的部分。
Google Reader API:
由於我是在Windows Phone上面做開發(Windows Phone 7.1)所以無法直接使用Google Data上面的相關API,在這裡也要特別解釋,如果你只是WPF或是一般Windows程式~ 你可以直接使用Google Data而不需要一步步的完成Google Reader API的部分,在這裡把之前文章列過的Google Reader API整理一次:
一個簡單Google Reader APP的流程:
接下來我會用碼個Google Reader 會使用到的流程來介紹該如何去撰寫,首先一個Google Reader APP會有以細的流程:
-
登入,也就是登入你的Google Reader 帳號
-
取得登入者的相關資訊
-
瀏覽全部尚未閱讀的列表
-
打開某個標籤(Label)內去看裡面還沒閱讀的文章
-
打開該文章網站並且將其標記已經閱讀(mark as read)
接下來我會針對以下的部分,開始整理一些原始碼:
1. 登入,也就是登入你的Google Reader 帳號
在這裡會使用到基本的Google 登入部分,你可以直接在你的瀏覽器上頭打入以下的鏈結。
> > [https://www.google.com/reader/api/0/token?ck=212121212&client=scroll](https://www.google.com/reader/api/0/token?ck=212121212&client=scroll) > >
稍微解釋一下參數:
> > ck: 就是時間標記(timestamp),你可以用DateTime.Now.Ticks.ToString()拿到 > > > > client:先填入scroll的方式 > >
如果你已經登入過的話,一樣會有一樣的結果
public void LoginGoogleReader()
{
string email = "YOUR_EMAIL";
string passwd = "YOUR_PASSWORD";
string auth_params = string.Format("https://www.google.com/accounts/ClientLogin?accountType=HOSTED_OR_GOOGLE&Email=" + email + "&Passwd=" + passwd + "&service=reader&source=J-MyReader-1.0");
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(auth_params);
<font color="#ff0000"> httpRequest.Method = "POST";</font>
RequestState myRequestState = new RequestState();
myRequestState.request = httpRequest;
IAsyncResult result =
(IAsyncResult)httpRequest.BeginGetResponse(new AsyncCallback(AuthRespCallback), myRequestState);
}
但是你也需要去把登入回來的SID與AuthID去parse出來,以下提供相關方法:
private void ParseLogin(string responseString)
{
string[] arrs = responseString.Split('n');
foreach (string arr in arrs)
{
//Such as follows, but we only need Auth and SID
//SID=DQAAALcAAACH5nzd2xVxumGUJGjoTT9DblBfAuI1Sj-6Evtu_91q8Fkbis_S1qv66-vatdUe9HMqqELN3AijrD-CiQyzqJtr_XgTtJIDnfDeVmoGjtsSpkyIB4sES5slrOkTvRJd67dG0tlwTih8btejcPqAVYCJMD6f-a-x3PHa2JQ-Ehsh-rtjNzW6y7Riqosyawffvg4DPbtvUJFsIsum8d32EQ_XuxmUM7NFuhwW5OG8aw3lLO_jO0fLaznl7n5DfCC61KSAn
//LSID=DQAAALkAAAAAeAUiJHtt2vL41E3bfMAJwE_waG3qEtAgEsv-Il0xXznDCdm-Z_jQZ4Log9DbGqTMd1-t08udWBJWeQ9VDG0uOC4H5nB0zJ_WGv1E17v3EVeveemKvpu9eN2YBkQlr6hMtZlZWyAb5w0uwAx6kPdXnnuuYC4o0RHv2em0CrOAFzpNYZvLOhuB_veFZ9bsnPy6GP0_HHQGe2o3dJsoJK_DKyq85QteslDzcQySldfwNGUy46Q4HLKhZZPDrjnO_eUn
//Auth=DQAAALgAAAAAeAUiJHtt2vL41E3bfMAJta7kSZRtYIzGfm8uJU_jVFjmIFbYYL9WaLS7Xj3xqdwLOrzrBipqL8ItZks4Hf71NY2yTyZnAIG5ysrlA9kCcoZGDDqo3ib9avvgC4pPwXB2uQ3rBYt0gqYs28DkEX6fDD4S3j_NwBESynhOUhcTKqhN3pYX1VfH6uU4285yV7O3w7NKfF8kkTOEFl5toztOwnA4JWnbC5Rjb_gMXKmKnzayTMevgO_XfGWqqNa8x5Mn" string
string[] tmp = arr.Split('=');
if (tmp[0] == "Auth")
{
UserAuth = tmp[1];
}
else if (tmp[0] == "SID")
{
UserSid = tmp[1];
}
}
}
記得把UserAuth與UserSid要儲存下來,之後每一個動作都需要。
2. 取得登入者的相關資訊
登入以後我們需要去取得使用者的ID,這樣主要也是給我們去找尋標籤(Label)或是做一些使用者的相關功能來使用。
如同之前一樣,你也可以在你的瀏覽器上面打入以下的鏈結來看結果:
> > [https://www.google.com/reader/api/0/user-info?format=json&ck=121212122&client=scroll](https://www.google.com/reader/api/0/user-info?format=json&ck=121212122&client=scroll) > >
這裡多了一個參數,也就是JSON的輸出格式
> > format: 如果不是寫joson會傳回XML資料 > >
你打出來的使用者資訊應該會像以下的資料一樣:
{
"userId":"XXX",
"userName":"XXX",
"userProfileId":"XXX",
"userEmail":"[email protected]",
"isBloggerUser":true,
"signupTimeSec":1188451343,
"publicUserName":"XXX",
"isMultiLoginEnabled":true
}
而我們需要的也只有userProfileId,接下來先給大家如何去抓取ID的程式碼:
public void GetUserInformation()
{
string auth_params = string.Format("https://www.google.com/reader/api/0/user-info?format=joson&ck=" + DateTime.Now.Ticks.ToString() + "&client=scroll");
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(auth_params);
httpRequest.Method = "GET";
httpRequest.Headers["Authorization"] = "GoogleLogin auth=" + UserAuth;
httpRequest.Headers["Cookie"] = "SID=" + UserSid;
httpRequest.BeginGetResponse(new AsyncCallback(ResponseCallbackInner), httpRequest);
}
在這裡會使用到之前抓的兩個參數UserAuth以及UserSid記得要填到Header之內不然都會得到error 400。
如果正確的拿到資料的話,我也提供利用JSON來抓取資料的方式。
public class ServerUserInfo //JSON
{
public string userId { get; set; }
public string userName { get; set; }
public string userProfileId { get; set; }
public string userEmail { get; set; }
public string isBloggerUser { get; set; }
public string signupTimeSec { get; set; }
public string publicUserName { get; set; }
public string isMultiLoginEnabled { get; set; }
}
private void ParseUserInfo(string responseString)
{
UserInfoClass = JsonConvert.DeserializeObject<ServerUserInfo>(responseString);
staUserID = UserInfoClass.userId;
}
看到了嗎?這就是JSON神奇的地方,你只要一行程式碼就可以去把所有資料提到你的資料UserInfoClass(是class ServerUserInfo 產生的)中。
先寫到這個部分,接下來就是瀏覽標籤(Label)與找到文章內容的部分…