Twitter приложение. Отправка твитов и личных сообщений

от автора

Сначала нужно, чтобы все кубики сложились…

image

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

А теперь по пунктам:

1. Для начала нужен аккаунт на Twitter. Еще нет? Тогда, стоит зарегистрироваться.
Запоминаем или восстанавливаем в памяти ваш логин и пароль и переходим к следующему пункту.

2. Теперь перейдем на сайт Twitter Developers, где, для авторизации, воспользуемся
триттер логином и паролем. Как только авторизация прошла успешно, нужно в меню аккаунта выбрать
пункт «My applications» и на открывшейся странице нажать на кнопку image

image

После того, как вы заполните все поля и создадите приложение, ему(приложению) назначатся 2 ключа:
Consumer key и
Consumer secret
Они доступны в разделе OAuth settings вкладки Details вашего приложения

image

3. Следующим шагом создания twitter приложения будет написание авторизации OAuth. Подробно это описано в статье Твиттер собственными руками на C#. Часть 1: авторизация OAuth. Вам нужно будет собрать приложение
из данной статьи. Если все пройдет удачно, то в итоге вы пройдете авторизацию OAuth и вам назначатся еще 2 важных значения:
Access token и
Access token secret
Они также доступны в разделе Your access token вкладки Details вашего приложения. Также, обратите внимание на поле Access level в этом же разделе. Для того, чтобы приложение могло постить твиты и отправлять личные сообщения, оно должно быть установлено в Read, write, and direct messages. Если это не так, то нужно настроить Access на вкладке Settings и вновь пройти авторизацию OAuth.

image

Если вы откроете ваш аккаунт твиттер, перейдете в настройки и откроете меню «Приложения», то там должно быть указано ваше приложение, зарегистрированное на Twitter Developers:

image

4. Теперь вспоминаем ключи, которые мы получили на первых этапах:
Consumer key
Consumer secret
Access token
Access token secret

Создаем класс MessageSender, который и будет заниматься отправлением сообщений:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.Net; using System.IO;  namespace TwitterOAuth {     class MessageSender     {         private readonly string consumerKey;         private readonly string consumerSecret;         private readonly string oauthToken;         private readonly string oauthTokenSecret;          private const string headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +               "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +               "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +               "oauth_version=\"{6}\"";          /// <summary>         /// В конструктор передаем сохраненные ключи         /// </summary>         public MessageSender(string consumer_key, string consumer_secret, string oauth_token, string oauth_token_secret)         {             this.consumerKey = consumer_key;             this.consumerSecret = consumer_secret;             this.oauthToken = oauth_token;             this.oauthTokenSecret = oauth_token_secret;         }          /// <summary>         /// Отправляем личное сообщение пользователю         /// </summary>         /// <param name="user">without @</param>         /// <param name="text"></param>         public void SendDirectMessage(string user, string text)         {             string post_data;             string resource_url;              string authHeader = GetPostDirectMessageBaseString(text, user, oauthToken, oauthTokenSecret, out post_data, out resource_url);             Send(resource_url, post_data, authHeader);         }          /// <summary>         /// Публикуем на ленту         /// </summary>         /// <param name="text"></param>         public void SendTwit(string text)         {             string post_data;             string resource_url;              string authHeader = GetStatusBaseString(text, oauthToken, oauthTokenSecret, out post_data, out resource_url);             Send(resource_url, post_data, authHeader);         }          private void Send(string resource_url, string post_data, string auth_header)         {             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);             request.Headers.Add("Authorization", auth_header);             request.Method = "POST";             request.ContentType = "application/x-www-form-urlencoded";             request.ContentLength = post_data.Length;              using (Stream stream = request.GetRequestStream())             {                 byte[] content = ASCIIEncoding.ASCII.GetBytes(post_data);                 stream.Write(content, 0, content.Length);             }             try             {                 WebResponse response = request.GetResponse();                 Console.WriteLine(response.ToString());             }             catch (WebException e)             {                 Console.WriteLine(e.Status.ToString());             }         }          private string GetBaseString(string oauth_token, string oauth_token_secret, string post_data, string resource_url)         {             var oauth_version = "1.0";             var oauth_signature_method = "HMAC-SHA1";             var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));             var timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);             var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();              var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +                 "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&" + post_data;              var baseString = string.Format(baseFormat,                                         consumerKey,                                         oauth_nonce,                                         oauth_signature_method,                                         oauth_timestamp,                                         oauth_token,                                         oauth_version                                         );              baseString = string.Concat("POST&", Uri.EscapeDataString(resource_url),                          "&", Uri.EscapeDataString(baseString));              //Encrypt data             var compositeKey = string.Concat(Uri.EscapeDataString(consumerSecret),                         "&", Uri.EscapeDataString(oauth_token_secret));              string oauth_signature;             using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))             {                 oauth_signature = Convert.ToBase64String(                     hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));             }              //Finish Auth header             var authHeader = string.Format(headerFormat,                                     Uri.EscapeDataString(oauth_nonce),                                     Uri.EscapeDataString(oauth_signature_method),                                     Uri.EscapeDataString(oauth_timestamp),                                     Uri.EscapeDataString(consumerKey),                                     Uri.EscapeDataString(oauth_token),                                     Uri.EscapeDataString(oauth_signature),                                     Uri.EscapeDataString(oauth_version)                             );              return authHeader;         }          private string GetStatusBaseString(string status, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url)         {             post_data = "status=" + Uri.EscapeDataString(status);             resource_url = "https://api.twitter.com/1.1/statuses/update.json";              return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url);         }          private string GetPostDirectMessageBaseString(string text, string screen_name, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url)         {             post_data = "screen_name=" + Uri.EscapeDataString(screen_name) + "&text=" + Uri.EscapeDataString(text);             resource_url = "https://api.twitter.com/1.1/direct_messages/new.json";              return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url);         }     } } 

Для того, чтобы отправить сообщение на ленту, вызываем мeтод SendTwit(«some message»),
а чтобы отправить личное сообщение, вызываем метод SendDirectMessage(«user», «some message»)

        static void Main(string[] args)         {             //Отправляем сообщения             MessageSender ms = new MessageSender(consumerKey,                 consumerSecret,                 oauth_token,                 oauth_token_secret);             ms.SendTwit("I can send twit");             //здесь нужно вписать в первый параметр имя существующего пользователя             ms.SendDirectMessage("user", "Direct message for user");              Console.ReadLine();         } 

Обратите внимание на то, что два раза одно и то же сообщение нельзя публиковать на ленту и пишите текст латиницей.

Если вы захотите и дальше расширять возможности вашего приложения, то вот вам Документация REST API v1.1 Resources. В случае с Отправкой личных сообщений, в коде устанавливаются два параметра: screen_name и text, а resource_url берется из документации: раздел Example Request, поле POST

 private string GetPostDirectMessageBaseString(string text, string screen_name, string oauth_token, string oauth_token_secret, out string post_data, out string resource_url)         {             post_data = "screen_name=" + Uri.EscapeDataString(screen_name) + "&text=" + Uri.EscapeDataString(text);             resource_url = "https://api.twitter.com/1.1/direct_messages/new.json";              return GetBaseString(oauth_token, oauth_token_secret, post_data, resource_url);         } 

Обратите внимание на то, что между параметрами ставится &, а также важен порядок следования этих параметров для построения Signature Base String в методе GetBaseString. Чтобы проверить в будущем правильность следования параметров, можно воспользоваться OAuth tool. Для этого откройте, например Отправку личных сообщений, найдите справа OAuth tool, в выпадающем списке выберите ваше приложение и нажмите Generate Oauth signature

image

Внизу открывшейся страницы будут написаны пример запроса, URI, если вы нажмете кнопку image то сгенерируются Signature base string, Authorization header и т.д.

Удачи!

ссылка на оригинал статьи http://habrahabr.ru/post/208662/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *