
Если вам волею судеб выпало писать twitter приложение, но вы еще не знаете с чего начать, то надеюсь, этот пост поможет вам выстроить логическую цепочку действий, которые, в итоге, приведут к приложению, умеющему отправлять твиты на ленту и личные сообщения пользователям.
А теперь по пунктам:
1. Для начала нужен аккаунт на Twitter. Еще нет? Тогда, стоит зарегистрироваться.
Запоминаем или восстанавливаем в памяти ваш логин и пароль и переходим к следующему пункту.
2. Теперь перейдем на сайт Twitter Developers, где, для авторизации, воспользуемся
триттер логином и паролем. Как только авторизация прошла успешно, нужно в меню аккаунта выбрать
пункт «My applications» и на открывшейся странице нажать на кнопку 

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

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.

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

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

Внизу открывшейся страницы будут написаны пример запроса, URI, если вы нажмете кнопку
то сгенерируются Signature base string, Authorization header и т.д.
Удачи!
ссылка на оригинал статьи http://habrahabr.ru/post/208662/
Добавить комментарий