Pergunta

Eu tenho este pedaço de código:

    var settings = WebConfigurationManager.AppSettings;
    var consumerKey = settings["Twitter.ConsumerKey"];
    var consumerSecret = settings["Twitter.ConsumerSecret"];
    var authToken = settings["Twitter.OAuthToken"];
    var authVerifier = settings["Twitter.OAuthVerifier"];

    //var accessToken = GetAccessToken(
    //    consumerKey, consumerSecret, authToken, string.Empty);

    var tokens = new OAuthTokens()
    {
        AccessToken = authToken,
        AccessTokenSecret = authVerifier,
        ConsumerKey = consumerKey,
        ConsumerSecret = consumerSecret
    };

    TwitterStatus.Update(tokens, txtComment.Text);

Tudo o que preciso para atualizar meu status do Twitter. Infelizmente, não está funcionando. Funcionou apenas uma vez quando eu inicialmente login no Twitter para conceder o acesso ao aplicativo. Eu então armazenei o AuthToken e o AuthVerifier para que eu possa reutilizá -los para atualizações futuras.

Alguma idéia do que está errado?

ATUALIZAR: Acabei de mudar o código para:

        TwitterResponse<TwitterStatus> tweetResponse = TwitterStatus.Update(tokens, txtComment.Text);
    if (tweetResponse.Result == RequestResult.Success)
        lblMessage.Text = "Twitter status successfully posted.";
    else
        lblMessage.Text = string.Format("Twitter status update failed with Error: '{0}'",
            tweetResponse.ErrorMessage);

E eu recebo uma mensagem de erro: "Token inválido / expirado".

Foi útil?

Solução

Você está armazenando os valores errados. Os valores AuthToken e Verifier precisam ser trocados rapidamente por um token de acesso usando oauthutility.getAccessToken (...). O token de acesso que é devolvido desse método é o que deve ser armazenado e fornecido ao Twitterizer.

-Ricky
O autor do twitterizer

Outras dicas

Eu queria poder fazer uma atualização simples de status da C#/. Net, mas não queria incorporar uma grande biblioteca.

Então eu escrevi um pequeno OAuth.Manager Classe Isso faz essas coisas.

Está descrito aqui:
OAuth com verificação no .NET

Código de exemplo para atualizar o status:

var oauth = new OAuth.Manager(); 
oauth["consumer_key"] = CONSUMER_KEY; 
oauth["consumer_secret"] = CONSUMER_SECRET; 
oauth["token"] = your_stored_access_token; 
oauth["token_secret"] = your_stored_access_secret; 
var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World";
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 

var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Headers.Add("Authorization", authzHeader);
using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode != HttpStatusCode.OK)
        MessageBox.Show("There's been a problem trying to tweet:" +
                        Environment.NewLine +
                        response.StatusDescription +
                        Environment.NewLine +
                        Environment.NewLine +
                        "You will have to tweet manually." +
                        Environment.NewLine);
}

Pela primeira vez, você precisa obter um token e segredo de acesso. Isso é feito em um processo de várias etapas, começando com este código:

var oauth = new OAuth.Manager();
oauth["consumer_key"] = MY_APP_SPECIFIC_KEY;
oauth["consumer_secret"] = MY_APP_SPECIFIC_SECRET;
oauth.AcquireRequestToken("https://api.twitter.com/oauth/request_token", "POST"); 

Etapa 2 é dizer ao usuário ** para visitar https://api.twitter.com/oauth/authorize?oauth_token=XXXX onde xxxx é substituído pelo token real recebido, acessível neste caso por oauth["token"]. A etapa 3 é dizer ao usuário para pegar (Ctrl-C) o pino da página da web e colá-lo no seu aplicativo, onde você usa o pino para obter outro tipo de token.

Uma maneira melhor é automatizar essa sequência de interface do usuário da Web usando um formulário Windows com um controle WebBrowser incorporado. Quando você define a propriedade URL desse controle com o valor apropriado, ele mostrará essa página da web para você, dentro da forma principal do seu próprio aplicativo. Você também pode automatizar a peça em que recupera o pino. Isso reduz as troca de contexto para o seu usuário e simplifica as coisas.

Enfim, com o pino que você faz, Etapa 4:

oauth.AcquireAccessToken("https://api.twitter.com/oauth/access_token",
    "POST",
    pin); 

... que envia outra solicitação de repouso http e, quando retornar, você terá um token e secreto de acesso, disponível em oauth["token"] e oauth["token_secret"].

Esse material de autorização com a interface do usuário da web precisa acontecer apenas uma vez; Depois de obter o token de acesso e segredo uma vez, você pode armazená-los e reutilizá-los. Eles nunca expiram, diz o Twitter.

Você pode prosseguir para enviar a atualização de status ...

var url = "http://api.twitter.com/1/statuses/update.xml?status=Hello+World";
var authzHeader = oauth.GenerateAuthzHeader(url, "POST"); 
...

... como acima.

Eu sei que estou atrasado para o jogo, mas criei um tutorial em vídeo de ponta a ponta mostrando exatamente como fazer isso: crio um aplicativo no dev.twitter.com, instalei o twitterizer usando o NuGet, escrevo o código para lidar com o OAuth E, finalmente, escreva o código para usar os tokens de acesso recebidos do Twitter para fazer um tweet.

Vídeo: http://www.youtube.com/watch?v=tgea1sgmmqu

Tutorial: http://www.markhagan.me/samples/grant-access-and-tweet-as-twitter-user-aspnet

Código (caso você não fique para sair desta página):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Twitterizer;

namespace PostFansTwitter
{
    public partial class twconnect : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var oauth_consumer_key = "YOUR_CONSUMER_KEY_HERE";
            var oauth_consumer_secret = "YOUR_CONSUMER_SECRET_KEY_HERE";

            if (Request["oauth_token"] == null)
            {
                OAuthTokenResponse reqToken = OAuthUtility.GetRequestToken(
                    oauth_consumer_key,
                    oauth_consumer_secret,
                    Request.Url.AbsoluteUri);

                Response.Redirect(string.Format("http://twitter.com/oauth/authorize?oauth_token={0}",
                    reqToken.Token));
            }
            else
            {
                string requestToken = Request["oauth_token"].ToString();
                string pin = Request["oauth_verifier"].ToString();

                var tokens = OAuthUtility.GetAccessToken(
                    oauth_consumer_key,
                    oauth_consumer_secret,
                    requestToken,
                    pin);

                OAuthTokens accesstoken = new OAuthTokens()
                {
                    AccessToken = tokens.Token,
                    AccessTokenSecret = tokens.TokenSecret,
                    ConsumerKey = oauth_consumer_key,
                    ConsumerSecret = oauth_consumer_secret
                };

                TwitterResponse<TwitterStatus> response = TwitterStatus.Update(
                    accesstoken,
                    "Testing!! It works (hopefully).");

                if (response.Result == RequestResult.Success)
                {
                    Response.Write("we did it!");
                }
                else
                {
                    Response.Write("it's all bad.");
                }
            }
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top