【C#】指定したURLに定期的にリクエストを送信するツールを作ってみた
おはようございます。
久しぶりの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();
}
}
}
各処理を実装。
起動してみる
まとめ
まあ使いどころはあまりありませんが、何かのお役に立てれば。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません