2016-09-02 5 views
2

Я использую TweetSharp для отправки твитов пользователей (в настоящее время тестирования), однако он постоянно возвращается с плохой проверки подлинности данныхC# TweetSharp не отправка твитов

{"errors":[{"code":215,"message":"Bad Authentication data."}]}

Я проверил мои настройки приложения и имеет полный доступ к чтению и записи. Я также пытался восстановить ключи от своего потребителя, но все равно не повезло.

вот мой код

public ActionResult AccessToken() 
{ 

    string oauth_consumer_key = "<consumer key>"; 
    string oauth_consumer_secret = "<consumer secret>"; 

    var service = new TwitterService(oauth_consumer_key, oauth_consumer_secret); 

    // Now we need the Token and TokenSecret 
    OAuthRequestToken requestToken = service.GetRequestToken("http://localhost:37808/"); 
    string authURL = service.GetAuthorizationUri(requestToken).ToString(); 

    Process.Start(authURL); 

    SendTweetOptions options = new SendTweetOptions(); 
    options.Status = "Hello there Twitter"; 

    service.SendTweet(options); 

    var re = service.Response.Response; 

    return View();    
    } 

я делаю что-то неправильно?

+0

Tweetsharp устарел, вы пробовали использовать другие библиотеки, такие как Tweetinvi? – Linvi

ответ

3

Наконец-то решена проблема, и она работает хорошо. На основе комментариев от Yort.

public ActionResult AccessToken() 
{ 
     // Step 1 - Retrieve an OAuth Request Token 
     TwitterService service = new TwitterService(ConfigurationManager.AppSettings["TwitterConsumerKey"], ConfigurationManager.AppSettings["TwitterConsumerSecret"]); 

     // This is the registered callback URL 
     OAuthRequestToken requestToken = service.GetRequestToken("http://localhost:37808/Twitter/OToken"); 

     // Step 2 - Redirect to the OAuth Authorization URL 
     Uri uri = service.GetAuthorizationUri(requestToken); 
     return new RedirectResult(uri.ToString(), false /*permanent*/); 
     //return View(); 
} 

public ActionResult OToken() 
{ 
     return View(); 
} 

public ActionResult UserInfo(string oauth_token, string oauth_verifier) 
{ 

     var requestToken = new OAuthRequestToken { Token = oauth_token }; 

     // Step 3 - Exchange the Request Token for an Access Token 
     TwitterService service = new TwitterService(ConfigurationManager.AppSettings["TwitterConsumerKey"], 
                ConfigurationManager.AppSettings["TwitterConsumerSecret"]); 
     OAuthAccessToken accessToken = service.GetAccessToken(requestToken, oauth_verifier); 

     // Step 4 - User authenticates using the Access Token 
     service.AuthenticateWith(accessToken.Token, accessToken.TokenSecret); 
     TwitterUser user = service.VerifyCredentials(new VerifyCredentialsOptions()); 
     ViewBag.Message = string.Format("{0}", user.ScreenName); 

     // Step 5 - Send Tweet to User TimeLine 
     SendTweetOptions options = new SendTweetOptions(); 

     string URL = "file:\\C:\\Users\\<User>\\Desktop\\test.jpg"; 
     string path = new Uri(URL).LocalPath;   

     // Sending with Media 
     using (var stream = new FileStream(path, FileMode.Open)) 
     { 
      service.SendTweetWithMedia(new SendTweetWithMediaOptions 
      { 
       Status = "<status>", 
       Images = new Dictionary<string, Stream> { { path, stream } } 
      }); 
     } 

     var responseText = service.Response.StatusCode; 

     if (responseText.ToString() == "OK") 
     { 
      ViewBag.Message = "Tweet Successful"; 
     } 
     else 
     { 
      ViewBag.Message = "Tweet Unsuccessful"; 
     }    
     return View(); 
    }          
} 
1

Я не верю, что вы можете отправлять Tweets только как потребитель, твиты должны быть «принадлежащими» учетной записью пользователя. Вам необходимо зарегистрировать учетную запись Twitter, затем выполнить полный процесс аутентификации, чтобы получить токен доступа (в дополнение к токену потребителя), а затем повторно разрешить службу TweetSharp, используя оба токена.

Ваш код выше почти добирается (я думаю). После вызова Process.start должна быть логика для использования верификатора, возвращенного в браузере (номер, отображаемый после входа пользователя в систему), чтобы завершить процесс аутентификации и действовать как этот пользователь. На данный момент ваш код проходит половину этого процесса, но не завершает его, поэтому, когда вы пытаетесь чирикать, ваша служба TweetSharp только авторизована как приложение, а не пользователь.

В оригинальномTweetSharp readme.md содержатся недостающие фрагменты кода. Шаг 3 необходим фактический верификатор возвращенное в браузере после входа в систему:

// Шаг 3 - Заменить идентификатор запроса на маркер доступа

строки проверяющего = «123456»; // < - Это вход в вашу заявку от пользователя

OAuthAccessToken access = service.GetAccessToken (requestToken, verifier);

// Шаг 4 - Пользователь аутентифицируется с использованием токена доступа service.AuthenticateWith (access.Token, access.TokenSecret);

// Теперь ваш твит-звонок должен работать здесь.

Также похоже, что вы делаете это в веб-приложении на сервере? В этом случае вы используете полностью неправильный поток oauth (я считаю). Он предназначен для настольных приложений, поэтому вызов, который запускает новый процесс браузера для входа пользователя в систему. Я не совсем уверен, как работает веб-поток, поскольку я никогда не использовал его, но я считаю, что вам нужно перенаправить пользователя на URL-адрес авторизации, который вы получили, а обратный вызов, зарегистрированный в Twitter, должен указывать на ваш сайт. Я думаю, что есть какой-то параметр состояния, который может быть передан обратно через поток oauth, чтобы вы могли реализовать свою собственную логику, чтобы отбирать, где вы остановились на основе идентификатора сеанса или подобного.

+0

Спасибо @Yort за подробный ответ. Я считаю, что TweetSharp не может наилучшим образом реализовать мое требование. Я попробовал метод oAuth, однако не смог получить запросToken, даже после многих попыток. Кажется, я вернусь к своему оригинальному решению и займусь этим.Спасибо – Kevin

+0

Вам явно не нужно использовать tweetsharp (и, вероятно, не следует, поскольку его больше не поддерживали), но проблема здесь заключается в понимании и реализации oauth на клиенте. Насколько я знаю, Twitter поддерживает только oauth1.0a auth сейчас, поэтому вам нужно будет понять это с помощью любой выбранной вами библиотеки. Я думаю, что документы могут быть лучше для других библиотек, но основные потоки auth остаются неизменными. Возможно, попробуйте прочитать Twitter с документами на dev.twitter.com или в документах oauth1.0. Удачи! – Yort

+2

Я получил его работу с использованием TweetSharp, и он очень хорошо поддерживает веб-приложение. Выложите мое решение. – Kevin

Смежные вопросы