Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

facebook desktop Apps 筆記 - 4

經過可以login,攞data後,就到了upload的部份了,其實在facebook經api upload 野都係一個Post request,也不是很難寫的,只要你知道你要的url就可以了,當然post唔同的東西就可能會有唔同的url了,詳細都係要睇番facebook api 的文件呢!

在這裡我就先用上api 入面的Post function 先create 一個相薄
注意post 係一個sync 的function 所以係會hold 住等facebook 個邊有feedback 才會繼續的, 所以會有一點個app好似hang 了的感覺呢, 所以如果係要做一些大型的upload, 就最後還是用上async 的function吧!

var albumDetails = new Dictionary<string, object>();
albumDetails.Add("name", album_name);
albumDetails.Add("description", album_desc);

// create the new photo album
dynamic fbResult = fb.Post("/me/albums", albumDetails);
// get the albumID for photo upload
albumID = fbResult.id;

由於facebook 的頁面好多也是由id 來access 的, 所以有了這個albumID, 就等於你已經可以存取該相簿內的東西了, 之後就可以把相upload 上去了

首先create 一個image 的object吧,用作存好相的資料
 var photoDetails = new Dictionary<string, object>();

FacebookMediaObject img = new FacebookMediaObject
{
    ContentType = "image/jpeg",
    FileName = pd.FileName
};
img.SetValue(File.ReadAllBytes(pd.PictureBox.ImageLocation));

photoDetails.Add("message", photo_desc);
photoDetails.Add("source", img);

之後就可以使用之前得到的ID 建立出相冊的url
string album_path = "/" + this._albumID + "/photos";

最後再使用post的function 把相片上傳就可以了, 當然因為上傳相片是一個比較大及花時間的動作, 這次就用上了async的method呢,就可以輕鬆地把相片上傳了 :)
_fb.PostAsync(album_path, photoDetails);

當然la, 使用上async的方法如果要回接你要的result是要自行加上action 的, 方法可以參考上一篇筆記


facebook desktop Apps 筆記 - 3

經過一番努力後,重温, 終於拿到facebook 的access token, 之後就可以利用到這個token 建立一個facebook client 的object 來進行我們需要的行動了...

首先我地需要用到這個access token 建立一個facebookclient的object
var fb = new FacebookClient(this.FacebookOAResult.AccessToken);

之後我們就可以使用api 所提供的不同function 來作出update/提取facebook 上的資料了, 下面的簡單的sample, 可以很容易地就能夠把你facebook 上的名字拿出來用
dynamic result = fb.Get("me");
this.lbl_welcome.Text = "Welcome!" + result.name + ",";

這個result 入面當然不止名字那麼少的資訊了, 它入面也會包含著很多不同有用的東西, 但就要慢慢地去找, 我自己就喜歡用debugger, set 定個break point 之後就可以慢慢咁睇下有乜可以用了...

當然除了這一種liner 的方法外(用get 佢一定會等你個request 返來先會繼續下一步), 仲可以用到batchasync的, 這種做法你是不用等個request個回來, 就得進行下一步動作的...
fb.BatchAsync(new[]{
new FacebookBatchParameter(HttpMethod.Get, "/me/albums")
});

上面的code 是會把你的photo album 拿來

當然由於是async 的方式,我們是需要加上一些action 才可以接回個result 的
fb.PostCompleted += (o, e) =>
{
if (e.Cancelled)
{
  var cancellationError = e.Error;
}
else if (e.Error != null)
{
  // error occurred
  this.BeginInvoke(new MethodInvoker(
 () =>         {
   MessageBox.Show(e.Error.Message);
 }));
  }
  else
  {
 // the request was completed successfully
 dynamic result = e.GetResultData();

 this.BeginInvoke(new MethodInvoker(
   () =>             {
    // always remember to check individual errors for the batch requests.
    if (result[0] is Exception)
   MessageBox.Show(((Exception)result[0]).Message);
    dynamic first = result[0];
  ...
   }));
 }
  };

用上以上兩種方法,就可以很容易地拿到你所需要的東西...


facebook desktop Apps 筆記 - 2

上一篇筆記寫了用api 來連上facebook 的Login 頁,現在就寫下如何把需要的access token 收回來吧...

其實要接回這個access token 的方法好簡單,因為我們是用server-side 的authorization 方法,所以只要我們為之前加入的browser object 連上一個navigated 的action..


之後就可以接住個authorization 的結果了

private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
   FacebookOAuthResult oauthResult;
   if (FacebookOAuthResult.TryParse(e.Url, out oauthResult))
   {
     // The url is the result of OAuth 2.0 authentication.
     FacebookOAResult = oauthResult;

     if (FacebookOAResult.IsSuccess)
     {
       loginSuccess();
     }
     else
     {
       MessageBox.Show("Fail to login!");
     }
   }
   else
   {
     // The url is NOT the result of OAuth 2.0 authentication.
     FacebookOAResult = null;
   }
}

而在這個FacebookOAuthResult object入面就可以直接地找到需要的accesstoken 了 :)

this.FacebookOAResult.AccessToken


facebook desktop Apps 筆記 - 1

之前為了方便大量upload相上facebook 而寫了自己的第一個facebook apps,現在為了方便之後可能再寫facebook desktop apps時可以快一點上手(有時真係自己睇番d code 都要諗一陣先會記得點解d code 會係咁),所有就借這記下一些筆記重點,等自己將來可以快一點回憶起為何要這樣做 :)

首先, 要init 一個facebook oauthclient 的object 來

var oauthClient = new FacebookOAuthClient { AppId = FacebookApp.AppId };

appid 需要在facebook developer apps中create 的,在這的FacebookApp是一個為了方便自己而設的一個global variables class

因為這個facebook 的login 是經由server side來處理的,所以需要用上一個webbrowser object,加上這個oauthclient object後就可以用來為自己的apps生產對應的login網址了

// 為apps 生產對應的login網址
Uri loginUrl = oauthClient.GetLoginUrl(loginParameters);
// 令用webbrowser object 來進行Login 的動作
this.webBrowser1.Navigate(loginUrl.AbsoluteUri); 

設定不同的loginParameters

IDictionary loginParameters = new Dictionary();
// reponse_type 可以為an access token (token), an authorization code (code), or both (code token)
loginParameters["response_type"] = "token";
// display 的方法也有幾種page/popup/iframe
loginParameters["display"] = "popup";

if (!string.IsNullOrEmpty(FacebookApp.ExtendedPermissions))
{
    loginParameters["scope"] = FacebookApp.ExtendedPermissions;
}

login的scope, 其實就是至你想apps所需要的permission設定,詳情都係要睇返facebook 的api

完整的code

var oauthClient = new FacebookOAuthClient { AppId = FacebookApp.AppId };

IDictionary<string object=""> loginParameters = new Dictionary<string object="">();
loginParameters["response_type"] = "token";

loginParameters["display"] = "popup";

// add the 'scope' parameter only if we have extendedPermissions.
if (!string.IsNullOrEmpty(FacebookApp.ExtendedPermissions))

  loginParameters["scope"] = FacebookApp.ExtendedPermissions;
}

Uri loginUrl = oauthClient.GetLoginUrl(loginParameters);

this.webBrowser1.Navigate(loginUrl.AbsoluteUri);
this.tabControl1.SelectedIndex = 1;

用以上的code就可以輕鬆地寫出一個連接上facebook 的login呢 :)