我们正在用 ASP.NET (C# - Framework 4.0) 开发社交媒体监控应用程序,并使用 Twitter 的 Tweetinvi 库。
我们必须同时发送推文并搜索各种 Twitter 用户。为了发布推文,我们必须首先在 Auth 类中设置访问令牌。但是,那里的所有功能都是静态的。如果我们设置任何用户的令牌,所有其他用户都会使用此帐户发布他的推文。
我怎样才能防止这个问题?
我是 Tweetinvi 的主要开发者。
请完整阅读这篇文章,以便您对该主题有一个很好的理解。
TweetinviAuth
类将凭据存储为每个线程的静态变量。
这意味着对于您的应用程序存储自己的一组凭据的每个线程。在 ASP.NET 中,这意味着 ThreadPool 中的每个线程都将使用它们自己的一组凭据。
这也意味着每次创建新线程时,最好使用手动设置该线程的凭据Auth.SetUserCredentials
要回答您的问题,您有不同的解决方案:
您只需在Auth.SetUserCredentials
每次要切换用户时调用。
// creds for user 1
Auth.SetUserCredentials("CONSUMER_KEY_1", "CONSUMER_SECRET_1", "ACCESS_TOKEN_1", "ACCESS_TOKEN_SECRET_1");
var tweetPublishedByUser1 = Tweet.PublishTweet("user 1 tweet");
// creds for user 2
Auth.SetUserCredentials("CONSUMER_KEY_2", "CONSUMER_SECRET_2", "ACCESS_TOKEN_2", "ACCESS_TOKEN_SECRET_2");
var tweetPublishedByUser2 = Tweet.PublishTweet("user 2 tweet");
您可以要求 Tweetinvi 使用一组特定的凭据运行任何操作Auth.ExecuteOperationWithCredentials
。
// creds for user 1
var cred1 = Auth.CreateCredentials("CONSUMER_KEY_1", "CONSUMER_SECRET_1", "ACCESS_TOKEN_1", "ACCESS_TOKEN_SECRET_1");
var tweetPublishedByUser1 = Auth.ExecuteOperationWithCredentials(cred1, () =>
{
return Tweet.PublishTweet("user 1 tweet");
});
// creds for user 2
var cred2 = Auth.CreateCredentials("CONSUMER_KEY_2", "CONSUMER_SECRET_2", "ACCESS_TOKEN_2", "ACCESS_TOKEN_SECRET_2");
var tweetPublishedByUser2 = Auth.ExecuteOperationWithCredentials(cred2, () =>
{
return Tweet.PublishTweet("user 2 tweet");
});
通过该方法AuthenticatedUser
简化您的生活。ExecuteAuthenticatedUserOperation
该解决方案非常有用,因为它允许您创建一个集合AuthenticatedUser
并在需要时使用您想要的集合。
// creds for user 1
Auth.SetUserCredentials("CONSUMER_KEY_1", "CONSUMER_SECRET_1", "ACCESS_TOKEN_1", "ACCESS_TOKEN_SECRET_1");
var authenticatedUser1 = User.GetAuthenticatedUser();
// creds for user 2
Auth.SetUserCredentials("CONSUMER_KEY_2", "CONSUMER_SECRET_2", "ACCESS_TOKEN_2", "ACCESS_TOKEN_SECRET_2");
var authenticatedUser2 = User.GetAuthenticatedUser();
var tweetPublishedByUser1 = authenticatedUser1.ExecuteAuthenticatedUserOperation(() =>
{
return Tweet.PublishTweet("user 1 tweet");
});
var tweetPublishedByUser2 = authenticatedUser2.ExecuteAuthenticatedUserOperation(() =>
{
return Tweet.PublishTweet("user 2 tweet");
});
您可以在此处找到有关如何在 Tweetinvin 中使用凭据的文档:https ://github.com/linvi/tweetinvi/wiki/Credentials