using System; using System.Collections.Generic; using System.IO; using System.Text; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using CSVDownloader.Code; using CSVDownloader.Store.CreditCSVData; using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions; namespace CSVDownloader.Web { class ItecController : WebController { private readonly String url_ = "https://www.itc-offerinfo.net/webap/Login"; private enum XpathKey { INPUT_LOGIN_USERNAME, INPUT_LOGIN_PASSWORD, BUTTON_LOGIN, BUTTON_CREDIT_KESSAI, RADIO_TARGET_SPAN, SELECT_TARGET_FROM_YYYYMM, SELECT_TARGET_FROM_DD, SELECT_TARGET_TO_YYYYMM, SELECT_TARGET_TO_DD, BUTTON_CONFIRM_CSV, BUTTON_DOWNLOAD_CSV, BUTTON_LOGOUT, }; private IDictionary xpath_map_ = new Dictionary() { {XpathKey.INPUT_LOGIN_USERNAME,@"//*[@id='panel']/div[2]/input" }, {XpathKey.INPUT_LOGIN_PASSWORD,@"//*[@id='panel']/div[4]/input"}, {XpathKey.BUTTON_LOGIN,@"//*[@id='area_m']/form/div[2]/input[1]"}, {XpathKey.BUTTON_CREDIT_KESSAI,@"//*[@id='menuRa']" }, {XpathKey.RADIO_TARGET_SPAN,@"//*[@id='kikantype1']" }, {XpathKey.SELECT_TARGET_FROM_YYYYMM,$"//*[@id='kikan_from_month']" }, {XpathKey.SELECT_TARGET_FROM_DD,$"//*[@id='kikan_from_day']" }, {XpathKey.SELECT_TARGET_TO_YYYYMM,$"//*[@id='kikan_to_month']" }, {XpathKey.SELECT_TARGET_TO_DD,$"//*[@id='kikan_to_day']" }, {XpathKey.BUTTON_CONFIRM_CSV,$"//*[@id='btn-exec']" }, {XpathKey.BUTTON_DOWNLOAD_CSV,$"//*[@id='dl-detail']" }, {XpathKey.BUTTON_LOGOUT,$"//*[@id='btn_logout']" }, }; public ItecController(ChromeDriver driver) : base(driver) { agent_ = CreditAgent.ITEC; } public override void SetParkingDic(IDictionary dic) { dic_ = new Dictionary(); // IPコードと駐車場名を分離。プログラムではIPコードのみ利用する。 foreach (var ele in dic) { String parking_name = ele.Key.Split(" ")[0].Trim(); dic_.Add(parking_name, ele.Value); } } public override ResultCode Login(LoginInfo info) { try { driver_.Navigate().GoToUrl(url_); Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name); Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password); Click(xpath_map_[XpathKey.BUTTON_LOGIN]); // ログイン後の明細データダウンロードが表示されることを確認する。 wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]))); } catch (Exception e) { logger_.Error(e.Message); return ResultCode.NG; } return ResultCode.OK; } public override ResultCode Download(DateTime from, DateTime to) { // クレジットカード承認結果一覧画面に移行 Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]); // 承認処理日のFrom-Toを入力 Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_YYYYMM], from.ToString("yyyyMM")); Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_DD], from.ToString("dd")); Select(xpath_map_[XpathKey.SELECT_TARGET_TO_YYYYMM], to.ToString("yyyyMM")); Select(xpath_map_[XpathKey.SELECT_TARGET_TO_DD], to.ToString("dd")); // 各種ラジオチェックを入力 Click(xpath_map_[XpathKey.RADIO_TARGET_SPAN]); // 条件確定 Click(xpath_map_[XpathKey.BUTTON_CONFIRM_CSV]); // ダウンロード開始 Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]); String filename = $"itec.csv"; WaitForDownload(filename); return ResultCode.OK; } public override ResultCode Logout() { Click(xpath_map_[XpathKey.BUTTON_LOGOUT]); return ResultCode.OK; } public override List GetCreditCSVDataList() { var result_list = new List(); // csvファイルパスの取得 var config = new CSVConfig() { header = true, }; var dir = new DirectoryInfo(DriverFactory.GetDownloadDir()); var sjis_enc = Encoding.GetEncoding("Shift-JIS"); var list = new List(); foreach (var file in dir.GetFiles()) { var result = ReadCsv(file.FullName, config, sjis_enc); list.AddRange(result); } foreach (var line in list) { // 空の行はスキップする if (line.Length == 0) { continue; } // 不要な行はスキップする if (line.Length != 10) { continue; } result_list.Add(new CSVDataItec() { spot_id = GetSpotID(line[(int)CSVDataItec.ColName.ParkingName]), code = line[(int)CSVDataItec.ColName.Code], device_type = line[(int)CSVDataItec.ColName.DeviceType], use_datetime = DateTime.Parse(line[(int)CSVDataItec.ColName.UseDatetime]), trade = line[(int)CSVDataItec.ColName.Trade], card_company_name = line[(int)CSVDataItec.ColName.CardCompanyName], amount = int.Parse(line[(int)CSVDataItec.ColName.Amount]), tax_send_fee = int.Parse(line[(int)CSVDataItec.ColName.TaxSendFee]), total_amount = int.Parse(line[(int)CSVDataItec.ColName.TotalAmount]), error_code = line[(int)CSVDataItec.ColName.ErrorCode], }); } return result_list; } } }