首页 > 解决方案 > 尝试以编程方式构建 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 ""; }
            }
        }

到目前为止,这就是我为签名所做的事情:

标签: c#twitter

解决方案


这就是我为使它工作所做的。我必须按顺序排列参数。这是 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));

    }

推荐阅读