利用MS FaceBook SDK開發WinForm FaceBook應用程式(二)

前面提到,透過FaceBook來開發應用程式需要進行申請以及下載需要的SDK。[先前的文章]

當您完成了這些動作之後,要在WinForm模式下開發一個FaceBook應用程式相對就簡單很多了。請先在專案中引用先前我們下載的.dll檔案,若您要開發的是WinForm的FaceBook應用程式,需要引用的檔案有:
1.Facebook.dll
2.Facebook.Winforms.dll

正確的引用之後,您就可以在WinForm應用程式中順利的使用FaceBook API了。

由於您開發的是WinForm的FaceBook應用程式,因此在預設的狀況下,使用您應用程式的用戶當然還沒登入FaceBook(請注意,開啟瀏覽器登入和開啟你撰寫的應用程式透過API登入FaceBook是兩回事),因此您撰寫的FaceBook,第一件事情應該就是透過FaceBook API與FaceBook Server聯繫並協助使用主登入FaceBook。

要進行這樣的動作很簡單,只需要透過底下的程式碼即可完成:

facebookService1.ApplicationKey = "你的ApplicationKey";
facebookService1.ConnectToFacebook();

facebookService1是一個元件,請先從工具箱中拖曳出這個元件到表單上:

你會發現它被置於Component Tray,緊接著,就可在專案中撰寫上面的程式碼了。

上面那段程式碼能夠讓你的應用成是建立起與FaceBook Server之間的connection,並且自動跳出底下的視窗,透過這個視窗就能夠讓使用者登入FaceBook(請注意,這個視窗並非是我們應用程式設計的,而是FaceBook網站提供的,透過上面的API呼叫,我們可以在自己的程式中跳出這個由FaceBook Server提供的登入視窗,讓使用者登入):

使用者成功登入後,上面這個視窗會消失,然後就自動跳回我們開發的WinForm Application了。
到這邊,我們已經成功地連線上了FaceBook Server(這表示我們可以自由的呼叫FaceBook API),並且讓使用者順利地登入完成(這表示我們可以透過API取得該使用者的資料了)。

接著,我們來看看如何透過FaceBook API取得用戶的朋友資料,我們先看程式碼,相當簡單只有底下幾行:

//用來儲存抓取到的朋友資料
IList users;
//透過facebookService1取得朋友, Users是朋友資訊的集合物件
users= facebookService1.Friends.GetUserObjects();
//可以把資料直接填入dataGridView
this.dataGridView1.DataSource = users.ToArray();
//也可以透過迴圈列出,或是填入ListBox
foreach (Facebook.Schema.user item in users)
{
this.listBox1.Items.Add(item.name);
}

facebookService1是我們先前拖曳到表單上的Component,透過這個元件我們可以輕易的取得使用者的朋友清單,而朋友清單是以『IList』的集合物件形式回傳(這就是使用MS FaceBook SDK的好處,不然光Parsing XML就很累人了),我們可以直接在程式碼中使用了,你會看到上面的程式碼直接把Users填入dataGridView1的DataSource屬性中。
由於是一個集合物件,我們也可以透過Linq語法查詢,相當有趣:

//在所有朋友清單中,找到特定名稱的朋友
var user = from c in users where c.name == this.listBox1.SelectedItem.ToString() select c;

留言

匿名表示…
請問老師:
按照你的步驟使用這個 api ,
當我要抓取相片與相簿,偕無法達成,
這是了 Lib
IList oAlbums = _FacebookService.Photos.GetAlbums(_FacebookService.uid, new List(){sAlbumID});

也參考了網路上的寫法,依然無法成功,甚至會出現 "Could not deserialize data returned from server" 的錯誤,謝謝指導。
David寫道…
根據你提供的訊息,估計很可能是因為FaceBook的API改版後,你用的是舊版的SDK!!!

