2012-02-11 12 views
0

私はFacebookのAPIを使用して友達からデータを取得するためのデスクトップアプリケーションを構築しようとしています。 とにかく私はログインの段階で立ち往生しています。 私はいくつかのアドバイスを使い、WebBrowserでFacebookにログインしました。それは素晴らしい作品です。 は、私はそれがfacebook desktop app C#

私はbutton_1方法

if (!w.DocumentText.Contains(@"<div class=""linkWrap noCount"">Messages</div>")) 
    { 
     w.Navigate(@"http://www.facebook.com/login.php"); 
     MessageBox.Show("Login error. Wrong username or password!"); 
    } 

    else 
    { 
     MessageBox.Show("Logged in successfully"); 

    } 

<のdivクラスの最後に、このようにそれをやってみました

=「」linkWrap NOCOUNT」私のステータス=失敗や成功を与えるようにしようで立ち往生しています">メッセージ</div>は、ログインしている間のみ表示されるので、ユーザがログインしているかどうかを確認するために使用されます。

しかし、問題は、常にブラウザがそのページにナビゲートする前に、私はスレッドとスレッドの睡眠やタイマーを試みたが、それdoesntは動作するように見える

アイデア?

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(new ThreadStart(WorkThreadFunction)); 
     thread.Start(); 

     string email = textBox1.Text; 
    string password = textBox2.Text; 

    // create a new browser 
    WebBrowser w = new WebBrowser(); 
    w.Dock = DockStyle.Fill; 
    this.Controls.Add(w); // you may add the controll to your windows forms if you want to see what is going on 
    // latter you may not chose to add the browser or you can even set it to invisible... 


    // navigate to facebook 
    w.Navigate(@"http://www.facebook.com/login.php"); 

    // wait a little 
    for (int i = 0; i < 100; i++) 
    { 
     System.Threading.Thread.Sleep(10); 
     System.Windows.Forms.Application.DoEvents(); 
    } 


    HtmlElement temp=null; 

    // while we find an element by id named email 
    while (temp == null) 
    { 
     temp = w.Document.GetElementById("email"); 
     System.Threading.Thread.Sleep(10); 
     System.Windows.Forms.Application.DoEvents(); 
    } 

    // once we find it place the value 
    temp.SetAttribute("value", email); 


    temp = null; 
    // wiat till element with id pass exists 
    while (temp == null) 
    { 
     temp = w.Document.GetElementById("pass"); 
     System.Threading.Thread.Sleep(10); 
     System.Windows.Forms.Application.DoEvents(); 
    } 
    // once it exist set its value equal to passowrd 
    temp.SetAttribute("value", password); 

    // if you already found the last fields the button should also be there... 

    var inputs = w.Document.GetElementsByTagName("input"); 

    int counter = 0; 
    bool enableClick = false; 

    // iterate through all the inputs in the document 
    foreach (HtmlElement btn in inputs) 
    { 

     try 
     { 
      var att = btn.GetAttribute("tabindex"); 
      var name = btn.GetAttribute("id"); 

      if (enableClick)// button to submit always has a differnt id. it should be after password textbox 
      { 
       btn.InvokeMember("click"); 
       counter++; 
      } 

      if (name.ToUpper().Contains("PASS") || att=="4") 
      { 
       enableClick = true; // button should be next to the password input      
      } 

      // try a max of 5 times 
      if (counter > 5) 
      { 
       break; 

      } 
     } 
     catch 
     { 


     } 


       } 






    } 

答えて

3

チェックアウトのWindowsフォーム用のFacebook - シャープSDK:

https://github.com/facebook-csharp-sdk/facebook-winforms

+1

これは理論的に質問に答えるかもしれませんが、答えの本質的な部分を含め、参照のためのリンクを提供することが望ましいでしょう(http://meta.stackexchange.com/q/8259)。 – Lix

+0

このSDKは通常のユーザーとしてログインしませんが、アプリIDを持っていて必要なものではありません。ありがとうございました – Zbone

+0

Facebookのアプリケーションを作成して接続に使用できます。これは簡単なプロセスで、アプリなしでFacebookのログインができるかどうかはわかりません。 SDKを使用してFacebookにログインするときは、アプリケーションとしてのアクセス許可を要求する必要があります。 –

1

私はあなたがFacebook C# SDKを使用することをお勧めここ

はコードです。 OAuth protocol,for user-authenticationを使用します。

private FacebookOAuthResult result; 
private FacebookOAuthClient OAuth; 

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 

      if (webBrowser1.Url.AbsolutePath == "/login.php") 
      { 
        // do login..  
      } 

      if (FacebookOAuthResult.TryParse(e.Url, out result)) 
      { 
       if (result.IsSuccess) 
       { 
        FacebookClient fbClient = new FacebookClient(result.AccessToken); 
        dynamic friends = fbClient.Get("/me/friends"); //User friends 
        // do something.. 
       } 
       else 
       { 
        string errorDescription = result.ErrorDescription; 
        string errorReason = result.ErrorReason; 
        string msg = String.Format("{0} ({1})", errorReason, errorDescription); 
        MessageBox.Show(msg, "User-authentication failed!"); 
       } 
      } 
     } 

してからスタート、ユーザー認証のために:

フィールドを宣言 Facebook-C#-SDK:

using Facebook; //add reference to facebook dll for it work 

で、ユーザーの友達を取得する方法のコード例ダウン

//.. 

    OAuth = new FacebookOAuthClient(); 
    OAuth.AppId = appId; // see link above,you can find how to get it 
    OAuth.AppSecret = appSecret; // see link above,you can find how to get it 

    Uri loginUrl = OAuth.GetLoginUrl(paramenters); 
    webBrowser1.Navigate(loginUrl.AbsoluteUri); 
関連する問題