Flutter 飞镖/颤振-如何获得历代以来的第二名:Twitter API错误代码135(时间戳超出范围)

Flutter 飞镖/颤振-如何获得历代以来的第二名:Twitter API错误代码135(时间戳超出范围),flutter,dart,twitter,timestamp,unix-timestamp,Flutter,Dart,Twitter,Timestamp,Unix Timestamp,你好,我希望你很好。 最近,我在发布tweet时遇到了一个使用twitterapi的问题。 根据文档,我的请求必须在其标头中包含一个字段oauth_timestamp,它是自纪元起的秒数(自Unix纪元起的秒数) 使用Dart(颤振)检索从纪元开始经过的毫秒数,然后除以1000以秒为单位获得该值。 例: 这些值必须用百分比编码,这就是为什么我把 Uri.encodeComponent()方法中的整个日期 但奇怪的是,Twitter API向我发送了一个错误,告诉我我的时间戳超出了范围,我不明白为

你好,我希望你很好。 最近,我在发布tweet时遇到了一个使用twitterapi的问题。 根据文档,我的请求必须在其标头中包含一个字段oauth_timestamp,它是自纪元起的秒数(自Unix纪元起的秒数)

使用Dart(颤振)检索从纪元开始经过的毫秒数,然后除以1000以秒为单位获得该值。 例:

这些值必须用百分比编码,这就是为什么我把 Uri.encodeComponent()方法中的整个日期

但奇怪的是,Twitter API向我发送了一个错误,告诉我我的时间戳超出了范围,我不明白为什么会出现这个错误

{"errors":[{"code":135,"message":"Timestamp out of bounds."}]}
你能帮我解决这个错误吗?告诉我我犯的错误

多谢各位

下面是我使用twitterapi发布tweet的方法

Future<void> tweet() async {
    final httpMethod = 'POST';
    final baseURL = 'https://api.twitter.com/1.1/statuses/update.json';
    final status =
        Uri.encodeComponent('Hello this is my first Tweet using Twitter API');
    final includeEntities = Uri.encodeComponent('true');
    final oAuthConsumerKey = Uri.encodeComponent('my_consumer_key');  //hidded for security purpose
    final consumerSecretKey = Uri.encodeComponent('my_consumer_secret_key');  //hidded for security purpose
    final oAuthNonce = Uri.encodeComponent(generateRandomString());  //METHOD TO GENERATE RANDOM STRING ATTACHED BELOW
    final oAuthSignatureMethod = Uri.encodeComponent('HMAC-SHA1');
    final oAuthTimestamp =
        Uri.encodeComponent('${DateTime.now().millisecondsSinceEpoch / 1000}');

    final accessToken = await _twitterAuthService.accessToken; //GETTING MY CURRENT USER ACCESS TOKEN
    final secretToken = await _twitterAuthService.secretToken; //GETTING MY CURRENT USER SECRET TOKEN
    final oAuthSecretToken = Uri.encodeComponent(secretToken);
    final oAuthToken = Uri.encodeComponent(accessToken);

    final oAuthVersion = Uri.encodeComponent('1.0');

    //THIS MY PERCENTAGE ENCODED FIELDS KEY NAME 
    final includeEntitiesField = Uri.encodeComponent('include_entities');
    final oAuthConsumerKeyField = Uri.encodeComponent('oauth_consumer_key');
    final oAuthNonceField = Uri.encodeComponent('oauth_nonce');
    final oAuthSignatureField = Uri.encodeComponent('oauth_signature');
    final oAuthSignatureMethodField =
        Uri.encodeComponent('oauth_signature_method');
    final oAuthTimestampField = Uri.encodeComponent('oauth_timestamp');
    final oAuthTokenField = Uri.encodeComponent('oauth_token');
    final oAuthVersionField = Uri.encodeComponent('oauth_version');
    final statusField = Uri.encodeComponent('status');

    final parameterString = Uri.encodeComponent(
        '$includeEntitiesField=$includeEntities&$oAuthConsumerKeyField=$oAuthConsumerKey&$oAuthNonceField=$oAuthNonce&$oAuthSignatureMethodField=$oAuthSignatureMethod&$oAuthTimestampField=$oAuthTimestamp&$oAuthTokenField=$oAuthToken&$oAuthVersionField=$oAuthVersion&$statusField=$status');
    final encodedBaseUrl = Uri.encodeComponent(baseURL);

    final signatureBaseString = '$httpMethod&$encodedBaseUrl&$parameterString';

    final signingKey = '$consumerSecretKey&$oAuthSecretToken';

    final hmacSCHA1 = Hmac(sha1, convert.utf8.encode(signingKey))
        .convert(convert.utf8.encode(signatureBaseString));

    final oAuthSignature =
        Uri.encodeComponent(convert.base64.encode(hmacSCHA1.bytes));

    final finalUrl = '$baseURL?$statusField=$status';
    final headerString =
        'OAuth $oAuthConsumerKeyField="$oAuthConsumerKey", $oAuthNonceField="$oAuthNonce", $oAuthSignatureField=$oAuthSignature, $oAuthSignatureMethodField=$oAuthSignatureMethod, $oAuthTimestampField=$oAuthTimestamp, $oAuthTokenField=$oAuthToken, $oAuthVersionField=$oAuthVersion';
    
    final response = await _client.post(finalUrl,
        headers: {Fields.authorization.toLowerCase(): headerString});

    print('REQUEST RESPONSE. \nbody = ${response.body}');
  }
