Javascript Twitter OAuth,尝试发布直接消息时出错 我正在构建一个java脚本,它结合C++应用程序来向用户发送直接消息。脚本完成构建我发送的请求的工作。当我发送请求时,我收到“不正确的签名”或“无法验证您的身份”是否有人看到我遗漏了什么或做错了什么?我正在继续调查。先谢谢你
Javascript:Javascript Twitter OAuth,尝试发布直接消息时出错 我正在构建一个java脚本,它结合C++应用程序来向用户发送直接消息。脚本完成构建我发送的请求的工作。当我发送请求时,我收到“不正确的签名”或“无法验证您的身份”是否有人看到我遗漏了什么或做错了什么?我正在继续调查。先谢谢你,javascript,twitter,oauth,Javascript,Twitter,Oauth,Javascript: var nDate = new Date(); var epoch = nDate.getTime(); var nounce = ""; nounce = Base64.encode(epoch+randomString()); var Parameters = [ "oauth_consumerkey="+sConsumerKey, "oauth_nonce="+nounce, "oauth_signature_method=HMAC-SH
var nDate = new Date();
var epoch = nDate.getTime();
var nounce = "";
nounce = Base64.encode(epoch+randomString());
var Parameters = [
"oauth_consumerkey="+sConsumerKey,
"oauth_nonce="+nounce,
"oauth_signature_method=HMAC-SHA1",
"oauth_timestamp="+epoch,
"oauth_token="+sAccessToken,
"oauth_version=1.0",
"text="+sText,
"user="+sUser];
var SortedParameters = Parameters.sort();
var joinParameters = SortedParameters.join("&");
var encodeParameters = escape(joinParameters);
signature_base_string = escape("POST&"+NormalizedURL+"&"+encodeParameters);
signature_key = sConsumerSecret+"&"+sAccessSecret;
signature = Base64.encode(hmacsha1(signature_base_string,signature_key));
sAuthHeader = "
OAuth realm=,
oauth_nonce="+nounce+",
oauth_timestamp="+epoch+",
oauth_consumer_key="+sConsumerKey+",
oauth_signature_method=HMAC-SHA1,
oauth_version=1.0,
oauth_signature="+signature+",
oauth_token="+sAccessToken+",
text="+sText;
goNVOut.Set("Header.Authorization: ", sAuthHeader);
以下是一些需要注意的事项:
- JavaScript的“escape”函数将不适用于OAuth URL编码,根据
unreserved = ALPHA, DIGIT, '-', '.', '_', '~'
JavaScript的转义函数将允许@*+/通过,未转义。我相信这将打破签名过程,因为服务器将逃避这些,并且它计算的HMAC-SHA1值将与您的不同
- 确保URL编码您的基本URI,NormalizedURL,以及
char hexdigit(int ch)
{
assert(ch < 16);
assert(ch >= 0);
if (ch >= 10)
return 'A' + ch - 10;
return '0' + ch;
}
std::string url_encode(const std::string &to_encode)
{
std::stringstream ss;
for (std::string::const_iterator ich = to_encode.begin();
ich != to_encode.end();
++ich)
{
unsigned char ch = (unsigned char)*ich;
if (isalpha(ch) || isdigit(ch) || ch == '-' || ch == '_' || ch == '.' || ch == '~')
{
ss << ch;
}
else
{
ss << '%';
ss << hexdigit(ch >> 4);
ss << hexdigit(ch & 0xf);
}
}
std::string encoded = ss.str();
return encoded;
}
char十六进制数字(int-ch)
{
断言(ch<16);
断言(ch>=0);
如果(ch>=10)
返回'A'+ch-10;
返回“0”+ch;
}
std::string url_encode(const std::string&to_encode)
{
std::stringstream-ss;
for(std::string::const_iterator ich=to_encode.begin();
ich!=to_encode.end();
++(非物质文化遗产)
{
无符号字符ch=(无符号字符)*ich;
如果(isalpha(ch)| isdigit(ch)| | ch='-'.| | | ch='.| | ch='.| | ch='~'))
{
ss需要检查的一件事是确保您的服务器时间与Twitter的时间同步。如果超过5分钟,您的请求将失败。我如何获得Twitter的时间?我一直在缓慢地获得它,它不是完全工作的,但是,当您调用Java脚本获取时间时,我以毫秒为单位提取历元时间。谢谢Abraham!谢谢will,enco丁也给我带来了麻烦。现在我只是在慢慢调试,直到Twitter需要的格式。谢谢你们!!!如果你们不想做任何事情,就这么做