Обновление статуса Twitter в C # - PullRequest
5 голосов
/ 30 июля 2009

Я пытаюсь обновить статус Twitter пользователя из моего приложения на C #.

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

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

Я посмотрел на два решения. Twitterizer Framework работал нормально, но это внешняя DLL, и я бы предпочел использовать исходный код. Как пример, код, использующий его, очень понятен и выглядит так:

Twitter twitter = new Twitter("username", "password");
twitter.Status.Update("Hello World!");

Я также изучил библиотеку Йедды в Твиттере , но эта попытка завершилась неудачно в процессе проверки подлинности, который я выполняю, используя в основном тот же код, что и выше (Yedda ожидает, что имя пользователя и пароль будут указаны в самом обновлении статуса. но все остальное должно быть таким же).

Поскольку я не смог найти четкого ответа в Интернете, я перенес его в StackOverflow.

Какой самый простой способ получить обновление статуса Twitter, работающее в приложении C #, без внешней зависимости от DLL?

Спасибо

Ответы [ 7 ]

10 голосов
/ 30 июля 2009

Если вам нравится Twitterizer Framework, но просто не нравится отсутствие источника, почему бы не загрузить исходный код ? (Или просмотрите его , если вы просто хотите увидеть, что он делает ...)

7 голосов
/ 30 июля 2009

Я не фанат переизобретения колеса, особенно когда речь идет о продуктах, которые уже существуют, которые обеспечивают 100% требуемой функциональности. У меня фактически есть исходный код Twitterizer , работающий бок о бок с моим приложением ASP.NET MVC, чтобы я мог внести любые необходимые изменения ...

Если вы действительно не хотите, чтобы ссылка на DLL существовала, вот пример того, как кодировать обновления в C #. Проверьте это из код мечты .

/*
 * A function to post an update to Twitter programmatically
 * Author: Danny Battison
 * Contact: gabehabe@hotmail.com
 */

/// <summary>
/// Post an update to a Twitter acount
/// </summary>
/// <param name="username">The username of the account</param>
/// <param name="password">The password of the account</param>
/// <param name="tweet">The status to post</param>
public static void PostTweet(string username, string password, string tweet)
{
    try {
        // encode the username/password
        string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password));
        // determine what we want to upload as a status
        byte[] bytes = System.Text.Encoding.ASCII.GetBytes("status=" + tweet);
        // connect with the update page
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");
        // set the method to POST
        request.Method="POST";
        request.ServicePoint.Expect100Continue = false; // thanks to argodev for this recent change!
        // set the authorisation levels
        request.Headers.Add("Authorization", "Basic " + user);
        request.ContentType="application/x-www-form-urlencoded";
        // set the length of the content
        request.ContentLength = bytes.Length;

        // set up the stream
        Stream reqStream = request.GetRequestStream();
        // write to the stream
        reqStream.Write(bytes, 0, bytes.Length);
        // close the stream
        reqStream.Close();
    } catch (Exception ex) {/* DO NOTHING */}
}
3 голосов
/ 30 июля 2009

Другая библиотека Twitter, которую я успешно использовал, - TweetSharp , которая обеспечивает свободный API.

Исходный код доступен по адресу Google code . Почему вы не хотите использовать DLL? На сегодняшний день это самый простой способ включить библиотеку в проект.

1 голос
/ 22 октября 2013

Попробуйте LINQ To Twitter . Найти LINQ To Twitter обновить состояние с помощью примера кода с полным медиа, который работает с Twitter REST API V1.1. Решение также доступно для скачивания.

LINQ To Twitter Code Sample

var twitterCtx = new TwitterContext(auth);
string status = "Testing TweetWithMedia #Linq2Twitter " +
DateTime.Now.ToString(CultureInfo.InvariantCulture);
const bool PossiblySensitive = false;
const decimal Latitude = StatusExtensions.NoCoordinate; 
const decimal Longitude = StatusExtensions.NoCoordinate; 
const bool DisplayCoordinates = false;

string ReplaceThisWithYourImageLocation = Server.MapPath("~/test.jpg");

