Javascript Twitter OAuth,尝试发布直接消息时出错 我正在构建一个java脚本,它结合C++应用程序来向用户发送直接消息。脚本完成构建我发送的请求的工作。当我发送请求时,我收到“不正确的签名”或“无法验证您的身份”是否有人看到我遗漏了什么或做错了什么?我正在继续调查。先谢谢你

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

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-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编码,根据
5.1。参数编码

所有参数名称和值都是 使用[RFC3986] 百分比编码(%xx)机制。 不在非保留字段中的字符 字符集([RFC3986]第2.3节) 必须进行编码。小说中的人物 不能使用未保留的字符集 编码的。中的十六进制字符 编码必须是大写。正文 名称和值必须编码为 百分比编码前的UTF-8八位字节 按照[RFC3629]的要求进行

        unreserved = ALPHA, DIGIT, '-', '.', '_', '~'
JavaScript的转义函数将允许@*+/通过,未转义。我相信这将打破签名过程,因为服务器将逃避这些,并且它计算的HMAC-SHA1值将与您的不同

  • 确保URL编码您的基本URI,NormalizedURL,以及
我发现获得正确的编码是OAuth中最乏味的部分。确保在新的“url_encode”函数中使用大写字母

这是我的C++代码来做URL编码。它可以优化一点,但应该很容易理解

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需要的格式。谢谢你们!!!如果你们不想做任何事情,就这么做