【C#】指定したURLに定期的にリクエストを送信するツールを作ってみた

C#,開発

おはようございます。

久しぶりのC#ネタです。

知り合いから依頼をされてちょっとしたツールを作ったので公開。

スポンサーリンク

画面の作成

ヴィジュアルエディタ

各種コントロールを配置。

今回は Timer を使って画面で定期処理を実行します。

細かい制御なんかは入れていません。

プログラム

クラス

2つほど別でクラスを用意。

FileUtil.cs

using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace UrlClicker
{
    class FileUtil
    {

        /// <summary>
        /// ファイルまたはフォルダが存在するかどうかを返します.
        /// </summary>
        /// <param name="path">ファイル(ディレクトリ)パス</param>
        /// <returns>TRUE:存在する/FALSE:存在しない</returns>
        public static bool IsExists(string path)
        {
            return IsExistsFile(path) | IsExistsDirectory(path);
        }

        /// <summary>
        /// ファイルが存在するかどうかを返します.
        /// </summary>
        /// <param name="filePath">ファイルパス</param>
        /// <returns>TRUE:存在する/FALSE:存在しない</returns>
        public static bool IsExistsFile(string filePath)
        {
            return File.Exists(filePath);
        }

        /// <summary>
        /// ディレクトリが存在するかどうかを返します.
        /// </summary>
        /// <param name="directoryPath">ディレクトリパス</param>
        /// <returns>TRUE:存在する/FALSE:存在しない</returns>
        public static bool IsExistsDirectory(string directoryPath)
        {
            return Directory.Exists(directoryPath);
        }

        /// <summary>
        /// 設定ファイルを保存します.
        /// </summary>
        /// <param name="set">設定情報</param>
        /// <param name="path">保存先ファイルパス</param>
        public static void SaveSettingInfo(SettingInfo set, string path)
        {
            XmlSerializer serializer1 = new XmlSerializer(typeof(SettingInfo));

            // ファイルを開く(UTF-8 BOM無し)
            StreamWriter sw = new StreamWriter(path, false, new UTF8Encoding(false));

            // シリアル化し、XMLファイルに保存する
            serializer1.Serialize(sw, set);

            // 閉じる
            sw.Close();
        }

        /// <summary>
        /// 設定ファイルを読み込みます.
        /// </summary>
        /// <param name="path">設定情報ファイルのパス</param>
        /// <returns></returns>
        public static SettingInfo LoadSettingInfo(string path)
        {
            SettingInfo set = new SettingInfo();

            // XmlSerializerオブジェクトの作成
            XmlSerializer serializer = new XmlSerializer(typeof(SettingInfo));
            // ファイルを開く
            StreamReader sr = new StreamReader(path, new UTF8Encoding(false));
            // XMLファイルから読み込み、逆シリアル化する
            set = (SettingInfo)serializer.Deserialize(sr);
            // 閉じる
            sr.Close();

            return set;
        }

    }
}

ファイル関連の処理を記述。主に設定や履歴をファイルに出力、読み込みを出来るように。

SettingInfo.cs

using System;
using System.Collections.Generic;

namespace UrlClicker
{
    public class SettingInfo
    {
        /// <summary>
        /// 実行間隔
        /// </summary>
        public string Interval { set; get; }

        /// <summary>
        /// 処理履歴リスト
        /// </summary>
        public List<String> HistoryList { set; get; }

        /// <summary>
        /// URLリスト
        /// </summary>
        public List<String> UrlList { set; get; }

    }
}

画面項目を保存するために用意したクラス。

メイン処理

MainForm.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Reflection;

namespace UrlClicker
{
    public partial class MainForm : Form
    {
        // 設定ファイルのパス
        private string appDir = "";
        private string settingFilePath = "";

        public MainForm()
        {
            InitializeComponent();

            // 実行ディレクトリのパスを取得
            Assembly mainAssembly = Assembly.GetExecutingAssembly();
            appDir = System.IO.Path.GetDirectoryName(mainAssembly.Location);

            // 設定ファイル名
            settingFilePath = appDir + @"\settings.config";

            // 前回設定情報を復元
            RestoreSettings();

        }