var mediaItems =
       new List<media>
       {
           new Media
           {
               Data = Utilities.GetFileBytes(ReplaceThisWithYourImageLocation),
               FileName = "test.jpg",
               ContentType = MediaContentType.Jpeg
           }
       };

 Status tweet = twitterCtx.TweetWithMedia(
    status, PossiblySensitive, Latitude, Longitude,
    null, DisplayCoordinates, mediaItems, null);
1 голос
/ 24 августа 2009

Самый простой способ опубликовать материал в твиттере - использовать базовую аутентификацию , которая не очень сильна

    static void PostTweet(string username, string password, string tweet)
    {
         // Create a webclient with the twitter account credentials, which will be used to set the HTTP header for basic authentication
         WebClient client = new WebClient { Credentials = new NetworkCredential { UserName = username, Password = password } };

         // Don't wait to receive a 100 Continue HTTP response from the server before sending out the message body
         ServicePointManager.Expect100Continue = false;

         // Construct the message body
         byte[] messageBody = Encoding.ASCII.GetBytes("status=" + tweet);

         // Send the HTTP headers and message body (a.k.a. Post the data)
         client.UploadData("http://twitter.com/statuses/update.xml", messageBody);
    }
0 голосов
/ 19 октября 2014

Вот еще одно решение с минимальным кодом, использующее превосходный AsyncOAuth пакет Nuget и Microsoft HttpClient. В этом решении также предполагается, что вы публикуете сообщения от своего имени, поэтому у вас уже есть ключ / секрет токена доступа, однако даже если вы этого не сделаете, процесс довольно прост (см. Документы AsyncOauth).

using System.Threading.Tasks;
using AsyncOAuth;
using System.Net.Http;
using System.Security.Cryptography;

public class TwitterClient
{
    private readonly HttpClient _httpClient;

    public TwitterClient()
    {
        // See AsyncOAuth docs (differs for WinRT)
        OAuthUtility.ComputeHash = (key, buffer) =>
        {
            using (var hmac = new HMACSHA1(key))
            {
                return hmac.ComputeHash(buffer);
            }
        };

        // Best to store secrets outside app (Azure Portal/etc.)
        _httpClient = OAuthUtility.CreateOAuthClient(
            AppSettings.TwitterAppId, AppSettings.TwitterAppSecret,
            new AccessToken(AppSettings.TwitterAccessTokenKey, AppSettings.TwitterAccessTokenSecret));
    }

    public async Task UpdateStatus(string status)
    {
        try
        {
            var content = new FormUrlEncodedContent(new Dictionary<string, string>()
            {
                {"status", status}
            });

            var response = await _httpClient.PostAsync("https://api.twitter.com/1.1/statuses/update.json", content);

            if (response.IsSuccessStatusCode)
            {
                // OK
            }
            else
            {
                // Not OK
            }

        }
        catch (Exception ex)
        {
            // Log ex
        }
    }
}

Это работает на всех платформах из-за природы HttpClient. Я использую этот метод на Windows Phone 7/8 для совершенно другого сервиса.

0 голосов
/ 22 октября 2013

Попробуйте TweetSharp . Найти Состояние обновления TweetSharp с примером полного кода мультимедиа работает с Twitter REST API V1.1. Решение также доступно для скачивания.

Пример кода TweetSharp

//if you want status update only uncomment the below line of code instead
        //var result = tService.SendTweet(new SendTweetOptions { Status = Guid.NewGuid().ToString() });
        Bitmap img = new Bitmap(Server.MapPath("~/test.jpg"));
        if (img != null)
        {
            MemoryStream ms = new MemoryStream();
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Seek(0, SeekOrigin.Begin);
            Dictionary<string, Stream> images = new Dictionary<string, Stream>{{"mypicture", ms}};
            //Twitter compares status contents and rejects dublicated status messages. 
            //Therefore in order to create a unique message dynamically, a generic guid has been used

            var result = tService.SendTweetWithMedia(new SendTweetWithMediaOptions { Status = Guid.NewGuid().ToString(), Images = images });
            if (result != null && result.Id > 0)
            {
                Response.Redirect("https://twitter.com");
            }
            else
            {
                Response.Write("fails to update status");
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...