2015-12-28 28 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Facebook; 
using System.Net; 
using System.IO; 

namespace WebSite_Login_And_Browsing 
{ 
    class Posts 
    { 
     public string PostId { get; set; } 
     public string PostStory { get; set; } 
     public string PostMessage { get; set; } 
     public string PostPicture { get; set; } 
     public string UserId { get; set; } 
     public string UserName { get; set; } 

    } 

    class FacebookPosts 
    { 
     static string accesstoken; 
     //static string token = "2f89d691b5f39"; 
     static string token = "1186840401345424|GoJRCpM"; 
     static string mytoken = "CAACEdEose0cBACPu39NSSalHCGFGDGRKZAvwiTuzG8PHlNRJwbyMVugovDxgL7CT3a1QbRuVDZALXxWU0ntwSrDyq75LIIuzFpBtx47cJYCY2OiA21lpTRKt2bB0t5HrsQYIXHXhmU7GnavWZCzqN8yeuv5NWXxTIOfVCZAZArjYNiPWhZBqZAZAO03s6FKNIulm4kjzXvp4QKiahAlcyaZBg"; 
     static string mytokenaslip = "CAACEdEose0cBABmWuBI9p9dpPxEsMJoFZAG3kScx61kZAImNBgt52kVrd8WWPRpwjWP8nCPX69zdLuFyVQHzxYfMk85ZBZC4BIajVWXNLo7OI7yaCbNIwqkcdwpabQVFZBRWt0rzTQrQr6ZBij45XnrQyEUqFKP4gADeO4Fl9yRaZAZCOFtV3b84sWUFEgwaKbZAPY4BCljVjWQZDZD"; 
     public static void RetrievePosts() 
     { 
      try 
      { 
       var client = new FacebookClient(mytokenaslip); 
       dynamic result = client.Get("/me/posts"); 
       List<Posts> postsList = new List<Posts>(); 

       //all the posts and their information (like pictures and links) is strored in result.data not in result 

       for (int i = 0; i < result.data.Count; i++) 
       { 
        Posts posts = new Posts(); 

        posts.PostId = result.data[i].id; 
        if (object.ReferenceEquals(result.data[i].story, null)) 
         posts.PostStory = "this story is null"; 
        else 
         posts.PostStory = result.data[i].story; 
        if (object.ReferenceEquals(result.data[i].message, null)) 
         posts.PostMessage = "this message is null"; 
        else 
         posts.PostMessage = result.data[i].message; 

        posts.PostPicture = result.data[i].picture; 
        posts.UserId = result.data[i].from.id; 
        posts.UserName = result.data[i].from.name; 

        postsList.Add(posts); 
       } 

      } 
      catch (Exception err) 
      { 
       //throw; 
       string myerr = err.ToString(); 
      } 
     } 
    } 
} 

我得到25個結果列表postsList 我如何循環現在asgain下一個25個結果獲得下一個頁面,並在添加到postsList和循環一遍又一遍,直到沒有更多的結果?如何使用facebook api爲下一個25頁的結果循環?

我想要做的是每50分鐘自動刪除最後25個帖子。 在我項目的其他課上,我每分鐘都會自動發貼到我的牆上。 50分鐘後,我想刪除最後的25個帖子,所以我的牆上只有25個帖子。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using mshtml; 
using HtmlAgilityPack; 
using System.Net; 
using System.IO; 

namespace WebSite_Login_And_Browsing 
{ 
    public partial class Facebook_Post : Form 
    { 
     WebBrowser wb = new WebBrowser(); 
     int postsCounter = 0; 
     StreamWriter w = new StreamWriter(@"e:\posts.txt"); 
     WebBrowser webBrowser1; 