        /// <summary>
        /// 追加ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_add_Click(object sender, EventArgs e)
        {
            lb_url.Items.Add(txb_url.Text);
            txb_url.Text = "";
        }

        /// <summary>
        /// URLリスト選択変更
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Lb_url_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lb_url.SelectedItem != null)
            {
                String text = lb_url.SelectedItem.ToString();
                txb_url.Text = text;
            }
        }

        /// <summary>
        /// 開始ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_start_Click(object sender, EventArgs e)
        {
            int time = 0;
            int.TryParse(txb_time.Text, out time);
            timer1.Interval = time * 60000;
            timer1.Enabled = true;
            toolStripStatusLabel1.Text = "実行中...";
            SendRequest();
        }

        /// <summary>
        /// 停止ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_stop_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            toolStripStatusLabel1.Text = "停止";
        }

        /// <summary>
        /// タイマー処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer1_Tick(object sender, EventArgs e)
        {
            SendRequest();
        }

        /// <summary>
        /// リクエスト送信
        /// </summary>
        private void SendRequest()
        {
            foreach (String url in lb_url.Items)
            {

                //HttpWebRequestを作成
                try
                {
                    HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(url);

                    //サーバーからの応答を受信するためのHttpWebResponseを取得
                    HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
                    //応答データを受信するためのStreamを取得
                    Stream st = webres.GetResponseStream();
                    //文字コードを指定して、StreamReaderを作成
                    StreamReader sr = new StreamReader(st, Encoding.UTF8);
                    //データをすべて受信
                    string htmlSource = sr.ReadToEnd();
                    //閉じる
                    sr.Close();
                    st.Close();
                    webres.Close();


                    DateTime dt = DateTime.Now;
                    string result = dt.ToString("yyyy/MM/dd HH:mm:ss");
                    lb_hist.Items.Add("[" + result + "] [" + url + "]");
                }
                catch
                {
                }

            }

        }

        /// <summary>
        /// 画面の入力値などを設定ファイルに保存します.
        /// </summary>
        private SettingInfo SaveSettings()
        {
            // 画面設定情報を取得し設定情報クラスにセット
            SettingInfo set = new SettingInfo();
            set.Interval = txb_time.Text;
            List<String> urlList = new List<String>();
            foreach (String item in lb_url.Items)
            {
                urlList.Add(item);
            }
            set.UrlList = urlList;

            List<String> histList = new List<String>();
            foreach (String item in lb_hist.Items)
            {
                histList.Add(item);
            }
            set.HistoryList = histList;

            // 設定ファイルの保存
            FileUtil.SaveSettingInfo(set, settingFilePath);

            return set;
        }

        /// <summary>
        /// 画面の前回情報を設定ファイルから復元します.
        /// </summary>
        private void RestoreSettings()
        {

            // 設定ファイルが存在しなければ処理を中止
            if (!FileUtil.IsExistsFile(settingFilePath))
            {
                return;
            }

            // 設定ファイルの読み込み
            SettingInfo set = FileUtil.LoadSettingInfo(settingFilePath);

            txb_time.Text = set.Interval;

            foreach (String url in set.UrlList)
            {
                lb_url.Items.Add(url);
            }

            foreach (String history in set.HistoryList)
            {
                lb_hist.Items.Add(history);
            }
        }

        /// <summary>
        /// 閉じるボタン
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 履歴クリア
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_hist_clear_Click(object sender, EventArgs e)
        {
            lb_hist.Items.Clear();
        }

        /// <summary>
        /// 削除ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_del_Click(object sender, EventArgs e)
        {
            if (lb_url.SelectedItems != null)
            {
                lb_url.Items.RemoveAt(lb_url.SelectedIndex);
            }
        }

        /// <summary>
        /// フォーム閉じるとき
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 設定を保存
            SaveSettings();
        }
    }
}

各処理を実装。

起動してみる

起動後画面
実行してみた

まとめ

まあ使いどころはあまりありませんが、何かのお役に立てれば。

ではでは。

GitHub

 

スポンサーリンク


関連するコンテンツ