config.example.json 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. {
  2. "api": {
  3. "url": "https://example.com/api/domains",
  4. "method": "GET",
  5. "headers": {
  6. "Authorization": "Bearer <token>"
  7. },
  8. "params": {},
  9. "timeout_sec": 10
  10. },
  11. "parser": {
  12. "field_paths": [
  13. "data.good[].ip"
  14. ],
  15. "json_paths": [],
  16. "regex": "[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}"
  17. },
  18. "record_mapping": {
  19. "_comment_required": "必填。记录白名单注册表:所有在过滤/排序里会用到的 API 字段都必须先在 field_map 注册,否则会 fail-fast。",
  20. "records_path": "data.good[]",
  21. "field_map": {
  22. "domain": "ip",
  23. "created_at": "createdTime",
  24. "avg_score": "avgScore"
  25. },
  26. "created_time_formats": [
  27. "%Y-%m-%d %H:%M:%S"
  28. ],
  29. "created_time_timezone": "UTC"
  30. },
  31. "record_filter": {
  32. "_comment": "可选。域名记录过滤规则。enabled=true 时生效。exclude_if_any 中满足任一条件即排除该记录",
  33. "enabled": false,
  34. "exclude_if_any": [
  35. {
  36. "field": "domain",
  37. "regex": "(test|staging)",
  38. "case_sensitive": false
  39. }
  40. ]
  41. },
  42. "domain_filter": {
  43. "include_suffixes": [
  44. ".example.com"
  45. ],
  46. "exclude_regex": []
  47. },
  48. "scoring": {
  49. "_comment_required": "enabled=true 时必须配置 strategy。weighted_average 需 weighted_fields;lexicographic 需 lexicographic_fields。",
  50. "enabled": true,
  51. "strategy": "weighted_average",
  52. "weighted_fields": [
  53. {
  54. "field": "avg_score",
  55. "weight": 0.5
  56. },
  57. {
  58. "field": "yd_score",
  59. "weight": 0.2
  60. },
  61. {
  62. "field": "dx_score",
  63. "weight": 0.1
  64. },
  65. {
  66. "field": "lt_score",
  67. "weight": 0.2
  68. }
  69. ],
  70. "lexicographic_fields": [
  71. {
  72. "field": "avg_score",
  73. "order": "desc"
  74. },
  75. {
  76. "field": "created_at",
  77. "order": "desc"
  78. }
  79. ],
  80. "prefer_lower": true,
  81. "within_hours": 24,
  82. "tie_breakers": [
  83. {
  84. "field": "domain",
  85. "order": "asc"
  86. }
  87. ]
  88. },
  89. "healthcheck": {
  90. "enabled": false,
  91. "attempts": 5,
  92. "timeout_ms": 1800,
  93. "port": 443,
  94. "tls_verify": true
  95. },
  96. "selection": {
  97. "top_n": 3
  98. },
  99. "output": {
  100. "runtime_dir": "./runtime",
  101. "current_domain_file": "current_domain.txt",
  102. "current_domain_json": "current_domain.json",
  103. "state_file": "state.json",
  104. "substore_vars_file": "substore_vars.json"
  105. },
  106. "v2ray": {
  107. "template_file": "",
  108. "output_file": "",
  109. "replace_token": "__AUTO_DOMAIN__"
  110. },
  111. "notify": {
  112. "command": ""
  113. }
  114. }