C# winForm 定时访问PHP页面小工具
IDE:vs2019
项目文件:
链接: https://pan.baidu.com/s/1wys1RUKwoNs1kuHbjBZSKw
提取码: xs5e
使用场景:定时访问本机(服务器)的某个页面,发送参数。执行计划任务。
界面:
C# 代码:
using System; using System.Net; using System.Text; using System.Windows.Forms; using System.Web; using System.IO; using System.Text.RegularExpressions; namespace CronVisitURL { public partial class FormMain : Form { // 初始化-参数 public int autoStart = 1; // 自动开始标记 public int setLines = 5; // 配置信息行数 public string strURL = ""; // 访问url public string strPostKey = ""; // 访问postKey public string strPostData = ""; // 访问postDate public int startTime = 0; // 运行时段-起始 public int endTime = 0; // 运行时段-结束 public Regex regex = new Regex(@"^http:\/\/(127\.0\.0\.1)|(localhost)\/"); // 访问url,校验规则 public string iniPath = Application.StartupPath + @"\setting.ini"; // 配置文件路径 public FormMain() { InitializeComponent(); } // 窗体载入后 private void FormMain_Load(object sender, EventArgs e) { //读取配置信息 SetInfoRead(); } // 状态栏图标单击 private void NotifyIcon1_MouseClick(object sender, MouseEventArgs e) { // 左键单击 if (e.Button == MouseButtons.Left) { Show(); Activate(); WindowState = FormWindowState.Normal; } } // 状态栏图标菜单-退出 private void ExitMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("你确定要退出程序吗?", "确认", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK) { notifyIcon1.Visible = false; Close(); Dispose(); Application.Exit(); } } //状态栏图标菜单-显示 private void ShowMenuItem_Click(object sender, EventArgs e) { Show(); Activate(); WindowState = FormWindowState.Normal; } // 按钮-默认 private void BtnDefault_Click(object sender, EventArgs e) { TxbUrl.Text = "http://127.0.0.1/mws/cron/cron.php"; TxbPostKey.Text = "hf_tech"; TxbPostData.Text = "good"; NumStartHour.Value = 0; NumStartMinute.Value = 0; NumStartSecond.Value = 0; NumEndHour.Value = 23; NumEndMinute.Value = 59; NumEndSecond.Value = 59; NumVisitRate.Value = 1; autoStart = 1; LabMsg.Text = "恢复成功"; } // 按钮-保存 private void BtnSave_Click(object sender, EventArgs e) { SetInfoSave(); } // 按钮-退出 private void BtnExit_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show("是否退出?选否,最小化到托盘", "操作提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Yes) { Close(); Dispose(); Application.Exit(); } else if(result == DialogResult.No) { WindowState = FormWindowState.Minimized; Visible = false; notifyIcon1.Visible = true; } } // 按钮-隐藏 private void BtnHide_Click(object sender, EventArgs e) { Hide(); notifyIcon1.Visible = true; } // 按钮-暂停 private void BtnPause_Click(object sender, EventArgs e) { // 修改界面 BtnPause.Enabled = false; BtnStart.Enabled = true; groupBox1.Enabled = true; groupBox2.Enabled = true; panel1.Enabled = true; LabMsg.Text = "定时访问,暂停"; timer1.Stop(); } // 按钮-开始 private void BtnStart_Click(object sender, EventArgs e) { // 初始化 int visitRate = Convert.ToInt32(NumVisitRate.Value.ToString()); strURL = TxbUrl.Text.Trim(); // url strPostKey = TxbPostKey.Text.Trim(); // PostKey strPostData = TxbPostData.Text.Trim(); // PostData // 校验url if (regex.IsMatch(strURL) == false) { throw new SetException("配置信息异常:访问url,必须以本地域名或本机IP开头"); } // 校验post if (strPostKey == "") { throw new SetException("访问postKey,数值异常"); } if (strPostData == "") { throw new SetException("访问postData,数值异常"); } // 校验频率 if (visitRate > 3600 || visitRate < 1) { throw new SetException("访问频率,数值异常"); } // 获取运行时段 GetRunTime(); // 开始访问 StartVist(visitRate); } // 开始访问 private void StartVist(int visitRate) { // 修改界面 BtnPause.Enabled = true; BtnStart.Enabled = false; groupBox1.Enabled = false; groupBox2.Enabled = false; panel1.Enabled = false; LabMsg.Text = "定时访问,开始"; // 启动计时器 timer1.Interval = visitRate * 1000; // 默认毫秒 timer1.Start(); } // 计时器 private void Timer1_Tick(object sender, EventArgs e) { // 获取当前时间 string timeStr = DateTime.Now.ToLongTimeString().ToString(); string result = Regex.Replace(timeStr, @"[^0-9]+", ""); int timeNow = Convert.ToInt32(result); // 如果在运行时段内 if (startTime <= timeNow && timeNow <= endTime) { try { VisitURL(); } catch { LabMsg.Text = "访问失败,请检查后,重试"; timer1.Stop(); } } } // 绑定当前时间是否在运行时段内 private void GetRunTime() { // 获取运行时段 string statrHour = NumStartHour.Value.ToString(); // 开始-时 string statrMinute = NumStartMinute.Value.ToString(); // 开始-分 string statrSecond = NumStartSecond.Value.ToString(); // 开始-秒 string endHour = NumEndHour.Value.ToString(); // 结束-时 string endMinute = NumEndMinute.Value.ToString(); // 结束-分 string endSecond = NumEndSecond.Value.ToString(); // 结束-秒 // 补零 if (Convert.ToInt32(statrMinute) < 10) { statrMinute = "0" + statrMinute; } if (Convert.ToInt32(statrSecond) < 10) { statrSecond = "0" + statrSecond; } if (Convert.ToInt32(endMinute) < 10) { endMinute = "0" + endMinute; } if (Convert.ToInt32(endSecond) < 10) { endSecond = "0" + endSecond; } // 转换 string startStr = statrHour + statrMinute + statrSecond; string endStr = endHour + endMinute + endSecond; startTime = Convert.ToInt32(startStr); endTime = Convert.ToInt32(endStr); } // 访问url-post private void VisitURL() { // 初始化 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL); //Post请求方式 request.Method = "POST"; // 内容类型 request.ContentType = "application/x-www-form-urlencoded"; // 参数经过URL编码 string paraUrlCoded = HttpUtility.UrlEncode(strPostKey); paraUrlCoded += "=" + HttpUtility.UrlEncode(strPostData); byte[] payload; //将URL编码后的字符串转化为字节 payload = Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的 ContentLength request.ContentLength = payload.Length; //获得请 求流 Stream writer = request.GetRequestStream(); //将请求参数写入流 writer.Write(payload, 0, payload.Length); // 关闭请求流 writer.Close(); // 获得响应流 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string responseText = reader.ReadToEnd(); reader.Close(); LabMsg.Text = DateTime.Now.ToLongTimeString().ToString() + ",收到数据:" + responseText; } // 自动开始-图片 private void PicAutoStart_Click(object sender, EventArgs e) { // 不打勾 if (autoStart == 1) { PicAutoStart.Image = Properties.Resources.cb1; autoStart = 0; } // 打勾 else { PicAutoStart.Image = Properties.Resources.cb2; autoStart = 1; } } // 自动开始-标签 private void LabAutoStart_Click(object sender, EventArgs e) { // 不打勾 if (autoStart == 1) { PicAutoStart.Image = Properties.Resources.cb1; autoStart = 0; } // 打勾 else { PicAutoStart.Image = Properties.Resources.cb2; autoStart = 1; } } // 配置信息-读取 private void SetInfoRead() { if (File.Exists(iniPath)) { try { // 初始化-读取数据 string[] lines = File.ReadAllLines(iniPath, Encoding.UTF8); // 将文本内容转换为数组 string[] line1 = lines[1].Split(','); // postKey,Postdata string[] line2 = lines[2].Split(','); // 开始时,分,秒 string[] line3 = lines[3].Split(','); // 结束时,分,秒 // 初始化-数据转换 string[] visit = new string[3]; int[] cron = new int[8]; visit[0] = lines[0]; // 访问url visit[1] = line1[0]; // 访问postKey visit[2] = line1[1]; // 访问postData cron[0] = Convert.ToInt32(line2[0]); // 开始-时 cron[1] = Convert.ToInt32(line2[1]); // 开始-分 cron[2] = Convert.ToInt32(line2[2]); // 开始-秒 cron[3] = Convert.ToInt32(line3[0]); // 结束-时 cron[4] = Convert.ToInt32(line3[1]); // 结束-分 cron[5] = Convert.ToInt32(line3[2]); // 结束-秒 cron[6] = Convert.ToInt32(lines[4]); // 访问频率 cron[7] = Convert.ToInt32(lines[5]); // 自动开始 // 初始化-数据校验 bool result = SetInfoCheck(visit, cron); if(result == true) { // 赋值 TxbUrl.Text = visit[0]; TxbPostKey.Text = visit[1]; TxbPostData.Text = visit[2]; NumStartHour.Value = cron[0]; NumStartMinute.Value = cron[1]; NumStartSecond.Value = cron[2]; NumEndHour.Value = cron[3]; NumEndMinute.Value = cron[4]; NumEndSecond.Value = cron[5]; NumVisitRate.Value = cron[6]; autoStart = cron[7]; // 开启后自动运行 if (autoStart == 1) { //打勾 PicAutoStart.Image = Properties.Resources.cb2; // 初始化 strURL = visit[0]; strPostKey = visit[1]; strPostData = visit[2]; // 获取运行时段 GetRunTime(); // 自动开始 StartVist(cron[6]); } else { // 不打勾 PicAutoStart.Image = Properties.Resources.cb1; } LabMsg.Text = "配置信息,读取成功"; } } catch { LabMsg.Text = "配置信息,读取失败,请重新保存设置"; } } else { LabMsg.Text = "配置文件,未找到,请重新保存设置"; } } // 配置信息-保存 private void SetInfoSave() { // 初始化 string[] visit = new string[3]; int[] cron = new int[8]; visit[0] = TxbUrl.Text.Trim(); // 访问url visit[1] = TxbPostKey.Text.Trim(); // 访问postKey visit[2] = TxbPostData.Text.Trim(); // 访问postData cron[0] = Convert.ToInt32(NumStartHour.Value.ToString()); // 开始-时 cron[1] = Convert.ToInt32(NumStartMinute.Value.ToString()); // 开始-分 cron[2] = Convert.ToInt32(NumStartSecond.Value.ToString()); // 开始-秒 cron[3] = Convert.ToInt32(NumEndHour.Value.ToString()); // 结束-时 cron[4] = Convert.ToInt32(NumEndMinute.Value.ToString()); // 结束-分 cron[5] = Convert.ToInt32(NumEndSecond.Value.ToString()); // 结束-秒 cron[6] = Convert.ToInt32(NumVisitRate.Value.ToString()); // 访问频率 cron[7] = autoStart; // 自动开始 // 数据校验 bool result = SetInfoCheck(visit, cron); if (result == true) { // 设置信息-字符串 string str = visit[0] + Environment.NewLine; str += visit[1] + ',' + visit[2] + Environment.NewLine; str += cron[0].ToString() + ',' + cron[1].ToString() + ',' + cron[2].ToString() + Environment.NewLine; str += cron[3].ToString() + ',' + cron[4].ToString() + ',' + cron[5].ToString() + Environment.NewLine; str += cron[6].ToString() + Environment.NewLine; str += cron[7].ToString(); // 写入配置文件 File.WriteAllText(iniPath, str, Encoding.UTF8); LabMsg.Text = "配置信息,保存成功"; } } // 配置数据校验 private bool SetInfoCheck(string[] visit, int[] cron) { // 参数个数-访问 if(visit.GetLength(0) !=3) { LabMsg.Text = "访问参数,数值异常"; return false; } // 参数个数-每日运行时段,访问频率,自动运行 if (cron.GetLength(0) !=8) { LabMsg.Text = "计时器,数值异常"; return false; } // 访问-url if (regex.IsMatch(visit[0]) == false) { LabMsg.Text = "配置信息异常:访问url,必须以本地域名或本机IP开头"; return false; } // 访问-postKey if (visit[1] == "") { LabMsg.Text = "访问postKey,数值异常"; return false; } // 访问-postData if (visit[2] == "") { LabMsg.Text = "访问postData,数值异常"; return false; } // 开始-时 if (cron[0] > 23 || cron[0] < 0) { LabMsg.Text = "每日运行时段,开始小时,数值异常"; return false; } // 开始-分 if (cron[1] > 60 || cron[1] < 0) { LabMsg.Text = "每日运行时段,开始分钟,数值异常"; return false; } // 开始-秒 if (cron[2] > 60 || cron[2] < 0) { LabMsg.Text = "每日运行时段,开始秒钟,数值异常"; return false; } // 结束-时 if (cron[3] > 23 || cron[3] < 0) { LabMsg.Text = "每日运行时段,结束小时,数值异常"; return false; } // 结束-分 if (cron[4] > 60 || cron[4] < 0) { LabMsg.Text = "每日运行时段,结束分钟,数值异常"; return false; } // 结束-秒 if (cron[5] > 60 || cron[5] < 0) { LabMsg.Text = "每日运行时段,结束秒钟,数值异常"; return false; } // 访问频率 if (cron[6] > 3600 || cron[ 6] < 1) { LabMsg.Text = "访问频率,数值异常"; return false; } // 自动开始 if (cron[7] > 1 || cron[7] < 0) { LabMsg.Text = "自动运行,数值异常"; return false; } return true; } } // 自定义异常类 class SetException : Exception { public SetException(string message) : base(message) { MessageBox.Show(message); } } } // the end @nb;
php 代码:
<?php // 本脚本所有的输出都会在触发器状态栏上显示,如果输入内容过多可能会导致触发器崩溃 // 基本设置 ignore_user_abort(true); // 忽略客户端断开 set_time_limit(0); // 设置执行不超时 date_default_timezone_set('Asia/Shanghai'); // 设置时区 // 定时访问 if(empty($_POST[POST_KEY]) || $_POST[POST_KEY] != POST_DATA) { die('error_post'); } //访问者id $remote_ip = $_SERVER["REMOTE_ADDR"]; //如果是本机访问(ipv4|ipv6) if($remote_ip != '127.0.0.1' && $remote_ip != '::1') { die('error_ip'); } // do something // 输出反馈信息给触发器 echo $_POST[POST_KEY]; // the end @nb;