可直接运行的 Playwright C# 自动化模板

发布于:2025-08-11 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

目录结构

1. appsettings.json(账号、URL、路径配置)

2. Program.cs(启动入口)

3. SchedulerConfig.cs(定时调度)

4. SocialSecurityTask.cs(自动报社保任务)

5. QuerySocialDataTask.cs(查询导出任务)

6. PublishCsdnTask.cs(发布 CSDN 文章)

7. 后续可加功能


可直接运行的 Playwright C# 自动化模板,里面包含:

  • 报社保任务(模拟登录 → 上传 Excel)
  • 查询导出任务(模拟登录 → 查询 → 下载 Excel)
  • 发布文章任务(自动登录 → 填写标题与内容 → 发布)
  • Quartz.NET 定时调度(可配置执行周期)
  • 配置文件管理(账号、密码、URL、文件路径)
  • 日志记录 & 截图保存
  • 验证码识别预留接口(可以后续接 Python OCR)

目录结构

AutoTasks/
 ├── AutoTasks.csproj
 ├── appsettings.json         // 配置账号密码
 ├── Program.cs               // 启动调度器
 ├── SchedulerConfig.cs       // Quartz 调度配置
 ├── Tasks/
 │    ├── SocialSecurityTask.cs // 报社保任务
 │    ├── QuerySocialDataTask.cs // 查询导出任务
 │    ├── PublishCsdnTask.cs    // 发布任务
 ├── Services/
 │    ├── OcrService.cs         // 验证码识别接口(可接Python)
 │    ├── ExcelService.cs       // Excel处理
 │    ├── AiContentService.cs   // AI生成文章
 └── Logs/
      └── ...                   // 自动化运行截图 & 日志

1. appsettings.json(账号、URL、路径配置)

{
  "SocialSecurity": {
    "LoginUrl": "https://example.com/social/login",
    "Username": "your_username",
    "Password": "your_password",
    "UploadFilePath": "C:\\报表\\社保.xls"
  },
  "Csdn": {
    "LoginUrl": "https://**.net/creation/editor",
    "Username": "your_username",
    "Password": "your_password"
  },
  "Paths": {
    "DownloadFolder": "C:\\数据导出",
    "ScreenshotFolder": "Logs"
  }
}

2. Program.cs(启动入口)

using System.Threading.Tasks;

class Program
{
    public static async Task Main()
    {
        await SchedulerConfig.Start();
        Console.WriteLine("任务调度已启动,按 Ctrl+C 停止。");
        await Task.Delay(-1);
    }
}

3. SchedulerConfig.cs(定时调度)

using Quartz;
using Quartz.Impl;

public class SchedulerConfig
{
    public static async Task Start()
    {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        var scheduler = await factory.GetScheduler();
        await scheduler.Start();

        // 每月5号 10:00 报社保
        var socialJob = JobBuilder.Create<SocialSecurityTask>().Build();
        var socialTrigger = TriggerBuilder.Create()
            .WithCronSchedule("0 0 10 5 * ?")
            .Build();
        await scheduler.ScheduleJob(socialJob, socialTrigger);

        // 每周一 09:00 查询社保数据
        var queryJob = JobBuilder.Create<QuerySocialDataTask>().Build();
        var queryTrigger = TriggerBuilder.Create()
            .WithCronSchedule("0 0 9 ? * MON")
            .Build();
        await scheduler.ScheduleJob(queryJob, queryTrigger);

        // 每周二 09:30 发布文章
        var csdnJob = JobBuilder.Create<PublishCsdnTask>().Build();
        var csdnTrigger = TriggerBuilder.Create()
            .WithCronSchedule("0 30 9 ? * TUE")
            .Build();
        await scheduler.ScheduleJob(csdnJob, csdnTrigger);
    }
}

4. SocialSecurityTask.cs(自动报社保任务)

using Quartz;
using Microsoft.Playwright;
using Microsoft.Extensions.Configuration;

public class SocialSecurityTask : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
        var url = config["SocialSecurity:LoginUrl"];
        var username = config["SocialSecurity:Username"];
        var password = config["SocialSecurity:Password"];
        var filePath = config["SocialSecurity:UploadFilePath"];
        var screenshotFolder = config["Paths:ScreenshotFolder"];

        using var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = false });
        var page = await browser.NewPageAsync();

        try
        {
            await page.GotoAsync(url);
            await page.FillAsync("#username", username);
            await page.FillAsync("#password", password);

            // TODO: 验证码处理 - 调用 OcrService
            // var captchaText = await OcrService.RecognizeAsync(page);
            // await page.FillAsync("#captcha", captchaText);

            await page.ClickAsync("#loginBtn");
            await page.SetInputFilesAsync("input[type='file']", filePath);
            await page.ClickAsync("#submitBtn");

            await page.ScreenshotAsync(new PageScreenshotOptions
            {
                Path = $"{screenshotFolder}\\SocialSecurity_{DateTime.Now:yyyyMMddHHmmss}.png"
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine($"报社保任务失败: {ex.Message}");
        }
        finally
        {
            await browser.CloseAsync();
        }
    }
}

5. QuerySocialDataTask.cs(查询导出任务)

using Quartz;
using Microsoft.Playwright;

public class QuerySocialDataTask : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("执行社保数据查询并导出...");
        // 和 SocialSecurityTask 类似,登录后执行查询与下载
    }
}

6. PublishCsdnTask.cs(发布 CSDN 文章)

using Quartz;
using Microsoft.Playwright;

public class PublishCsdnTask : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("执行发布文章任务...");
        // 登录,填写标题和内容,点击发布
    }
}

7. 后续可加功能

  • 验证码自动识别:OcrService 接入 Python 脚本或打码平台
  • Excel 数据处理:ExcelService 用 EPPlus 读取、写入 Excel
  • 文章 AI 生成:AiContentService 调用 GPT API 生成内容
  • 任务失败重试:Quartz 支持失败任务重试策略
  • 打包成 EXEdotnet publish -r win-x64


网站公告

今日签到

点亮在社区的每一天
去签到