Невозможно использовать Twitter API для публикации специальных символов - PullRequest
1 голос
/ 07 мая 2020

Я создаю твиттер-бота, который использует их API. Единственный пакет, который я использую, это RestSharp. Если возможно, мне нужно решение, в котором я не использую вспомогательный пакет.

Это мой код:

static bool tweet(string tweetstr)
{
    RestClient client = new RestClient("https://api.twitter.com");

    RestRequest r = new RestRequest("/1.1/statuses/update.json", Method.POST);

    //tweetstr = WebUtility.UrlEncode(tweetstr);
    //r.AddParameter("status", tweetstr, ParameterType.QueryStringWithoutEncode);
    r.AddQueryParameter("status", tweetstr);

    client.Authenticator = OAuth1Authenticator.ForProtectedResource(API_key, API_secret_key, access_token, access_token_secret);

    IRestResponse res = client.Execute(r);

    if (res.StatusCode == System.Net.HttpStatusCode.OK)
    {
        Console.WriteLine(DateTime.Now.ToString() + " Tweeted: " + tweetstr);
        return true;
    }
    else
    {
        Console.WriteLine("Couldn't tweet!\nError code: " + res.StatusCode.ToString() + "\nTried to tweet: " + tweetstr + "\nResponse: " + res.Content.ToString());
        return false;
    }
}

Теперь по какой-то причине это работает, если я не использую специальные символов в строке (например, иностранный язык или даже восклицательный знак), если я это сделаю, он вернет несанкционированную ошибку с сообщением «Не удалось аутентифицировать вас».

Например, вызов tweet("testing") будет работать нормально, но вызов tweet("testing!") вернет ошибку.

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

Помощь? Спасибо заранее!

1 Ответ

1 голос
/ 08 мая 2020

Предыдущий ответ заменен

Похоже, ваш исходный код близок. Вместо этого:

r.AddQueryParameter("status", tweetstr);

Используйте это:

r.AddParameter("status", tweetstr, ParameterType.GetOrPost);

Метод AddQueryParameter, похоже, неправильно кодирует специальные символы. Параметры должны быть экранированы и закодированы в UTF8, и попытка сделать это за пределами кода, создающего URL-адрес, и OAuth в этом случае не работал. К счастью, AddParameter, похоже, справляется с этим должным образом.

...