增加ipaddress.com提供者

This commit is contained in:
xljiulang 2021-06-17 22:34:20 +08:00
parent 52b5272c18
commit 2390787863
5 changed files with 152 additions and 43 deletions

View File

@ -17,7 +17,7 @@ namespace FastGithub.Scanner.DomainMiddlewares
private readonly ILogger<DnsDomainAddressProvider> logger; private readonly ILogger<DnsDomainAddressProvider> logger;
public DnsDomainAddressProvider( public DnsDomainAddressProvider(
IOptionsMonitor<GithubOptions> options, IOptionsMonitor<GithubOptions> options,
ILogger<DnsDomainAddressProvider> logger) ILogger<DnsDomainAddressProvider> logger)
{ {
this.options = options; this.options = options;
@ -26,7 +26,7 @@ namespace FastGithub.Scanner.DomainMiddlewares
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync() public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{ {
var setting = this.options.CurrentValue.DnsDomainAddress; var setting = this.options.CurrentValue.DominAddressProvider.DnsDomainAddress;
if (setting.Enable == false) if (setting.Enable == false)
{ {
return Enumerable.Empty<DomainAddress>(); return Enumerable.Empty<DomainAddress>();

View File

@ -0,0 +1,90 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace FastGithub.Scanner.DomainMiddlewares
{
[Service(ServiceLifetime.Singleton, ServiceType = typeof(IDomainAddressProvider))]
sealed class IPAddressComDomainAddressProvider : IDomainAddressProvider
{
private readonly IOptionsMonitor<GithubOptions> options;
private readonly ILogger<IPAddressComDomainAddressProvider> logger;
private readonly Uri lookupUri = new("https://www.ipaddress.com/ip-lookup");
public IPAddressComDomainAddressProvider(
IOptionsMonitor<GithubOptions> options,
ILogger<IPAddressComDomainAddressProvider> logger)
{
this.options = options;
this.logger = logger;
}
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{
var setting = this.options.CurrentValue.DominAddressProvider.IPAddressComDomainAddress;
if (setting.Enable == false)
{
return Enumerable.Empty<DomainAddress>();
}
using var httpClient = new HttpClient();
var result = new List<DomainAddress>();
foreach (var domain in setting.Domains)
{
try
{
var addresses = await this.LookupAsync(httpClient, domain);
foreach (var address in addresses)
{
result.Add(new DomainAddress(domain, address));
}
}
catch (Exception)
{
this.logger.LogWarning($"ipaddress.com无法解析{domain}");
}
}
return result;
}
private async Task<List<IPAddress>> LookupAsync(HttpClient httpClient, string domain)
{
var keyValue = new KeyValuePair<string?, string?>("host", domain);
var content = new FormUrlEncodedContent(Enumerable.Repeat(keyValue, 1));
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = lookupUri,
Content = content
};
var response = await httpClient.SendAsync(request);
var html = await response.Content.ReadAsStringAsync();
var match = Regex.Match(html, @"(?<=<h1>IP Lookup : )\d+\.\d+\.\d+\.\d+", RegexOptions.IgnoreCase);
if (match.Success && IPAddress.TryParse(match.Value, out var address))
{
return new List<IPAddress> { address };
}
var prefix = Regex.Escape("type=\"radio\" value=\"");
var matches = Regex.Matches(html, @$"(?<={prefix})\d+\.\d+\.\d+\.\d+", RegexOptions.IgnoreCase);
var addressList = new List<IPAddress>();
foreach (Match item in matches)
{
if (IPAddress.TryParse(item.Value, out address))
{
addressList.Add(address);
}
}
return addressList;
}
}
}

View File

@ -28,7 +28,7 @@ namespace FastGithub.Scanner.DomainMiddlewares
public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync() public async Task<IEnumerable<DomainAddress>> CreateDomainAddressesAsync()
{ {
var setting = this.options.CurrentValue.MetaDomainAddress; var setting = this.options.CurrentValue.DominAddressProvider.MetaDomainAddress;
if (setting.Enable == false) if (setting.Enable == false)
{ {
return Enumerable.Empty<DomainAddress>(); return Enumerable.Empty<DomainAddress>();

View File

@ -1,7 +1,5 @@
using System; using System;
namespace FastGithub.Scanner namespace FastGithub.Scanner
{ {
[Options("Github")] [Options("Github")]
@ -9,9 +7,7 @@ namespace FastGithub.Scanner
{ {
public ScanSetting Scan { get; set; } = new ScanSetting(); public ScanSetting Scan { get; set; } = new ScanSetting();
public MetaDoaminAddressSetting MetaDomainAddress { get; set; } = new MetaDoaminAddressSetting(); public DomainAddressProviderSetting DominAddressProvider { get; set; } = new DomainAddressProviderSetting();
public DnsDomainAddressSetting DnsDomainAddress { get; set; } = new DnsDomainAddressSetting();
public class ScanSetting public class ScanSetting
{ {
@ -24,21 +20,34 @@ namespace FastGithub.Scanner
public TimeSpan HttpsScanTimeout { get; set; } = TimeSpan.FromSeconds(2d); public TimeSpan HttpsScanTimeout { get; set; } = TimeSpan.FromSeconds(2d);
} }
public class DomainAddressProviderSetting
public class MetaDoaminAddressSetting
{ {
public bool Enable { get; set; } = true; public DnsDomainAddressSetting DnsDomainAddress { get; set; } = new DnsDomainAddressSetting();
public MetaDoaminAddressSetting MetaDomainAddress { get; set; } = new MetaDoaminAddressSetting();
public IPAddressComDomainAddressSetting IPAddressComDomainAddress { get; set; } = new IPAddressComDomainAddressSetting();
public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json"); public class DnsDomainAddressSetting
} {
public bool Enable { get; set; } = true;
public class DnsDomainAddressSetting public string[] Dnss { get; set; } = Array.Empty<string>();
{
public bool Enable { get; set; } = true;
public string[] Dnss { get; set; } = Array.Empty<string>(); public string[] Domains { get; set; } = Array.Empty<string>();
}
public string[] Domains { get; set; } = Array.Empty<string>(); public class MetaDoaminAddressSetting
{
public bool Enable { get; set; } = true;
public Uri MetaUri { get; set; } = new Uri("https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json");
}
public class IPAddressComDomainAddressSetting
{
public bool Enable { get; set; } = true;
public string[] Domains { get; set; } = Array.Empty<string>();
}
} }
} }
} }

View File

@ -10,31 +10,41 @@
"TcpScanTimeout": "00:00:01", // tcp "TcpScanTimeout": "00:00:01", // tcp
"HttpsScanTimeout": "00:00:02" // https "HttpsScanTimeout": "00:00:02" // https
}, },
"MetaDomainAddress": { "DominAddressProvider": {
"Enable": true, "MetaDomainAddress": {
"MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // meta×ÊÔ´uri "Enable": true,
}, "MetaUri": "https://gitee.com/jiulang/fast-github/raw/master/FastGithub/meta.json" // meta×ÊÔ´uri
"DnsDomainAddress": { },
"Enable": true, "IPAddressComDomainAddress": {
"Dnss": [ "Enable": true,
"119.29.29.29", "Domains": [
"180.76.76.76", "github.com",
"8.8.8.8", "api.github.com",
"8.8.4.4", "github.githubassets.com"
"114.114.114.114", ]
"114.114.115.115", },
"223.5.5.5", "DnsDomainAddress": {
"223.6.6.6", "Enable": true,
"1.2.4.8", "Dnss": [
"210.2.4.8", "119.29.29.29",
"208.67.220.220", "180.76.76.76",
"208.67.222.222" "8.8.8.8",
], "8.8.4.4",
"Domains": [ "114.114.114.114",
"github.com", "114.114.115.115",
"api.github.com", "223.5.5.5",
"github.githubassets.com" "223.6.6.6",
] "1.2.4.8",
"210.2.4.8",
"208.67.220.220",
"208.67.222.222"
],
"Domains": [
"github.com",
"api.github.com",
"github.githubassets.com"
]
}
} }
}, },
"Logging": { "Logging": {