当我终于得到一些与Twitter API进行通信的ASP.NET代码时,我感到很高兴,它在测试时表现完美,在我的帐户上创建了任意长度的tweet,提到了@username,甚至每分钟向同一帐户发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()
是编码的错误选择,尽管我非常感谢original author的这段代码,因为没有它们我将无处可寻!
此函数接受Apotrophe' exclamation! brackets() question? fullstop. comma, colon: semicolon; hyphen-
并返回Apotrophe'%20exclamation!%20brackets()%20question%3F%20fullstop.%20comma%2C%20colon%3A%20semicolon%3B%20hyphen-
,这显然不是Twitter想要看到的(或者,这与OAuth有关吗?)。
根据the wonderful table in this SO question,没有什么可以编码感叹号了!!
我应该能够自己找到一个更好的函数,但是我很想确切地了解这里存在的问题,并且可以放心,我了解哪些编码函数适合于哪个工作。对于将来添加标点符号的程序员也需要进行记录。
所以问题可以概括为:为什么这个功能不是正确的选择,我们应该使用什么?谢谢。
答案 0 :(得分:0)
Twitter API文档(截至2019年3月)说,我必须使用 RFC 3986 。
似乎我使用的旧版dotNET在Uri.EscapeDataString()
中不完全支持 RFC 3986 ,因此我需要dotNET v4.5或更高版本来解决该问题。 / p>
This answer to a similar question说,我可以使用这种单线内容来弥补四个缺少的标点符号:
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")