Playwright 批量下载 google drive 文件
async System.Threading.Tasks.Task Main(string[] args)
{
    var app = CreateApp(args);

    var logger = this.GetLogger(app);

    var desktop = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    var file = Path.Combine(desktop, "星荣 pdfurls.txt");
    var storeDirectory = Path.Combine(desktop, "星荣笔记");
    Directory.CreateDirectory(storeDirectory);

    // 安装一下
    // Microsoft.Playwright.Program.Main(new string[] { "install" }); 

    using var playwright = await Microsoft.Playwright.Playwright.CreateAsync();

    var proxy = new Microsoft.Playwright.Proxy() { Server = "http://192.168.0.90:17890" };
    await using var browser = await playwright.Chromium.LaunchAsync(new() { Headless = false, Proxy = proxy });

    var page = await browser.NewPageAsync();

    var urls = await File.ReadAllLinesAsync(file);

    foreach (var url in urls) {

        if(string.IsNullOrWhiteSpace(url)){
            continue;
        }

        await page.GotoAsync(url);

        var button = await page.WaitForSelectorAsync(@"//div[@data-tooltip='下载']/div");

        await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(1.5));

        var titles = await page.QuerySelectorAllAsync("//div[@data-tooltip-unhoverable]");
        var title = await this.GetTitleAsync(titles);

        await button.ClickAsync();

        await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(1.5));

        var downlaod = await page.WaitForDownloadAsync();

        //var filePath = await downlaod.PathAsync();

        await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(1.5));

        var pdf = Path.Combine(storeDirectory, title);

        await downlaod.SaveAsAsync(pdf);
    }

}

async System.Threading.Tasks.Task<string> GetTitleAsync(IReadOnlyList<Microsoft.Playwright.IElementHandle> titles)
{
    Microsoft.Playwright.IElementHandle? title = null;

    foreach (var tmp in titles) {

        if(tmp == null){
            continue;
        }

        if (!(await tmp.IsVisibleAsync()))
        {
            continue;
        }

        var box = await tmp.BoundingBoxAsync();
        if (box == null || box.X < 0 || box.Y < 0 || box.Width <= 0 || box.Height <= 0)
        {
            continue;
        }

        var titlebox =  title == null ? null :  await title.BoundingBoxAsync();
        if (titlebox == null || (box.Y < titlebox.Y && box.X < titlebox.X))
        {
            title = tmp;
        }

    }

    if(title != null){

        var checkBox = await title.BoundingBoxAsync();
    }

    var titleValue = await title?.InnerHTMLAsync();

    return titleValue?.Trim() ?? string.Empty;
}

// 返回日志
Microsoft.Extensions.Logging.ILogger GetLogger(Microsoft.Extensions.Hosting.IHost app)
{
    var logger = app.Services.GetRequiredService<ILogger<UserQuery>>();
    return logger;
}

// 创建应用
Microsoft.Extensions.Hosting.IHost CreateApp(string[] args)
{

    Log.Logger = new Serilog.LoggerConfiguration().WriteTo.LINQPad(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message}{NewLine}{Exception}").CreateLogger();

    Microsoft.Extensions.Hosting.HostApplicationBuilder builder = Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(args);
    builder.Services.AddLogging(it =>
    {
        it.ClearProviders();
        it.AddSerilog(dispose: true);
    });

    var app = builder.Build();

    return app;
}
上一篇
下一篇