RestSharpを使用して、Web アプリから Twitter のステータスを投稿しようとしています。次のコードは完全に機能します。
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);
ただし、ステータス テキストに次のいずれかの文字を含めると、このコードは認証エラーで失敗します。! * ' ( )
多くのフォーラム トロールを通じて、これは OAuth 署名エンコーディングが POST パラメータのエンコーディングと一致しないことに関係していると推測しました。SO でこの質問を見つけましたが、GitHub で RestSharp の問題を検索しても、何も役に立ちません。
RestSharp のソース( UrlEncodeRelaxed
) に、OAuth エンコーディング仕様に準拠するためにその特定の文字セットを手動でエンコードしているように見えるコードがいくつかあります。 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 のバグですか?