c# - 使用 RestSharp 和 oAuth1.0a 将状态发布到 Twitter 时未经授权的访问
问题描述
编辑:我最初的问题与防火墙问题有关,现在我的问题在我的授权范围内。使用以下两种方法,我都会收到“未经授权”的回复。
我正在尝试创建一种允许我将状态更新发布到 twitter 的方法。我正在尝试在我的应用程序中使用,这样我就可以知道一天中某些事件何时发生,而无需监视日志,所以我认为这将是一种很酷的推送通知的方式。我能想到的唯一其他选择是电子邮件通知,但想尝试不同的东西(对推送通知的任何其他想法持开放态度)
我一天中的大部分时间都在努力让这段代码正常工作。我一直在审查的大多数关于此的示例和问题都很古老。下面是我正在运行的代码。
Response.StatusCode = 0 和 Response.Content 是空白的,我无法弄清楚我在这里做错了什么。没有抛出异常,所以响应必须被执行,但不返回任何东西。
我已按照此处的指南创建签名。 https://developer.twitter.com/en/docs/basics/authentication/oauth-1-0a/creating-a-signature
欢迎任何反馈,我想知道是否有任何明显的我做错了。
一旦我有了解决方案,我希望将它分享出去,一旦它被更多的评论清理干净。
使用下面的代码
Tweet t = new Tweet();
t.TestTweet();
额外的命名空间
using RestSharp;
using System.Security.Cryptography;
班级
class Tweet
{
private string myFirstMessage = "First Message Using RestSharp";
private const string baseTwitterURL = "https://api.twitter.com/1.1/statuses/update.json";
//Keys in Alphabetical Order
private string oauth_consumer_key = GlobalVariables.ConsumerKey;
private string oauth_nonce = "abcd";
private string oauth_signature;
private string oauth_signature_method = "HMAC-SHA1";
private string oauth_timestamp;
private string oauth_token = GlobalVariables.Token;
private string oauth_version = "1.0";
private string ConsumerKeySecret = GlobalVariables.ConsumerKeySecret;
private string AccessTokenSecret = GlobalVariables.AccessTokenSecret;
public Tweet()
{
DateTime epochUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var timestamp = (int)((DateTime.UtcNow - epochUtc).TotalSeconds);
oauth_timestamp = timestamp.ToString();
}
public void TestTweet()
{
string fullURL = baseTwitterURL + Uri.EscapeDataString(myFirstMessage);
var client = new RestClient(fullURL);
var request = new RestRequest(Method.POST);
string parameterString = GenerateParameterString(oauth_consumer_key, oauth_nonce, oauth_signature_method, oauth_timestamp, oauth_token, oauth_version);
string signatureBaseString = GenerateSignatureBaseString(parameterString);
string signingKey = GenerateSigningKey();
HMACSHA1 mySignature = new HMACSHA1();
oauth_signature = Convert.ToBase64String(mySignature.ComputeHash(new ASCIIEncoding().GetBytes(string.Format("{0}&{1}", signatureBaseString, signingKey))));
request.AddHeader("authorization", "OAuth");
request.AddParameter("oauth_consumer_key", oauth_consumer_key);
request.AddParameter("oauth_nonce", oauth_nonce);
request.AddParameter("oauth_signature", oauth_signature);
request.AddParameter("oauth_signature_method", oauth_signature_method);
request.AddParameter("oauth_timestamp", oauth_timestamp);
request.AddParameter("oauth_token", oauth_token);
request.AddParameter("oauth_version", oauth_version);
string requestString = string.Join(",", request.Parameters.ToList());
try
{
Console.WriteLine("Attemping to send response" + "\n");
IRestResponse response = client.Execute(request);
}
catch (Exception Ex)
{
Console.WriteLine("Exception Ex.Message: " + Ex.Message);
Console.WriteLine("Exception Ex.ToString: " + Ex.ToString());
}
}
public string GenerateParameterString(
string oauth_consumer_key,
string oauth_nonce,
string oauth_signature_method,
string oauth_timestamp,
string oauth_token,
string oauth_version)
{
StringBuilder parameterString = new StringBuilder();
parameterString.Append("include_entities=true&");
parameterString.Append("oauth_consumer_key=" + Uri.EscapeDataString(oauth_consumer_key) + "&");
parameterString.Append("oauth_nonce=" + Uri.EscapeDataString(oauth_nonce) + "&");
parameterString.Append("oauth_signature_method=" + Uri.EscapeDataString(oauth_signature_method) + "&");
parameterString.Append("oauth_timestamp=" + Uri.EscapeDataString(oauth_timestamp) + "&");
parameterString.Append("oauth_token=" + Uri.EscapeDataString(oauth_token) + "&");
parameterString.Append("oauth_version=" + Uri.EscapeDataString(oauth_version) + "&");
parameterString.Append("status=" + Uri.EscapeDataString(myFirstMessage));
return parameterString.ToString();
}
public string GenerateSignatureBaseString(string parameterString)
{
StringBuilder SignatureBaseString = new StringBuilder();
SignatureBaseString.Append("POST&");
SignatureBaseString.Append(Uri.EscapeDataString(baseTwitterURL));
SignatureBaseString.Append("&");
SignatureBaseString.Append(Uri.EscapeDataString(parameterString));
return SignatureBaseString.ToString();
}
public string GenerateSigningKey()
{
StringBuilder SigningKey = new StringBuilder();
SigningKey.Append(Uri.EscapeDataString(ConsumerKeySecret));
SigningKey.Append("&");
SigningKey.Append(Uri.EscapeDataString(AccessTokenSecret));
return SigningKey.ToString();
}
}
编辑:RestSharp OAuth1Authenticator 方法
public void TestTweetWithAuthenticator()
{
string fullURL = baseTwitterURL;
var client = new RestClient(fullURL)
{
Authenticator = OAuth1Authenticator.ForProtectedResource(oauth_consumer_key, ConsumerKeySecret, oauth_token, AccessTokenSecret)
};
var request = new RestRequest(Method.POST);
request.AddParameter("status", Uri.EscapeDataString(myFirstMessage));
try
{
Console.WriteLine("Attemping to send response" + "\n");
IRestResponse response = client.Execute(request);
}
catch (Exception Ex)
{
}
}
解决方案
推荐阅读
- swift - 类型 'NSArray?.Type' 不符合协议 'Sequence'
- python - 如何在 Keras 中包含 tf.py_func 代码?
- qt - QHttpMultiPart 上传文件边界问题
- erlang - 如何在 Erlang/Elixir 中获取完全合格的域名(或只是域名)?
- mysql - PASSWORD() 类似 MySQL 8.0 的功能,可插入身份验证
- c# - 获取分区计数的非昂贵、有效的方法
- javascript - 当多次使用相同的 React 组件时,将其分配给变量是否更高效?
- python - Django Rest 框架:一个 URL 用于 POST,一个 URL 用于同一 APIView 上的 GET
- python - psycopg2 - 更新 Json 列时如何转义单引号?
- java - java中基于名称或ID的未来取消