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