ボートレースデータを取得する その4

コンピューター

ボートレース公式サイトからデータを取得する

ボートレース公式では、各種データの公開が行われています。

https://boatrace.jp/

今回は、Visual Studio Communityを使い、C#で、指定した年月に該当する番組表、競走成績を取得します。検証等に時間がかかるので、分割して記事にしてあります。

2021年6月20日の時点では、ボートレース公式サイトのSSL化は行われていません。各種データも実質非標準となりつつあるlha形式を使用しています。コードを作成するにあたり、運営の方針変更等で構成の変更がある事も想定しておく事が必要です。

その2 ダウンロードデータを解凍する

lzhファイル解凍について

VBAから、lzhファイル解凍を行う場合、UNLHA32.DLLを使う事が正攻法だったと思います。しかしながら、開発者のLZH書庫の利用中止の呼びかけや開発中止が表明されており、今回は、解凍ソフトArchiveDecoderを使用し、WindowsScriptHostにより、外部コマンド実行による解凍を行う方法を採用しました。

UNLHA32.DLLのダウンロード
UNLHA32.DLLのダウンロードページ
ソフト脆弱性情報
ソフト脆弱性情報

Archive Decoder

解凍ソフトを選定するにあたり条件としたのは、

  • Windows10対応
  • 外部DLLを必要としない
  • インストール不要
  • ZIPファイルも解凍可能(今後を見据えて)

です。

今回は、実行ファイルと同じフォルダに格納し、事前に設定を行っています。

Archive Decoderの詳細情報 : Vector ソフトを探す!
DLL 不要の解凍専用アーカイバ USB メモリなどで持ち運んでの用途に最適

解凍

private void BtnExtract_Click(object sender, EventArgs e)
{
    DateTime dtmEom = new DateTime(DtpMonth.Value.Year, DtpMonth.Value.Month, 1).AddMonths(1).AddDays(-1);

    LsbLog.Items.Add($@"[{DateTime.Now:yyyy/MM/dd hh:mm:ss}]BoatRaceTools Extract Start {dtmEom:yyyy 年 MM 月}");

    if (RbProgram.Checked)
    {
        ExtractArchive(dtmEom, "b"); // "b"は小文字
    }
    else
    {
        ExtractArchive(dtmEom, "k"); // "k"は小文字
    }

    LsbLog.Items.Add($@"[{DateTime.Now:yyyy/MM/dd hh:mm:ss}]BoatRaceTools Extract End");

}

dtmEom : 画面で選択された年月の月末日

private void ExtractArchive(DateTime dtmEom, string strType)
{
    string strExePath = Application.StartupPath;
    if (strExePath.Substring(strExePath.Length - 1) != @"\")
    {
        strExePath = string.Concat(strExePath, @"\");
    }

    string strOutPath = $@"{strExePath}{dtmEom:yyyyMM}\";

    string[] strNames = Directory.GetFiles(strOutPath, $@"{strType}????????.lzh");

    foreach (string strName in strNames)
    {
        using (Process process = new Process())
        {
            process.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardInput = false;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.Arguments = $@"/c {strExePath}Arcdec,exe {strName}";

            process.Start();
            if (!process.WaitForExit(1000))
            {
                process.Kill();
            }
            string strFile = Path.GetFileName(strName);
            LsbLog.Items.Add($@"[{DateTime.Now:hh:mm:ss}]Extract {strFile} CODE={process.ExitCode}"); // 開催日でなければ無い
        }
    }
}

strExePath : 実行ファイルのパス
strOutPath : ダウンロードファイル格納フォルダ(解凍ファイル格納フォルダ)

  • 該当フォルダに存在する対象ファイル名をArchive Decoderに渡し、解凍する
  • Archive Decoder起動後、1秒間戻りが無い場合、強制終了させる

まとめ

ComSpecは、システムに登録されているコマンドインタープリタープログラムが指定されています。私の環境ではcmd.exeが設定されており、「cmd.exe /c arcdec.exe ファイル名」となります。

 

コメント

タイトルとURLをコピーしました