maverick1991 Ответов: 2

Получайте прямые сообщения для конкретного пользователя с помощью https://api.twitter.com/1.1/direct_messages.json


Я использую https://api.twitter.com/1.1/direct_messages.json для восстановления сообщений для конкретного пользователя.
Я могу получить 20 сообщений по умолчанию при использовании этого URL-адреса, но когда я хочу ограничить вывод до 20, используя необязательный параметр " count "для этого API, я получаю" удаленный сервер вернул ошибку: (401) Unauthorized. " ошибка.
Пожалуйста, помогите мне в этом сценарии.
Я размещаю свой код здесь.
var oauth_token = "oauth token";
var oauth_token_secret = "oauth token secret";
var oauth_consumer_key = "consumer key";
var oauth_consumer_secret = "consumer secret key";

// oauth implementation details
var oauth_version = "1.0";
var oauth_signature_method = "HMAC-SHA1";

// unique request details
var oauth_nonce = Convert.ToBase64String(
    new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
var timeSpan = DateTime.UtcNow
    - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();

// message api details
var status = "Updating status via REST API if this works";
var resource_url = "https://api.twitter.com/1.1/direct_messages.json";
int count = 1;

// create oauth signature
var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&count={6}";
//for default 20 messages
//var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                //"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&count={6}";

var baseString = string.Format(baseFormat,
                            oauth_consumer_key,
                            oauth_nonce,
                            oauth_signature_method,
                            oauth_timestamp,
                            oauth_token,
                            oauth_version,
                            Uri.EscapeDataString(count.ToString())
                            );

baseString = string.Concat("GET&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString));

var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
                        "&", Uri.EscapeDataString(oauth_token_secret));

string oauth_signature;
using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
{
    oauth_signature = Convert.ToBase64String(
        hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
}

// create the request header
var headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
                   "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
                   "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
                   "oauth_version=\"{6}\"";

var authHeader = string.Format(headerFormat,
                        Uri.EscapeDataString(oauth_nonce),
                        Uri.EscapeDataString(oauth_signature_method),
                        Uri.EscapeDataString(oauth_timestamp),
                        Uri.EscapeDataString(oauth_consumer_key),
                        Uri.EscapeDataString(oauth_token),
                        Uri.EscapeDataString(oauth_signature),
                        Uri.EscapeDataString(oauth_version)
                );

var postBody = "count=" + Uri.EscapeDataString(count.ToString());
resource_url += "?" + postBody;
//for default 20 messages
//var postBody = "count=" + Uri.EscapeDataString(count.ToString());
//resource_url += "?" + postBody;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
request.Headers.Add("Authorization", authHeader);
request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";

WebResponse response = request.GetResponse();
string responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();

Member 13686591

Здравствуйте, с тех пор как вы нашли решение для получения запроса, вам удалось сделать запросы POST и DELETE для работы ?

2 Ответов

Рейтинг:
20

maverick1991

Привет всем, наконец-то я нашел решение своей собственной проблемы.
Просто нужно было исправить baseFormat и baseString.

var baseFormat = " count={6}& oauth_consumer_key={0}& oauth_nonce={1}& oauth_signature_method={2}" +
"& oauth_timestamp={3}& oauth_token={4}& oauth_version={5}";

var baseString = string.Format(baseFormat,
                                       oauth_consumer_key,
                                       oauth_nonce,
                                       oauth_signature_method,
                                       oauth_timestamp,
                                       oauth_token,
                                       oauth_version,
                                       Uri.EscapeDataString(count.ToString())
                                       );


счетчик будет передан до всех параметров.
Спасибо.


Рейтинг:
1

Member 12815787

<pre>  TimelineFormat = "https://api.twitter.com/1.1/direct_messages.json?screen_name="boddupratusha"&include_rts=1&exclude_replies=0&count=5",

Я использовал этот Url-адрес, но не смог прочитать показанные сообщения
The remote server returned an error: (401)
Plz help me out...


maverick1991

можете ли вы поделиться точным url-адресом api вместе с параметрами, с которыми вы пытаетесь его поразить? тогда, может быть, я смогу помочь.