当前位置: 首页 > backend >正文

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

目录

目录结构

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

http://www.xdnf.cn/news/17351.html

相关文章:

  • 贪心----1.买卖股票的最佳时机
  • 基于 InfluxDB 的服务器性能监控系统实战(二)
  • 代码随想录day59图论9
  • [已解决]VSCode右键菜单消失恢复
  • GPT-4 vs GPT-5 深度分析
  • 制作浏览器CEFSharp133+X86+win7 之配置环境(一)
  • Product Hunt 每日热榜 | 2025-08-09
  • 【C++详解】AVL树深度剖析与模拟实现(单旋、双旋、平衡因⼦更新、平衡检测)
  • 基于clodop和Chrome原生打印的标签实现方法与性能对比
  • 【MySQL】事务的基本概念
  • 揭秘MyBatis核心类MappedStatement
  • 【Datawhale AI夏令营】基于多模态RAG的企业财报问答系统
  • Vue3 生命周期
  • Go语言实战案例:表单提交数据解析
  • 多模态RAG赛题实战--Datawhale AI夏令营
  • 39.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--调整发布脚本
  • 通过 Docker 运行 Prometheus 入门
  • C# 通过第三方库INIFileParser管理INI配置文件
  • 2025年渗透测试面试题总结-09(题目+回答)
  • 实战:MyBatis 中 db.properties 的正确配置与最佳实践
  • RAGFoundry:面向检索增强生成的模块化增强框架
  • 五、RuoYi-Cloud-Plus 前端项目部署以及如何改后端请求地址。
  • 【CTF】PHP反序列化基础知识与解题步骤
  • Java 大视界 -- Java 大数据在智能医疗手术机器人操作数据记录与性能评估中的应用(390)
  • 深入剖析Spring MVC核心原理:从请求到响应的魔法解密
  • Java-线程线程的创建方式
  • 【线性代数】线性方程组与矩阵——(3)线性方程组解的结构
  • kubectl get node k8s-node01 -o yaml | grep taint -B 5 -A 5
  • 电子电气架构 --- 48V车载供电架构
  • 第16届蓝桥杯Scratch选拔赛初级及中级(STEMA)2024年11月24日真题