2013-04-07 14 views
7

Próbuję opublikować status Twittera z mojej aplikacji internetowej, używając RestSharp. Poniższy kod działa perfekcyjnie:RestSharp and Twitter API 1.1: Jak poprawnie zaktualizować tekst statusu URLEncode?

var status = "I am fine with posting this status."; 

var client = new RestClient("https://api.twitter.com"); 

// The OAuth keys/tokens/secrets are retrieved elsewhere 
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
    _consumerKey, _consumerSecret, _accessToken, _accessTokenSecret 
); 

var request = new RestRequest("/1.1/statuses/update.json", Method.POST); 
request.AddParameter("status", status, ParameterType.GetOrPost); 

var response = client.Execute(request); 

Jednak ten kod nie powiedzie się z powodu błędu uwierzytelniania gdybym zawierać żadnego z następujących znaków w tekście Status: ! * ' ()

Poprzez partii z forum trałowania, ja Wywnioskowałem, że ma to coś wspólnego z kodowaniem podpisów OAuth, które nie pasuje do kodowania parametrów POST. Znalazłem this question on SO, ale poszukiwanie problemów RestSharp na GitHubie nie przynosi nic pożytecznego.

Widzę some code in the RestSharp source (UrlEncodeRelaxed), który wydaje się kodować ręcznie ten konkretny zestaw znaków, aby zachować zgodność ze specyfikacjami kodowania OAuth, więc próbowałem ręcznie kodować te znaki w moim statusie w ten sam sposób (za pomocą kodu z RestSharp) przed jego wprowadzeniem, np .:

var status = "I'm NOT fine with posting this status."; 

string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" }; 
string[] UriRfc3968EscapedHex = new[] { "%21", "%2A", "%27", "%28", "%29" }; 

for (var i = 0; i < UriRfc3986CharsToEscape.Length; i++) 
    status = status.Replace(UriRfc3986CharsToEscape[i], UriRfc3968EscapedHex[i]); 

Ale to też nie działa (nadal otrzymuję błąd uwierzytelnienia).

Co tak naprawdę jest problemem i co należy zrobić, aby poprawnie zakodować status? Czy to jest błąd RestSharp?

+0

Czy znalazłeś rozwiązanie lub obejść? Próbuję rozwiązać to teraz. –

+0

@Michael_B Nie, przepraszam: zacząłem zaglądać w to, ale nie dotarłem zbyt daleko, zanim inne priorytety staną na drodze. –

+0

Skończyło się na używaniu Linq2Twitter do aktualizacji statusu. Działa z wersją 1 interfejsu API Twittera. Nigdy nie znalazłem sposobu na problemy z OAuth RestSharp. –

Odpowiedz

2

Czy próbowałeś używać klasy HttpUtility wbudowanej w .NET Framework? Możesz go znaleźć w przestrzeni nazw System.Web.

string urlEncodedText = HttpUtility.UrlEncode("Your text goes here"); 

MSDN


Jest to z pewnością kwestia RestSharp ... Grałem się z nim na chwilę, a problemem jest to, że nie ma w każdym razie, aby wyłączyć kodowanie standardowe proc .. .

void Main() 
{ 
    var ProtectedChars = "0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A".Replace(" 0x", "%").Split(','); 
    var client = new RestClient("https://api.twitter.com"); 

    client.Authenticator = OAuth1Authenticator.ForProtectedResource(
     "_consumerKey", "_consumerSecret", "_accessToken", "_accessTokenSecret" 
    ); 

    var status = "Dogs, Cats & Mice"; 

    string newStatus = string.Empty; 

    foreach (char c in status) 
    { 
     var charBytes = Encoding.UTF8.GetBytes(c.ToString()); 
     var tempText = string.Empty; 

     for (int i = 0; i < charBytes.Count(); i++) 
     { 
      byte b = charBytes[i]; 
      string hex = "%" + b.ToString("X2"); 
      tempText += hex; 
     } 

     if (ProtectedChars.Any(x => x == tempText)) 
     { 
      newStatus += c; 
     } 
     else 
     { 
      newStatus += string.Format("{0:X2}", tempText); 
     } 
    } 

    var request = new RestRequest("/1.1/statuses/update.json", Method.POST); 
    request.AddParameter(new Parameter{ Name = "status", Type = ParameterType.GetOrPost, Value = newStatus }); 

    var response = client.Execute(request); 


} 

W Skrzypek Byłem monitorowania żądań wykraczających na Twitterze ... i to co znalazłem ...

POST https://api.twitter.com/1.1/statuses/update.json HTTP/1.1 
Authorization: /* auth data */ 
Accept: application/json, application/xml, text/json, text/x-json, text/javascript, text/xml 
User-Agent: RestSharp/104.4.0.0 
Content-Type: application/x-www-form-urlencoded 
Host: api.twitter.com 
Content-Length: 44 
Accept-Encoding: gzip, deflate 

status=Dogs%252C%2520Cats%2520%2526%2520Mice 

Problem z żądaniem HTTP jest treścią naszej prośby ... gdyby podana wartość nie została dotknięta ... wtedy Twitter rozpoznałby wiadomość i zaktualizował nasz status ...

status=Dogs%252C%2520Cats%2520%2526%2520Mice <--- Altered by RestSharp 
status=Dogs%2C%20Cats%20%26%20Mice   <--- What I initially sent 
+0

Chodzi o to, że * nie * metoda kodowania sprawia, że ​​działa: wbudowany, ręczny lub w inny sposób. Co prowadzi mnie do przekonania, że ​​jest to wewnętrzny problem RestSharp. Nadal go nie rozwiązałem, ale ... –

+0

Właśnie sprawdziłem to wszystko ... i tak ... to jest problem RestSharp ... Zaktualizowałem moją odpowiedź powyżej, aby wyjaśnić, co się dzieje ... –

+0

Jest to przydatne , dziękuję - sprawdzę źródło RestSharp i zobaczę, czy uda mi się znaleźć poprawkę. –