[.NET] dotFB : Facebook Graph API Client Library for .NET

這是筆者在 Plurk.net 開放原始碼專案後的第二個 Codeplex 開放原始碼專案,它會直接利用 Facebook 的 Graph API 介面與 Facebook 溝通,並在使用者給予的適當授權下,在使用者的塗鴉牆上張貼訊息,張貼文章,建立活動,上傳相片等等。

這是筆者在 Plurk.net 開放原始碼專案後的第二個 Codeplex 開放原始碼專案,它會直接利用 Facebook 的 Graph API 介面與 Facebook 溝通,並在使用者給予的適當授權下,在使用者的塗鴉牆上張貼訊息,張貼文章,建立活動,上傳相片等等,可以說是在 Facebook Application 以外,Facebook 對外開放自由度較大的 API 介面了。

dotFB 的第一個版本以張貼資料與搜尋資料為準,共有下列物件:

image

其中比較重要的類別有:

  • FBConnect:負責處理登入與產生 Graph API 所需的 Access Token,若 FBConnect 找不到 Access Token 時,會彈出使用者授權的視窗要求登入與授權,若使用者未給予授權,則會輸出 User is cancelled the authorization 的例外。
  • 搜尋 Facebook 資料用的 Search 類別群 (FBGraphAPI.API 命名空間),包含 SearchWallPostController, SearchPageController, SearchGroupController 與 SearchEventController,分別是塗鴉牆,粉絲頁,社團與活動四種,而用戶的搜尋則封裝在 Search 類別中。
  • 張貼資料用的 PublishStream 類別,內含各種方法,以支援現有 Facebook Graph API 所開放的 Publishing 功能,但不同的張貼功能都要配合必要的 Facebook 延伸權限才可以使用,同時這些延伸權限都要取得使用者的授權。
  • 設定 Facebook Graph API 與封存 Access Token 的 FBGraphAPIConfiguration 以及位於 FBGraphAPI.Configuration 命名空間內的各式類別。

dotFB 類別庫的使用方法是:

