tencent_ocr_probe.dart 2.71 KB
import 'dart:convert';
import 'dart:io';

import 'package:crypto/crypto.dart';

Future<void> main(List<String> args) async {
  const secretId = 'AKID9Vgy8FEC5qSxLcllVCmXzJWaVSI0Z2Nb';
  const secretKey = 'c2c5MTOBo5d9XilhaLzVSG4DE7qRuCJF';
  const service = 'ocr';
  const host = 'ocr.tencentcloudapi.com';
  const version = '2018-11-19';
  const action = 'GeneralBasicOCR';
  const region = 'ap-guangzhou';

  final String imagePath = args.isNotEmpty
      ? args.first
      : '/Users/wangdongni/Desktop/微信图片_2026-09-22_104305_553.jpg';
  final List<int> bytes = await File(imagePath).readAsBytes();
  final String payload = jsonEncode(<String, dynamic>{
    'ImageBase64': base64Encode(bytes),
    'LanguageType': 'zh',
  });

  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:ocr.tencentcloudapi.com\n';
  const signedHeaders = 'content-type;host';
  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();
}