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];
`

来源:https://www.cnblogs.com/nb08611033/p/11105631.html