IDE:
vs2019
使用场景:
定时访问本机(服务器)的某个页面,发送参数。执行计划任务。
界面:
Eastar’s Tips:
如果需要修改上面的url为非本机地址,需要修改下面源码中的 regex 规则;
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);
}
}
}
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];
`