     public Facebook_Post() 
     { 
      InitializeComponent(); 

      webBrowser1 = new WebBrowser(); 
      webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 
      webBrowser1.ScriptErrorsSuppressed = true; 
      webBrowser1.Navigate("https://www.facebook.com/"); 
      label4.Text = DateTime.Now.ToString(); 
      w.WriteLine(label4.Text.ToString()); 
      w.WriteLine(Environment.NewLine); 
      label5.Visible = false; 
      label2.Visible = false; 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      try 
      { 
       if (e.Url.AbsoluteUri != webBrowser1.Url.AbsoluteUri) 
       { 
        return; 
       } 


       wb = webBrowser1; 

       foreach (HtmlElement he in wb.Document.All.GetElementsByName("xhpc_message")) 
       { 
        he.SetAttribute("value", RandomString(10)); 
       } 
       var elems = wb.Document.GetElementsByTagName("button"); 

       foreach (HtmlElement elem in elems) 
       { 
        if (elem.InnerText == "Post") 
        { 
         elem.InvokeMember("click"); 
        } 
       } 
       sent = true; 
       postsCounter += 1; 
       label2.Text = postsCounter.ToString(); 
       label2.Visible = true; 
       timer1.Enabled = true; 
       webBrowser1.Dispose(); 
       if (postsCounter == 720) 
       { 
        w.WriteLine(postsCounter.ToString()); 
        w.WriteLine(Environment.NewLine); 
        label5.Text = DateTime.Now.ToString(); 
        label5.Visible = true; 
        w.WriteLine(label5.Text.ToString()); 
        w.Close(); 
       } 
      } 
      catch(Exception err) 
      { 
       string myerr = err.ToString(); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      List<string> results = new List<string>(); 
      HtmlElementCollection elems = wb.Document.GetElementsByTagName("INPUT"); 
      foreach (HtmlElement elem in elems) 
      { 
       String nameStr = elem.GetAttribute("value"); 
       results.Add(nameStr); 
      } 
     } 

     bool sent = false; 
     int count = 0; 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      try 
      { 
       count += 1; 
       if (sent == true && count >= 60) 
       { 
        count = 0; 
        timer1.Enabled = false; 
        webBrowser1 = new WebBrowser(); 
        if (webBrowser1.IsBusy == false) 
        { 
         webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted; 
         webBrowser1.Navigate("https://www.facebook.com/"); 
        } 
        sent = false; 
       } 
      } 
      catch(Exception err) 
      { 
       string myerr = err.ToString(); 
      } 
     } 

     private StringBuilder builder; 
     private static Random random = new Random((int)DateTime.Now.Ticks); 
     private string RandomString(int size) 
     { 
      try 
      { 
       builder = new StringBuilder(); 
       char ch; 
       for (int i = 0; i < size; i++) 
       { 
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); 
        builder.Append(ch); 
       } 
      } 
      catch(Exception err) 
      { 
       string myerr = err.ToString(); 
      } 
      return builder.ToString(); 
     } 
    } 
} 

回答

0

我相信這是你在找什麼:

var client = new FacebookClient(mytokenaslip); 

//1-25 
dynamic result = client.Get("/me/posts", new { limit = "25", offset = "0"}); 

//26-50 
dynamic result = client.Get("/me/posts", new { limit = "25", offset = "25"}); 

您也可以選擇在一次獲得超過25個職位。

//51-100 
dynamic result = client.Get("/me/posts", new { limit = "50", offset = "50"}); 
+0

海洋的權利,這是我的意思的邏輯。但是,我如何將它添加到FOR循環的代碼中,這樣它每次都會自動提高偏移量25,直到結果爲0,這樣我就不會再發布任何文章了? –

+0

您希望獲得之前的所有帖子嗎?這基本上可以是無限的,你確定這是你想要的嗎?解決方案是添加一個按鈕來加載下一頁。然後,只需使用表示您所在頁面的屬性(** offset **)即可。 – Oceans

+2

這是一個非常動態的解決方案......但你是對的,獲得所有以前的帖子甚至可能讓你達到api限制,因爲這可能是很多電話。 – luschn

0

您可以使用「recursive function」讓所有條目,並在API結果的「下一個」參數包括API調用下一批結果:https://developers.facebook.com/docs/graph-api/using-graph-api#paging

不過要小心,你如果您嘗試過快並且結果太多,可能會達到API限制。另外,由於您想刪除舊條目並刪除一個條目是一個API調用,因此每次調用後都應該嘗試一次超時,以確保不會達到限制。

確保您學習和了解函數是如何工作的遞歸,無數的線程有關here's之一:Help with Creating a Recursive Function C#

相關問題