我正在考虑使用Tweetinvi在Twitter上发布一些服务状态更新,这似乎是一个很好的库来做这种事情,但我刚开始研究这个,所以使用它并不是一成不变的。
然而,我的研究尚未产生的一件事是在一个基本上是无头服务中处理Twitter身份验证的明显方法。我用Twitter创建了一个应用程序,所以我有我的消费者密钥和秘密,我可以做“仅限应用程序”授权来请求用户信息,获取他们的粉丝等,但当然我无权发布推文。 / p>
所以我的目标是(一旦这是测试版),创建一个合适的Twitter帐户,以某种方式让服务对该帐户进行身份验证,然后以定义的时间间隔从一般服务发布状态更新。这是一个相当简单的想法。
当然,我可以做一些像这里提到的基于PIN的身份验证:
https://github.com/linvi/tweetinvi/wiki/Authentication
我可以手动运行,获取PIN码,然后继续工作流程。但这是否需要定期重新认证,还是基本上“永远”有效?我正在寻找一种尽可能自动化的方法,每隔x小时重做一次auth就是这个梦想的一个巨大障碍,如果不是一个showstopper。
当然,我将获得用于发布状态的Twitter帐户的密码,但我没有办法在没有手动用户干预的情况下进行良好的旧式登录 - 我有哪些选择?
答案 0 :(得分:1)
此行为是设计使然。 Twitter使用OAuth,这是一种允许用户授权应用程序的协议。这对用户有好处,因为否则,您或其他任何人都可以代表他们执行操作,而无需他们知道。
考虑到这一点,唯一的方法是让用户明确授权您的应用。以下是使用ASP.NET MVC编写的LINQ to Twitter如何执行此操作的示例。当用户访问您的网页时,您可以使用一个按钮将其重定向到OAuthController
下面的BeginAsync
操作。
using System;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Mvc;
using LinqToTwitter;
namespace MvcDemo.Controllers
{
public class OAuthController : AsyncController
{
public ActionResult Index()
{
return View();
}
public async Task<ActionResult> BeginAsync()
{
//var auth = new MvcSignInAuthorizer
var auth = new MvcAuthorizer
{
CredentialStore = new SessionStateCredentialStore
{
ConsumerKey = ConfigurationManager.AppSettings["consumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"]
}
};
string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete");
return await auth.BeginAuthorizationAsync(new Uri(twitterCallbackUrl));
}
public async Task<ActionResult> CompleteAsync()
{
var auth = new MvcAuthorizer
{
CredentialStore = new SessionStateCredentialStore()
};
await auth.CompleteAuthorizeAsync(Request.Url);
// This is how you access credentials after authorization.
// The oauthToken and oauthTokenSecret do not expire.
// You can use the userID to associate the credentials with the user.
// You can save credentials any way you want - database,
// isolated storage, etc. - it's up to you.
// You can retrieve and load all 4 credentials on subsequent
// queries to avoid the need to re-authorize.
// When you've loaded all 4 credentials, LINQ to Twitter will let
// you make queries without re-authorizing.
//
//var credentials = auth.CredentialStore;
//string oauthToken = credentials.OAuthToken;
//string oauthTokenSecret = credentials.OAuthTokenSecret;
//string screenName = credentials.ScreenName;
//ulong userID = credentials.UserID;
//
return RedirectToAction("Index", "Home");
}
}
}
用户授权您的应用程序后,Twitter会将其重定向回CompleteAsync
方法。请注意有关如何从auth.CredentialStore
中提取值的注释。将这些保存在您的数据库中,然后在您的服务中检索它们以代表用户拨打电话。
这些凭据不会更改,但用户可能会在将来的某个时间取消对您的应用程序的授权 - 此时您需要再次授权它们。您可以在LINQ to Twitter ASP.NET Samples页面获取完整的示例代码。