目录
[1. appsettings.json(账号、URL、路径配置)](#1. appsettings.json(账号、URL、路径配置))
[2. Program.cs(启动入口)](#2. Program.cs(启动入口))
[3. SchedulerConfig.cs(定时调度)](#3. SchedulerConfig.cs(定时调度))
[4. SocialSecurityTask.cs(自动报社保任务)](#4. SocialSecurityTask.cs(自动报社保任务))
[5. QuerySocialDataTask.cs(查询导出任务)](#5. QuerySocialDataTask.cs(查询导出任务))
[6. PublishCsdnTask.cs(发布 CSDN 文章)](#6. PublishCsdnTask.cs(发布 CSDN 文章))
[7. 后续可加功能](#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 支持失败任务重试策略
- 打包成 EXE :
dotnet publish -r win-x64