...

пятница, 10 января 2014 г.

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 и т.д.


Удачи!


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers.


Комментариев нет:

Отправить комментарий