FaceBook前陣子亂改版害慘了不少人,建議你下載最新版的SDK試試看。
匿名表示…
請問david大師:
如何能發訊息給我的朋友,是否可以提供一些方法!感謝!! meail:michael_tw@live.com
David表示…
可以先參考這個範例:
http://codestorage.ria101.com.tw/CodeStorageRIAUser.html?CodeUid=84
有類似的功能
匿名表示…
那個檔案解壓縮就有錯誤訊息哦!

執行時 輸出視窗顯示

D:\Download\塗鴉牆\Silverlight FaceBook發佈訊息範例\SilverlightApplication10\SilverlightApplication10.csproj : error : 無法讀取專案檔 'SilverlightApplication10.csproj'。
D:\Download\塗鴉牆\Silverlight FaceBook發佈訊息範例\SilverlightApplication10\SilverlightApplication10.csproj(106,3): 找不到匯入的專案 "C:\Program Files\MSBuild\Microsoft\Silverlight\v4.0\Microsoft.Silverlight.CSharp.targets"。請確認 宣告中的路徑正確,而且檔案存在於磁碟上。
David表示…
to 匿名,

我用7z重新壓縮一次,請試試看用底下這個網址下載,如果還是不行請通知我。謝謝。
http://codestorage.ria101.com.tw/CodeStorageRIAUser.html?CodeUid=143
匿名表示…
david大師 :

您的範例我測試過了! 沒有問題!

但是我需的是發佈到"我的朋友"的私密留言或塗鴉牆上的訊息! 不知道是否能夠提供這方面的資訊! 再次感謝!
David表示…
其實作法差不多,但範例還沒寫,要等我一下...^_^
匿名表示…
to david大師:

看來真的是有點難度的! 尤其是winform的話! 可能更難! 因為我試過很多屬性跟方法, 大多都回傳錯誤訊息! 不是不支援此方法、就是好像甚麼權限問題等等!他的API文件也沒有明確的說明,但是要連訊息都不能發給朋友,好像沒甚麼用處。

所以若是可以的話,還請david大師研究一下
David表示…
to 匿名,
其實應該不會喔,我反而覺得WinForm稍為簡單一些, 只需要把範例中
facebookService1.Stream.Publish(
最後一個參數帶入發送訊息對象的 uid 即可。
如果你碰到 "A session key must be specified when request is signed with a session secret" 的訊息,
則記得要填入一下SessionKey
匿名表示…
To Da vavid 大師:

請問要在哪裡填入 SessionKey
SessionKey又是如何取得

我一開始 facebookService1.ConnectToFacebook(new List() { Enums.ExtendedPermissions.read_stream, Enums.ExtendedPermissions.publish_stream });
的時候 SessionKey的屬性就有值了
Publish的參數裡面也沒有填入的地方呢
Michael.
匿名表示…
請問要如何用vb.net寫呢,為什麼我編譯時說無法載入檔案或阻件
匿名表示…
請問董大師:
還沒有辦法幫我解決嗎??
Michal.
Unknown寫道…
我個人試出的結果->
Stream.Publish("測試訊息", attachment物件, ActLink物件,x, y);
重點在於最後一個參數y,函式提示只是寫uid,所以我一開始試填上我自己的UID,但是後來看過很多討論文章跟我自己測試結果,如果這一欄填上自己的UID或是其他人的,就會產生"A session key must be specified when request is signed with a session secret"的錯誤訊息,後來改成填0,訊息就可以順利發送出去了,而參數x是填要把訊息丟到某個人的塗鴉牆上,x就是某人的UID,如果是要發到自己的牆上,可以直接填null
匿名表示…
To ShenYu 大大:

那請教一下 如果要發私密訊息的話 要用哪個方法跟參數 感恩!

Michael.
匿名表示…
您好
我在執行「facebookService1.ConnectToFacebook();」這行程式碼時出現了以下例外狀況:
「指定的索引鍵不在字典中。」

請問這該怎麼處理呢?
謝謝

-雙

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

精彩(且驚人)的Semantic Kernel入門範例

使用Semantic Kernel 建立自然語言請假系統

在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統

專業的價值...