c# - 尝试以编程方式构建 Twitter 线程
问题描述
我已经构建了一个在 C# 中工作的 Twitter 应用程序。它是一个向 Twitter API 端点发出 Web 请求的 WPF 或类似 Windows 的应用程序。现在,我有一个业务案例,可以在发送一系列 280 个字符的推文时创建一个 Twitter 线程。由于我们拥有所有业务规则,我无法使用市场上现有的 Twitter 应用程序。
问题是,每当我尝试使用 in_reply_to_status_id_str 发送推文时,我总是会收到未经授权的 401。事实上,每当我尝试添加除了所需的 STATUS 参数之外的任何可选参数时,它都会这样做。我正在使用 OAuth 1.0A。
我正在尝试创建一系列推文,这些推文将在底部显示 Show This Thread 并且可以一起查看。
我提供的方法将在每个 280 个字符段的循环中调用。
注意:我现在有这个工作。我意识到您必须在签名之前订购参数
public async Task<string> TwitterWebRequest(string status, string resource_url, string authHeader, int counter)
{
string id = "";
using (var request = new HttpRequestMessage(HttpMethod.Post, resource_url))
{
request.Headers.TryAddWithoutValidation("Authorization", authHeader);
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var data = new Dictionary<string, string>();
if (counter == 0)
{
data = new Dictionary<string, string>
{
["status"] = status
};
}
else
{
data = new Dictionary<string, string>
{
["in_reply_to_status_id"] = "1169662308278292480",
["status"] = status
};
}
request.Content = new FormUrlEncodedContent(data);
using (HttpResponseMessage response = await client.Value.SendAsync(request))
{
JavaScriptSerializer json = new JavaScriptSerializer();
string responseStream = await response.Content.ReadAsStringAsync();
Dictionary<string, object> jsonObj = json.DeserializeObject(responseStream) as Dictionary<string, object>;
if (counter == 0) { id = jsonObj["id_str"].ToString(); }
if (response.StatusCode == HttpStatusCode.OK) {
return "OK";
}
else { return ""; }
}
}
到目前为止,这就是我为签名所做的事情:
解决方案
这就是我为使它工作所做的。我必须按顺序排列参数。这是 OAuth 的要求,否则您将获得 401 Unauthorized。
private static string CreateBaseString(string oauth_nonce, string oauth_timestamp, string status)
{
string baseFormat = "in_reply_to_status_id=1169662308278292480&oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}"
+ "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}";
string baseString = String.Format(baseFormat, oauth.OAuth_Consumer_Key, oauth_nonce, oauth.OAuth_Signature_Method,
oauth_timestamp, oauth.OAuth_Token, oauth.OAuth_Version, EncodingUtils.UrlEncode(status));
return String.Concat("POST&", EncodingUtils.UrlEncode(oauth.Resource_Url), "&", EncodingUtils.UrlEncode(baseString));
}
推荐阅读
- oracle - 使用 postgres oracle_fdw 成功使用比较运算符
- spring - 如何将多个参数作为列表传递到 JDBC 模板中
- android - 从 Android 中的属性文件显示不同的语言内容
- spring - 如何在spring集成http入站网关中使用spring security
- javascript - 条卡元素中 CVV 编号的密码掩码
- r - 使用 TimeSeries_Generator 进行 LSTM 时间序列预测
- elasticsearch - Elasticsearch:访问由 filebeat 创建的多个索引
- javascript - 如何从 JS 函数调用 Bootstrap 弹出模型?
- django - django 3.0 异步 orm
- woocommerce - 订单状态变化时调用 api