Некоторые (не все) знаки препинания в твите вызывают ошибку API 32 «Не удалось аутентифицировать вас» - PullRequest
0 голосов
/ 22 марта 2019

Я обрадовался, когда наконец получил некоторый код ASP.NET, говорящий с API Twitter, и он отлично работал при тестировании, создавал твиты любой длины в моей учетной записи, упоминал @usernames и даже твитнул 10 раз в минуту для одной и той же учетной записи.,

Но теперь я получаю код состояния HTTP 401 и этот JSON обратно:
{"errors":[{"code":32, "message":"Could not authenticate you."}]}

Ошибки казались почти случайными, пока я что-то не заметил.Кажется, я никогда не использовал пунктуацию ни в одном из моих предыдущих тестов!Теперь твиты с апострофами, скобками и восклицательными знаками отклоняются, но запятые, дефисы и вопросительные знаки в порядке.

Первая строка этого раздела должна быть моей проблемной областью:

Dim postBody = "media_ids=" & TwitterMediaID & "&status=" & Uri.EscapeDataString(TextOfTheTweet)
System.Net.ServicePointManager.Expect100Continue = False
Dim request As System.Net.HttpWebRequest = System.Net.WebRequest.Create(TwitterStatusPostURL)
request.Headers.Add("Authorization", OAuthSignature)
request.Method = "POST"
request.ContentType = "application/x-www-form-urlencoded"

Я думаю, Uri.EscapeDataString() - неправильный выбор кодировки, хотя я очень благодарен оригинальному автору за этот код, потому что я был бы никуда без них!

Эта функция принимает Apotrophe' exclamation! brackets() question? fullstop. comma, colon: semicolon; hyphen- и возвращает Apotrophe'%20exclamation!%20brackets()%20question%3F%20fullstop.%20comma%2C%20colon%3A%20semicolon%3B%20hyphen-, что явно не то, что хочет видеть Твиттер (или, скорее, это как-то связано с OAuth?).

Согласно замечательная таблица в этом вопросе нет ничего, что кодирует восклицательный знак?!

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

Таким образом, вопрос можно сформулировать так: Почему эта функция не является правильным выбором, и что мы должны использовать? Спасибо.

1 Ответ

0 голосов
/ 22 марта 2019

В документации Twitter API (по состоянию на март 2019 г.) сказано, что я должен использовать RFC 3986 .

Кажется, что старая версия dotNET, которую я использую, не поддерживает RFC 3986 полностью в Uri.EscapeDataString(), и мне потребуется dotNET v4.5 или выше для решения этой проблемы.

В этом ответе на аналогичный вопрос говорится, что я могу самостоятельно составить четыре отсутствующих элемента пунктуации с помощью этой строки:

Regex.Replace(Uri.EscapeDataString(s), "[\!*\'\(\)]", Function(m) Uri.HexEscape(Convert.ToChar(m.Value(0).ToString())))

Лично я чувствую себя комфортно с более читаемой версией:

Uri.EscapeDataString(s).Replace("!", "%21").Replace("'", "%27").Replace("(", "%28").Replace(")", "%29")
...