dns添加

This commit is contained in:
谢宇宁
2026-09-17 19:59:46 +07:00
parent 9d6b79429b
commit b29916a6bb
9 changed files with 571 additions and 2 deletions
+42 -2
View File
@@ -4,6 +4,9 @@ import 'dart:async';
import 'package:dio/dio.dart';
import 'package:hgdj/config/config.dart';
import 'package:hgdj/hj_utils/dns_solve/dnsolve.dart';
import 'package:hgdj/hj_utils/light_model.dart';
import 'package:hgdj/hj_utils/store_keys.dart';
import 'package:hgdj/hj_utils/text_util.dart';
import 'package:hgdj/tools_base/debug_log.dart';
import 'package:hgdj/tools_base/net/http_manager.dart';
@@ -36,8 +39,14 @@ class DetectLineManager {
/// 一次完整的批量选线过程
Future<String> _detectLineOnce() async {
//线路只来自 Config.lineList:DNS 解析兜底和本地线路缓存都已去掉
return await _pingCheckBatch(Config.lineList);
final saved = await lightKV.getStringList(StoreKeys.DETECT_LINE);
final lines = saved?.isNotEmpty == true ? saved! : Config.lineList;
var successLine = await _pingCheckBatch(lines);
// 本地线路全部失败,回退 DNS 解析
if (TextUtil.isEmpty(successLine)) {
successLine = await _dnsSolve();
}
return successLine;
}
///检查一批线路:并发 ping,谁先成功用谁;全失败返回 ""
@@ -94,4 +103,35 @@ class DetectLineManager {
}
return resp.isSuccess;
}
//本地域名不通的情况下,使用 dns 解析
Future<String> _dnsSolve() async {
final response = await DNSolve().lookup(
Config.dns,
dnsSec: true,
type: RecordType.txt,
provider: DNSProvider.aliyun,
);
//必须先取出来判空,不能写成 `?? []`:那个空字面量会被推成 List<dynamic>,
//整行 LUB 退化后 record 也成了 dynamic,record.data.split().map().toList()
//一路 dynamic 下去,运行期是 List<dynamic>,传给 setStringList(List<String>) 直接抛。
//全程 dynamic,analyze 一个警告都不会给
final records = response.answer?.records;
if (records == null) return '';
for (final record in records) {
if (record.data.isEmpty) continue;
debugLog("selectLine", "dnsSolve ==== ${record.data}");
//DNS TXT 值带引号,去掉后按 _ 拆成多条线路
final lines = record.data
.split('_')
.map((e) => e.replaceAll("\"", ""))
.where(TextUtil.isNotEmpty)
.toList();
if (lines.isEmpty) continue; // 这条记录没解析出线路,接着看下一条,别直接放弃
lightKV.setStringList(StoreKeys.DETECT_LINE, lines);
return await _pingCheckBatch(lines);
}
return '';
}
}