2013-04-07 1 views
7

RestSharpを使用して、私のWebアプリケーションからTwitterステータスを投稿しようとしています。次のコードは完璧に動作します:RestSharpとTwitter API 1.1:ステータス更新テキストを正しく入力するにはどうすればよいですか?

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); 

をしかし、私はステータステキストで次の文字のいずれかの含まれている場合、このコードは認証エラーで失敗:フォーラムトロールの多くを通じて! * ' ()

を、Iこれは、POSTパラメータのエンコーディングと一致しないOAuthシグネチャのエンコーディングと関係があると推測しました。 this question on SOが見つかりましたが、GitHubのRestSharpの問題を検索すると何も役立ちません。

OAuthエンコーディング仕様に準拠するために、その特定の文字セットを手動でエンコードしていると思われるsome code in the RestSharp sourceUrlEncodeRelaxed)がありますので、同じ方法で自分のステータスでこれらの文字を手動でエンコードしようとしましたRestSharpから):

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]); 

しかし、これは動作しません(まだ認証エラーが発生します)。

ここでは実際にどのような問題がありますか、ステータスを正しくエンコードするにはどうすればよいですか?それともRestSharpのバグですか?

+0

解決方法は見つかりましたか?私は今これに取り組もうとしています。 –

+0

@Michael_Bいいえ、申し訳ありません:私はそれを調べ始めましたが、他の優先事項が途中で得られるまでにはあまり遠くまでは行きませんでした。 –

+0

ステータス更新のためにLinq2Twitterを使用しました。これはTwitter APIのv1.1で動作します。私はRestSharpのOAuthの問題の周りに方法を見つけたことはありません。 –

答えて

2

.NET Frameworkに組み込まれているHttpUtilityクラスを使用してみましたか?これはSystem.Web名前空間で見つけることができます。

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

MSDN


これは間違いなくRestSharpの問題です...私はしばらくの間、それを周りに演奏し、問題は、標準のパーセントエンコーディングを無効にするには、とにかくそこにないということです。.. 。

フィドラーで
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); 


} 

私は... Twitterへ行くの要求を監視してきたし、これは私が見つけたものです...

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 

Httpリクエストの問題は、私のリクエストの本文...私が提供した価値には触れられていませんでした...そして、Twitterはメッセージを認識し、私たちのステータスを更新しました....

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

要点は、* no *エンコーディングの方法がそれを動作させることです:組み込み、手動またはその他。それは、それが内部RestSharpの問題だと私に信じさせる。しかし、まだ解決していない... –

+0

私はちょうどそれをすべてチェックした...そしてはい..それはRestSharpの問題です...何が起こっているかを説明するために上記の私の答えを更新... –

+0

これは便利です、ありがとうございます - RestSharpのソースを調べて、解決策を見つけ出すことができるかどうかを確認します。 –

関連する問題