using HtmlAgilityPack;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
namespace Yi.Abp.Tool.Domain
{
public class NugetCrawlerManager : ITransientDependency
{
private const string NugetVersionUrl = "https://www.nuget.org/packages/Yi.Abp.Tool#versions-body-tab";
public NugetCrawlerManager(IDistributedCache cache)
{
//缓存设置1分钟获取一次结果
this.NugetResult = cache.GetOrAdd("NugetResult", () =>
{
return InitData();
}, () =>
{
var options = new DistributedCacheEntryOptions();
options.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(1);
return options;
})!;
}
private HtmlDocument HtmlDoc { get; set; }
private NugetResult NugetResult { get; set; } = new NugetResult();
private NugetResult InitData()
{
NugetResult nugetResult = new NugetResult();
HtmlWeb web = new HtmlWeb();
this.HtmlDoc = web.Load(NugetVersionUrl);
nugetResult.Versions = GetVersionList();
nugetResult.DownloadNumber = GetDownloadNumber();
return nugetResult;
}
public NugetResult GetNugetResult()
{
return this.NugetResult;
}
///
/// 获取版本号列表
///
///
private List GetVersionList()
{
List versions = new List();
var versionDoc = HtmlDoc.DocumentNode.SelectNodes("//*[@id=\"version-history\"]/table/tbody");
var trDoc = versionDoc.First().ChildNodes.Where(x => x.Name == "tr").ToList();
foreach (var tr in trDoc)
{
var version = tr.ChildNodes.Where(x => x.Name == "td").First().ChildNodes.Where(x => x.Name == "a").First().GetAttributes("title").First().Value;
versions.Add(version);
}
return versions;
}
///
/// 获取下载总数
///
///
private long GetDownloadNumber()
{
var spanDoc = HtmlDoc.DocumentNode.SelectNodes("//*[@id=\"skippedToContent\"]/section/div/aside/div[1]/div[2]/div[1]/span[2]");
var downLoadNumber = spanDoc.First().InnerText;
return long.Parse(downLoadNumber);
}
}
public class NugetResult
{
public long DownloadNumber { get; set; }
public List Versions { get; set; }
}
}