有用链接:和


附言:我取消了hmac-sha1加密

我解决了阻止我使用Twitter API发布推文的问题

首先: 我保留了检索自epoch以来经过的时间(以秒为单位)的方式

final oAuthTimestamp = Uri.encodeComponent('${DateTime.now().millisecondsSinceEpoch / 1000}');
最后第二点:

我从Twitter API中得到一个错误,告诉我
{“errors”:[{“code”:32,“message”:“无法验证您的身份。”}]}

创建参数字符串时,我只是删除了包含\u实体字段

以前

final parameterString = Uri.encodeComponent(
        '$includeEntitiesField=$includeEntities&$oAuthConsumerKeyField=$oAuthConsumerKey&$oAuthNonceField=$oAuthNonce&$oAuthSignatureMethodField=$oAuthSignatureMethod&$oAuthTimestampField=$oAuthTimestamp&$oAuthTokenField=$oAuthToken&$oAuthVersionField=$oAuthVersion&$statusField=$status');
之后

老实说,我不知道为什么这个include_entities字段在身份验证过程中会产生错误。但是在文档中,include_entities=true包含在的步骤中(oauth_签名


所以凭直觉我删除了这个字段,因为我不理解它的作用。然后一切都开始正常工作。现在,当我试图在推特上发
{“errors”:[{“code”:32,“message”:“无法验证您的身份”。}]}
final oAuthTimestamp = Uri.encodeComponent('${DateTime.now().millisecondsSinceEpoch / 1000}');
final parameterString = Uri.encodeComponent(
        '$includeEntitiesField=$includeEntities&$oAuthConsumerKeyField=$oAuthConsumerKey&$oAuthNonceField=$oAuthNonce&$oAuthSignatureMethodField=$oAuthSignatureMethod&$oAuthTimestampField=$oAuthTimestamp&$oAuthTokenField=$oAuthToken&$oAuthVersionField=$oAuthVersion&$statusField=$status');
 final parameterString = Uri.encodeComponent(
        '$oAuthConsumerKeyField=$oAuthConsumerKey&$oAuthNonceField=$oAuthNonce&$oAuthSignatureMethodField=$oAuthSignatureMethod&$oAuthTimestampField=$oAuthTimestamp&$oAuthTokenField=$oAuthToken&$oAuthVersionField=$oAuthVersion&$statusField=$status');