2

尝试通过 c# 使用 Tweetinvi 库获取过滤流。

我正在尝试做类似于搜索的事情,我已经能够成功接收推文:

public List<ITweet> SearchTweets(string query)
{
    List<ITweet> tweets = new List<ITweet>();

    TwitterCredentials.ExecuteOperationWithCredentials(Credentials, () =>
    {
        var searchParam = Search.GenerateSearchTweetParameter(query);
        searchParam.Lang = Language.English;
        searchParam.MaximumNumberOfResults = 100;
        tweets = Search.SearchTweets(searchParam);
    });

    return tweets;
}

但这里的限制是我最多只能获得 100 条推文。我想以类似的方式利用流并获得与tracks我通过的推文匹配的推文流。我试过这个:

public void FilterStream(string query)
{
    IFilteredStream tweets;

    TwitterCredentials.ExecuteOperationWithCredentials(Credentials, () =>
    {
        var filteredStream = Tweetinvi.Stream.CreateFilteredStream();
        filteredStream.AddTrack(query);
        filteredStream.AddTrack("#" + query);
        filteredStream.MatchingTweetReceived += (sender, args) => { Debug.WriteLine(args.Tweet.Text); };
        filteredStream.StartStreamMatchingAllConditions();
    });
}

但问题是它似乎在无限循环中运行,我不确定在哪里停止或限制我从流中收到的推文数量以使其停止。图书馆的文档很不清楚,我一直无法实现我正在寻求的行为。我确定我在正确的路线上,只是不确定如何停止流并将我收到的所有推文存储在List<ITweet>构造中。

4

4 回答 4

1

要停止流使用:

filteredStream.StopStream();

您可以在全球范围内对推文进行计数,然后在收到所需的推文数量时停止。

于 2015-02-09T17:02:12.197 回答
1
  • 您应该尝试在 MatchingTweetReceived 方法中添加一个条件,如下所示:

    public void FilterStream(string query)
    

    { IFilteredStream 推文;

    TwitterCredentials.ExecuteOperationWithCredentials(Credentials, () =>
    {
        var filteredStream = Tweetinvi.Stream.CreateFilteredStream();
        filteredStream.AddTrack(query);
        filteredStream.AddTrack("#" + query);
        filteredStream.MatchingTweetReceived += (sender, args) => { 
    
              Debug.WriteLine(args.Tweet.Text); 
              if (condition)
                stream.StopStream();
    

    }; filtersStream.StartStreamMatchingAllConditions(); }); }

这对我来说很好。

于 2019-06-27T14:06:14.643 回答
1

我遇到了同样的问题,最终这样做了:

var task = filteredStream.StartStreamMatchingAllConditionsAsync();

while (true)
{
    Thread.Sleep(500);

    if (task.IsCanceled || task.IsCompleted || task.IsFaulted)
    {
        break;
    }

    if (ShouldStop)
    {
         filteredStream.StopStream();
         break;
    }
}

task.Wait();

StartStreamMatchingAllConditionsAsync()将启动任务并立即返回,然后无限while循环将检查停止流并中断循环的条件。

ShouldStopTrue是一个静态布尔变量,当代码应该停止从 twitter 流式传输时,它会被翻转。

然后我们Wait()为流任务完成。

该代码有异味,但似乎有效!我很想知道是否有人提出了更好的实现......

于 2015-08-25T10:50:45.087 回答
0

我知道这是一个老问题,但我刚刚做到了:

    public void Start()
    {
        _stream = Stream.CreateFilteredStream(_creds);

        // Do whatever stream setup you want to do

        Task.Factory.StartNew(() => {
            Debug.WriteLine("Thread started");
            _stream.StartStreamMatchingAllConditions();
            Debug.WriteLine("Thread stopped");
            });
    }

    public void Stop()
    {
        _stream.StopStream();
    }
于 2017-06-05T19:42:26.407 回答