1. 在 Facebook 開發人員中心 (http://www.facebook.com/developers) 中建立你的 Facebook 應用程式,以取得 Application ID。

2. 自 http://dotfb.codeplex.com 下載原始碼,並且編譯為 FBGraphAPI.dll,然後在要使用它的專案中加入參考。

3. 若參考 FBGraphAPI.dll 的專案沒有應用程式組態檔 (Windows AP 請使用 app.config,Web AP 則是 Web.config),請加入,並且在組態檔中加入 FBGraphAPI.Configuration.FBGraphAPIConfigurationSection 的引用,然後在組態檔中加入 FBGraphAPI 的組態資訊,例如:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="fb.graph.api.configuration" type="FBGraphAPI.Configuration.FBGraphAPIConfigurationSection, FBGraphAPI"/>
  </configSections>
  <fb.graph.api.configuration appid="" appkey=""
      fb.loginUrl="
https://graph.facebook.com/oauth/authorize?client_id={0}&amp;redirect_uri=http://www.facebook.com/connect/login_success.html&amp;type=user_agent&amp;display=popup"
      fb.loginUrl.apponly="https://graph.facebook.com/oauth/authorize?client_id={0}&amp;client_secret={1}&amp;redirect_uri=http://www.facebook.com/connect/login_success.html&amp;type=user_agent&amp;display=popup">
    <fb.graphAPI.requestPermission>
      <add permission="publish_stream" />
      <add permission="create_event" />
      <add permission="offline_access" />
      <add permission="publish_checkins" />
      <add permission="user_birthday" />
      <add permission="email" />
      <add permission="read_stream" />
    </fb.graphAPI.requestPermission>
    <fb.graphAPI.authorization>
      <add token="[Token]" expires="[Expire Date]" />

    </fb.graphAPI.authorization>
  </fb.graph.api.configuration>
</configuration>

 

  • appid 為你在第一步所建立的 Facebook Application 的 Application ID,這是必要項。
  • appkey 為你在第一步所建立的 Facebook Application 的 Application Key,這是選擇項,若你要使用 Application-Only 驗證時,這個項目就是必要的,但目前 v0.1 尚未支援此功能。
  • fb.loginUrl 與 fb.loginUrl.apponly 為 Facebook Graph API 登入時的 URL,為必要項。
  • fb.graphAPI.requestPermission 為登入時向使用者要求的延伸認證權限,權限的列表可以在 Facebook Authentication 的文件中找到。
  • fb.graphAPI.authorization 是保存快取的 Access Token 之用,Windows 應用程式此部份可以不用加入,但 Web 應用程式要自行手動輸入 Access Token,若是有要求 offline_access 的延伸權限的話,Expire Date 可設為 9999-12-31 23:59:59。

 

4. 在呼叫存取 Facebook 的存取功能前,先使用 FBConnect 物件檢查 Access Token,並取得授權,然後呼叫 FBConnect.InitializeProfile() 建立使用者的資訊,同時若使用非同步的通訊時,可註冊 Event Sink 來取得存取的狀態訊息。Windows 應用程式可以額外呼叫 ConfigurationManager.RefreshSection() 來取得被 FBGraphAPI 更新過的組態檔內容。

// verify login.
FBGraphAPI.FBConnect connect = new FBGraphAPI.FBConnect();
connect.VerifyConnection();
connect.InitializeProfile();
connect.RegisterEventSink(
    (sender, e) =>
    {
        Console.WriteLine("custom event - state: {0}", e.EventData);
    },
    (sender, e) =>
    {
        if (e.isCompleted)
        {
            Console.WriteLine("Action Completed.");
        }
        else
        {
            Console.WriteLine("Action failed.");

            if (e.LastException is FBGraphAPI.FBGraphAPIException)
            {
                Console.WriteLine("type: {0}", (e.LastException as FBGraphAPI.FBGraphAPIException).Type);
                Console.WriteLine("message: {0}", (e.LastException as FBGraphAPI.FBGraphAPIException).Message);
            }
            else
            {
                Console.WriteLine("message: {0}", e.LastException.Message);
                Console.WriteLine("stack trace: {0}", e.LastException.StackTrace);
            }
        }
    });

ConfigurationManager.RefreshSection(FBGraphAPI.Configuration.FBGraphAPIConfigurationSection.Path);

 

但若專案是 Web 應用程式,請呼叫 FBConnect.VerifyConnectionForWebClient(),並傳入組態區的路徑,以讓 FBGraphAPI 取得必要的組態資訊。

5. 當 Access Token 建立後,就可以呼叫各式的存取 API 了,例如:

// 上傳相片到 Facebook
FileStream fs = new FileStream("Windows Azure Architecture.png", FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fs);
byte[] data = reader.ReadBytes((int)fs.Length);
reader.Close();

FBGraphAPI.API.PublishStream.UploadPhoto("Post from Facebook Graph API client.", Path.GetFileName(fs.Name), "image/png", data);

// 發布塗鴉牆訊息
FBGraphAPI.API.PublishStream.PostMessage("Test", "1", "
http://plurkdotnet.codeplex.com/", "1", "1", "1", "1");
// 發布文章
FBGraphAPI.API.PublishStream.PostNote("test subject", "test message content");
// 分享連結
FBGraphAPI.API.PublishStream.PostLink("", "
http://tw.yahoo.com");
// 建立活動
FBGraphAPI.API.PublishStream.PostEvent("My Test Event", new DateTime(2010, 12, 31, 19, 00, 00), new DateTime(2011, 1, 1, 1, 0, 0));

// 搜尋活動。
FBGraphAPI.API.SearchEventController controller = new FBGraphAPI.API.SearchEventController();

if (controller.Load("中油"))
{
    do
    {
        foreach (FBGraphAPI.API.Event page in controller.LastResult)
        {
            Console.WriteLine("id: {0}, name: {1}", page.ID, page.Name);
        }
    }
    while (controller.GoNextPage());
}

 

另外為了協助 Web 應用程式的開發人員取得 Facebook 的 Access Token,在 dotFB 中也提供了一支工具程式:FBGraphAPIAccessTokenGenerator.exe,並傳入 Facebook 的 Application ID,它會傳回使用者的 Access Token,若使用者尚未授權時,也會彈出授權視窗要求使用者授權。

Source: http://dotfb.codeplex.com (本軟體元件的授權是 MIT License)