tencent_tc3_probe.dart 2.44 KB
import 'dart:convert';
import 'dart:io';

import 'package:crypto/crypto.dart';

Future<void> main() async {
  const secretId = 'AKID9Vgy8FEC5qSxLcllVCmXzJWaVSI0Z2Nb';
  const secretKey = 'c2c5MTOBo5d9XilhaLzVSG4DE7qRuCJF';
  const service = 'asr';
  const host = 'asr.tencentcloudapi.com';
  const version = '2019-06-14';
  const action = 'GetAsrVocabList';
  const region = 'ap-guangzhou';
  const payload = '{}';

  final int ts = DateTime.now().millisecondsSinceEpoch ~/ 1000;
  final String date = DateTime.fromMillisecondsSinceEpoch(ts * 1000, isUtc: true)
      .toIso8601String()
      .substring(0, 10);

  final String hashedPayload = sha256.convert(utf8.encode(payload)).toString();
  const canonicalHeaders = 'content-type:application/json; charset=utf-8\n'
      'host:asr.tencentcloudapi.com\n'
      'x-tc-action:getasrvocablist\n';
  const signedHeaders = 'content-type;host;x-tc-action';
  final String canonicalRequest = 'POST\n/\n\n$canonicalHeaders\n$signedHeaders\n$hashedPayload';
  final String hashedCanonicalRequest = sha256.convert(utf8.encode(canonicalRequest)).toString();

  final String credentialScope = '$date/$service/tc3_request';
  final String stringToSign = 'TC3-HMAC-SHA256\n$ts\n$credentialScope\n$hashedCanonicalRequest';

  final List<int> secretDate = Hmac(sha256, utf8.encode('TC3$secretKey')).convert(utf8.encode(date)).bytes;
  final List<int> secretService = Hmac(sha256, secretDate).convert(utf8.encode(service)).bytes;
  final List<int> secretSigning = Hmac(sha256, secretService).convert(utf8.encode('tc3_request')).bytes;
  final String signature = Hmac(sha256, secretSigning).convert(utf8.encode(stringToSign)).toString();

  final String authorization = 'TC3-HMAC-SHA256 '
      'Credential=$secretId/$credentialScope, '
      'SignedHeaders=$signedHeaders, '
      'Signature=$signature';

  final HttpClient client = HttpClient();
  final HttpClientRequest req = await client.postUrl(Uri.parse('https://$host/'));
  req.headers.set('Authorization', authorization);
  req.headers.set('Content-Type', 'application/json; charset=utf-8');
  req.headers.set('Host', host);
  req.headers.set('X-TC-Action', action);
  req.headers.set('X-TC-Timestamp', '$ts');
  req.headers.set('X-TC-Version', version);
  req.headers.set('X-TC-Region', region);
  req.write(payload);
  final HttpClientResponse res = await req.close();
  final String body = await res.transform(utf8.decoder).join();
  print('HTTP ${res.statusCode}');
  print(body);
  client.close();
}