Вопрос
Я пытаюсь обновить статус пользователя в Twitter из моего приложения на C #.
Я поискал в Интернете и нашел несколько возможностей, но меня немного смущает недавнее (?) изменение в процессе аутентификации Twitter.Я также нашел то, что кажется соответствующий пост StackOverflow, но это просто не отвечает на мой вопрос, потому что это сверхспецифичная обработка фрагмента кода, который не работает.
Я пытаюсь получить доступ к REST API, а не к Search API, что означает, что я должен соответствовать более строгой аутентификации OAuth.
Я рассмотрел два решения.В Фреймворк Twitterizer работал нормально, но это внешняя библиотека DLL, и я бы предпочел использовать исходный код.Просто в качестве примера, код, использующий его, очень понятен и выглядит следующим образом:
Twitter twitter = new Twitter("username", "password");
twitter.Status.Update("Hello World!");
Я также исследовал Библиотека Твиттера Йедды, но этот сбой произошел в том, что я считаю процессом аутентификации, при попытке использовать в основном тот же код, что и выше (Yedda ожидает, что имя пользователя и пароль будут указаны в самом обновлении статуса, но все остальное должно быть таким же).
Поскольку я не смог найти четкого ответа в Интернете, я переношу его в StackOverflow.
Какой самый простой способ заставить обновление статуса Twitter работать в приложении на C # без зависимости от внешней DLL?
Спасибо
Решение
Если вам нравится фреймворк Twitterizer, но просто не нравится отсутствие исходного кода, почему бы и нет загрузить исходный код?(Или просмотрите его если вы просто хотите посмотреть, что он делает ...)
Другие советы
Я не сторонник заново изобретать колесо, особенно когда речь идет об уже существующих продуктах, обеспечивающих 100% требуемой функциональности.На самом деле у меня есть исходный код для Твиттеризатор запускаю параллельно мое приложение 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 */}
}
Еще одна библиотека Twitter, которой я успешно пользовался, - это Твитшарп, который предоставляет свободный API.
Исходный код доступен по адресу Код Google.Почему вы не хотите использовать dll?Это, безусловно, самый простой способ включить библиотеку в проект.
Самый простой способ опубликовать материал в Twitter - это использовать базовая аутентификация , что не очень сильно.
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);
}
Попробуй ССЫЛКА На Twitter.Найти ССЫЛКА На Twitter обновить статус с помощью медиа-примера полного кода, который работает с Twitter REST API версии V1.1.Решение также доступно для скачивания.
Пример кода LINQ для Twitter
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);
Попробуй Твитшарп .Найти Статус обновления 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");
}
}
Вот еще одно решение с минимальным количеством кода, использующее превосходный Асинкоавт Пакет 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 для совершенно другого сервиса.