获取1000条最新推文并将其写入日志文件

时间:2012-11-15 11:10:01

标签: c# twitter linq-to-twitter

我一直试图获取最新的1000条推文。我已经阅读了LinqToTwitter的所有文档。我试着写自己的:

 void GetUserTimeLine(TwitterContext ctx)
     {
        List<String> tweetList = new List<String>();
        String[] breakWords;
        ulong maxID = 0000;
        ulong sinceID = 3396455589; //oldest tweetID
        for (int i = 0; i < 5; i++)
        {
            if (i == 0)
            {
                var statusTweets =
               from tweet in twitterCtx.Status
               where tweet.Type == StatusType.User &&
                     tweet.Count == 200 &&
                     tweet.SinceID == sinceID &&
                     tweet.ScreenName == "nyptweets"
               select tweet;



                tweetList.Add(statusTweets.ToList().ToString());
                breakWords = tweetList[tweetList.Count - 1].Split(' ');
                maxID = Convert.ToUInt64(breakWords[5].ToString());
            }
            else
            {
                var statusTweets =
               from tweet in twitterCtx.Status
               where tweet.Type == StatusType.User &&
                     tweet.Count == 200 &&
                     tweet.SinceID == sinceID &&
                     tweet.MaxID == maxID &&
                     tweet.ScreenName == "nyptweets"
               select tweet;
               tweetList.Add(statusTweets.ToList().ToString());
               breakWords = tweetList[tweetList.Count - 1].Split(' ');
               maxID = Convert.ToUInt64(breakWords[5].ToString());
            }


        }
       string dwnloadFilePath = @"C:\temp\Tweet.log";

        // CREATE AN EMPTY TEXT FILE
        FileStream fs1 = null;
        if (!File.Exists(dwnloadFilePath))
        {
            using (fs1 = File.Create(dwnloadFilePath)) ;
        }

        // WRITE DATA INTO TEXT FILE
        if (File.Exists(dwnloadFilePath))
        {
            using (StreamWriter sw = new StreamWriter(dwnloadFilePath))
            {
                File.WriteAllLines(dwnloadFilePath, tweetList);
             }
          }
       }

有人可以帮我吗?问题是,当我选择一条推文时,它不是string,因此当我将其添加到List<string>时,它不起作用。

3 个答案:

答案 0 :(得分:1)

只是为了它,你应该考虑清理你的代码(长度的一半):

public class Twitter
{
    private List<String> tweetList;
    private String[] breakWords;
    private ulong maxID = 0000;
    private ulong sinceID = 3396455589; //oldest tweetID

    private void progressTweet(int i)
    {
        var statusTweets =
               from tweet in twitterCtx.Status
               where tweet.Type == StatusType.User &&
                     tweet.Count == 200 &&
                     tweet.SinceID == sinceID &&
                     tweet.ScreenName == "nyptweets"
               select tweet;

        if (i == 0)
            tweetList.Add(statusTweets.ToList().ToString());
        else
            tweetList.Add(statusTweets.Where(x => x.MaxID == maxID).ToList().ToString());

        breakWords = tweetList[tweetList.Count - 1].Split(' ');
        maxID = Convert.ToUInt64(breakWords[5].ToString());
    }

    void GetUserTimeLine(TwitterContext ctx)
    {
        tweetList = new List<String>();

        for (int i = 0; i < 5; i++)
            progressTweet(i);

        File.WriteAllLines(@"C:\temp\Tweet.log", tweetList);
    }
}

值得注意的是,除了i以外我不使用if (i == 0) ... else ...,除了另一个优化是不为每次迭代运行LINQ,而是提前选择您想要的,以便您可以将实际推文传递给progressTweet

至于保持这个实际答案,我不认为.ToList().ToString()是正确的。

答案 1 :(得分:0)

我不熟悉您正在使用的库,但是您看到代码部分有tweet.Typetweet.Count等等...必须有一个名为“Description”的成员,或“身体”或“内容”。 Intellisense应该能够为您提供帮助(按推文。应该扩展您可以对该对象执行的操作的列表)。知道这一点,你现在可以构建你想要存储在列表中的字符串(通过迭代statusTweets中的所有对象),可能是用户名和推文正文?

ToString是一个操作符,如果没有定义,只会将对象类型输出为字符串,这不是你想要的。

答案 2 :(得分:0)

如果您需要最新的1000行,为什么不按推文日期降序尝试Take(1000)。

就像这样

    var latestTweets= (from tweet in twitterCtx.Status
                   where tweet.Type == StatusType.User &&
                         tweet.Count == 200 &&
                         tweet.SinceID == sinceID &&
                         tweet.ScreenName == "nyptweets"
                       orderby <tweet.tweetdate> descending
                   select tweet).Take(1000);

foreach(var tweet in latestTweets){
 // Work on each tweet object.
}