400 неверных запросов на HttpWebRequest в VB.Net с API-интерфейсом Twitter для разработчиков - PullRequest
1 голос
/ 22 октября 2019

Я только начал использовать API разработчика Twitter и у меня возникли некоторые проблемы с ним.

Не вдаваясь в подробности моего кода, я знаю, что проблема заключается в HttpWebRequest:


...

'create WebRequest
Dim request As WebRequest = HttpWebRequest.Create(urlFinal)
request.PreAuthenticate = True
request.Method = URL_METHOD
request.Headers.add("authorization", authString)
request.ContentType = "application/json"

'execute it and open reader
Dim response As WebResponse = request.GetResponse()
Dim reader As StreamReader = New StreamReader(response.GetResponseStream())

'parse WebResponse into String to use it...
Dim rawresp As String
rawresp = reader.ReadToEnd()

...

URL_METHOD - "GET", и я объясню свою строку authString ниже. URL-адрес является переменным, но может выглядеть примерно так: https://api.twitter.com/1.1/search/tweets.json?q=abc.

При каждом выполнении я получаю сообщение об ошибке «400 - неверный запрос» в строке

Dim response As WebResponse = request.GetResponse()

Я провел некоторое исследованиеон обнаружил, что это либо проблема с URL-адресом, либо с аутентификацией.

URL-адрес в порядке, это можно легко проверить с помощью точек останова в режиме отладки. Когда я открываю URL в браузере, я получаю сообщение об ошибке:

{"errors":[{"code":215,"message":"Bad Authentication data."}]}

Так что это должна быть аутентификация.

Вот как выглядит моя строка authString:

Dim authString As String = "OAuth"
authString += " oauth_consumer_key=""" & OAUTH_KEY & """"
authString += ", oauth_nonce=""" & OAUTH_NONCE & """"
authString += ", oauth_signature=""" & OAUTH_SIGN & """"
authString += ", oauth_signature_method=""" & OAUTH_SIGN_METHOD & """"
authString += ", oauth_timestamp=""" & OAUTH_TIMESTAMP & """"
authString += ", oauth_token=""" & OAUTH_TOKEN & """"
authString += ", oauth_version=""" & OAUTH_VERSION & """"

Я также проверял это во время выполнения и получаю следующее:

OAuth oauth_consumer_key="xxx", oauth_nonce="xxx", oauth_signature="xxx", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1571760986", oauth_token="xxx", oauth_version="1.0"

OAUTH_TOKEN (токен доступа) и OAUTH_KEY (ключ API) приходят отсюда:

Twitter keys

OAUTH_NONCE (Nonce) и OAUTH_TIMESTAMP (отметка времени) вычисляются следующим образом:

OAUTH_NONCE = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
OAUTH_TIMESTAMP = Convert.ToInt64((DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds).ToString()

OAUTH_SIGN (подпись), например так:

Dim baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&status={6}"
Dim baseString = String.Format(baseFormat, OAUTH_KEY, OAUTH_NONCE, OAUTH_SIGN_METHOD, OAUTH_TIMESTAMP, OAUTH_TOKEN, OAUTH_VERSION, Uri.EscapeDataString(URL_METHOD))
baseString = String.Concat(URL_METHOD & "&", Uri.EscapeDataString(URL_BASE), "&", Uri.EscapeDataString(baseString))

Dim compositeKey = String.Concat(Uri.EscapeDataString(OAUTH_KEY_SECRET), "&", Uri.EscapeDataString(OAUTH_TOKEN_SECRET))
Using hasher As New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
    OAUTH_SIGN = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
End Using

Метод подписи и версия OAuth жестко заданы (см. выше, вам, возможно, придется прокрутить вправо).

Может кто-нибудь объяснить мне, где ошибка?

Я ценю каждый ответ и хочу попробовать все, япросто больше не имею никакой идеи.

Заранее большое спасибо.

Бен

...