using CounsellorBL.BLStructure; using log4net; using log4net.Config; using Microsoft.Extensions.Configuration; using MonumentDefine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OT.COM.SignalerMessage; using SeleniumBrowser; using SoldierData.EnterprizeV4; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; using static MonumentDefine.Enums; namespace TruckAP { public partial class Form1 : Form { const string ScriptFolder = "RunScripts2"; public string g_apiServer { get; set; } string UseOrigtekrpa = "false"; public List g_lsGroupUidsPost { get; set; } = null; public List g_lsGroupUidsRPA { get; set; } = null; private readonly static ILog _log = LogManager.GetLogger(typeof(Form1)); private readonly Dictionary _dicSetting = new Dictionary(); private int _nAdditional_Record = 0; [DllImport("User32.dll")] private static extern int SetForegroundWindow(IntPtr point); public const string FFMPEG_FILE = "ffmpeg.exe"; public const string RECORD_FILE = "Record.mp4"; public const string group_uids_post = "group_uids_post"; public const string group_uids_rpa = "group_uids_rpa"; private List _lgroup2user2 { get; set; } = new List(); public Form1() { LoadLog4netConfig(); _log.Info("Form1 Constructor start"); InitializeComponent(); GetConfig(); _log.Info("Form1 Constructor End"); } private void GetConfig() { _log.Info($"Form1 GetConfig start. Current Dir={Directory.GetCurrentDirectory()}"); IConfigurationRoot configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build(); IEnumerable ics = configuration.GetSection("appSettings").GetChildren(); foreach (IConfigurationSection ic in ics) { _dicSetting.Add(ic.Key, ic.Value); } if (_dicSetting.ContainsKey("additional_record_time")) { int.TryParse(_dicSetting["additional_record_time"], out _nAdditional_Record); } UseOrigtekrpa = _dicSetting.ContainsKey("use_origtekrpa") ? (_dicSetting["use_origtekrpa"].ToLower() == "true" ? "true" : "false") : "false"; _log.Info("Form1 GetConfig end"); } internal string getArticleInRange(string i_sMethod, out QueryResponse o_qrRes) { string sMsg = null; QueryResponse qrRes = null; _log.Info($"Start getArticleInRange method={i_sMethod}"); try { do { string sServerURL = g_apiServer; string sCmdURL = $"{sServerURL}/Cmd"; sMsg = Query(sCmdURL, "GROUP.ArticleManage2Service", i_sMethod, out CResponseMessage crpArticleWait); if (sMsg != null) { break; } qrRes = (crpArticleWait.param["data"] as JToken).ToObject(); if (qrRes == null) { sMsg = "CONVERT FAIL"; break; } int nLim = qrRes.Records.Count(); for (int nIdx = nLim - 1; nIdx >= 0; nIdx--) { Dictionary f = qrRes.Records[nIdx]; if (f.ContainsKey(tb_grp_article.CN_POST_STATUS) && int.TryParse(f[tb_grp_article.CN_POST_STATUS].ToString(), out int nStatus)) { f[tb_grp_article.CN_POST_STATUS] = (Enums.EPostStatus)nStatus; } } } while (false); } catch (Exception ex) { sMsg = $"Process fail. ErrorMsg={ex.Message}"; } if (sMsg != null) { _log.Error(sMsg); } _log.Info($"End getArticleInRange method={i_sMethod}"); o_qrRes = qrRes; return sMsg; } private string prepareGroup2User() { string sMsg = null; try { do { _lgroup2user2.Clear(); string sServerURL = g_apiServer; string sCmdURL = $"{sServerURL}/Cmd"; Dictionary dicPara = new Dictionary { { BLWording.QRY_MASTER, new List>() { new Dictionary() { { BLWording.WHEREDATA, null } } } } }; sMsg = _Action(sCmdURL, "GROUP.GroupUserService", "Read", out CResponseMessage o_crpResult, dicPara); if (sMsg != null) { break; } QueryResponse qrRes = (o_crpResult.param["data"] as JToken).ToObject(); qrRes.Records.ForEach(f => { tb_grp_group2user u = new tb_grp_group2user(); u.FillData(f); _lgroup2user2.Add(u); }); } while (false); } catch (Exception ex) { sMsg = ex.Message; } return sMsg; } internal string Run(string sCmd) { string sMsg = null; _log.Info("Start Run With Cmd = " + sCmd); try { do { sMsg = prepareGroup2User(); if (sMsg != null) { break; } switch (sCmd) { case "-a": sMsg = DoPost(); break; case "-v": sMsg = DoMedia(); break; case "": sMsg = DoPost(); sMsg = DoMedia(); break; } } while (false); } catch (Exception ex) { sMsg = ex.Message; } _log.Info("End Run"); return sMsg; } private string DoPost() { string sMsg = null; try { do { _log.Info("Run DoPost"); sMsg = getArticleInRange("GetScheduleWaitingArticleInRange", out QueryResponse qrRes); if (sMsg != null) { break; } if (qrRes.Records.Any()) { _HandlePost(qrRes.Records); } sMsg = getArticleInRange("GetFailWaitingArticleInRange", out qrRes); if (sMsg != null) { break; } _log.Info("Run DoPost Fail Case"); if (qrRes.Records.Any()) { _HandleFailPost(qrRes.Records); } } while (false); } catch (Exception ex) { sMsg = ex.Message; } _log.Info("Run DoPost End"); return sMsg; } private string DoMedia() { string sMsg = null; try { do { _log.Info("Run DoMedia"); sMsg = getArticleInRange("GetMediadWaitingArticleInRange", out QueryResponse qrRes); if (sMsg != null) { break; } if (qrRes.Records.Any()) { _HandleMedia(qrRes.Records); } sMsg = getArticleInRange("GetFailWaitingArticleInRange", out qrRes); if (sMsg != null && qrRes.Records.Any()) { break; } _log.Info("Run DoMedia Fail"); if (qrRes.Records.Any()) { _HandleFailMedia(qrRes.Records); } } while (false); } catch (Exception ex) { sMsg = ex.Message; } _log.Info("Run DoMedia End"); return sMsg; } private void _HandleFail(IEnumerable> i_idic) { IEnumerable> ldMedia = i_idic.Where(f => f.ContainsKey(tb_grp_article.CN_FB_ARTICLE_ID) && f[tb_grp_article.CN_FB_ARTICLE_ID] != null); _HandlePost(i_idic.Except(ldMedia)); _HandleMedia(ldMedia); } private void _HandleFailPost(IEnumerable> i_idic) { IEnumerable> ldMedia = i_idic.Where(f => f.ContainsKey(tb_grp_article.CN_FB_ARTICLE_ID) && f[tb_grp_article.CN_FB_ARTICLE_ID] != null); _HandlePost(i_idic.Except(ldMedia)); } private void _HandleFailMedia(IEnumerable> i_idic) { IEnumerable> ldMedia = i_idic.Where(f => f.ContainsKey(tb_grp_article.CN_FB_ARTICLE_ID) && f[tb_grp_article.CN_FB_ARTICLE_ID] != null); _HandleMedia(ldMedia); } private void _HandlePost(IEnumerable> i_idic) { string sMsg = null; _log.Info("Start _HandlePost"); try { do { string sServerURL = g_apiServer; string sURL = $"{sServerURL}/Cmd"; string sDownloadURL = $"{sServerURL}/Task/Download/?fileid="; _log.Debug("_HandlePost f1"); foreach (Dictionary article in i_idic) { if (!article.ContainsKey(tb_grp_article.CN_GROUP_UID)) { _log.Error($"{nameof(_HandlePost)} No CN_GROUP_UID"); continue; } string sArticleUid = article[tb_grp_article.CN_UID].ToString(); string sGroupUid = article[tb_grp_article.CN_GROUP_UID].ToString(); if (!g_lsGroupUidsPost.Contains(sGroupUid)) { _log.Debug($"Skip - {sArticleUid} since not matched group={sGroupUid}"); continue; } _log.Debug($"_HandlePost f1.1 - {sArticleUid} "); PushPost(sURL, sDownloadURL, "GROUP.ArticleManage2Service", out CResponseMessage crpArticleWait, null, new Dictionary() { { tb_grp_article.CN_UID, sArticleUid } }); } _log.Debug("_HandlePost f2"); } while (false); } catch (Exception ex) { sMsg = $"Process fail. ErrorMsg={ex.Message}"; } if (sMsg != null) { _log.Error(sMsg); } } private List _MediaOrder(List i_lsNames, string i_sHighPriortyExt) { return i_lsNames.OrderByDescending(name => { int nFind = name.LastIndexOf('.'); if (nFind != -1) { string sExt = name.Substring(nFind + 1); nFind = i_sHighPriortyExt.IndexOf(sExt); } return nFind; }).ToList(); } private string _HandleMediaAnArticle(Dictionary dicArticle, int i_nRetry, tb_grp_group2user i_gUser) { string sMsg = null; string sServerURL = g_apiServer; string sCmdURL = $"{sServerURL}/Cmd"; string sDownloadURL = $"{sServerURL}/Task/Download/?fileid="; try { do { _log.Info($"Handle article start {dicArticle[tb_grp_article.CN_NAME]}(uid={dicArticle[tb_grp_article.CN_UID]})"); DateTime dtNow = DateTime.Now; string sWorkingName = $"FBUpload1920_1080_{dicArticle[tb_grp_article.CN_UID]}_{dtNow:yyyyMMddHHmmssfff}_{i_nRetry}"; string sWorkingSpace = Path.Combine(Directory.GetCurrentDirectory(), $"{ScriptFolder}\\{sWorkingName}.myrpa"); if (!Directory.Exists(sWorkingSpace)) { Directory.CreateDirectory(sWorkingSpace); } #region sMsg = Read(sCmdURL, "GROUP.ArticleMediaService", out CResponseMessage crpArticleMedia, new Dictionary() { { tb_grp_article_media.CN_STATUS_FLAG, 1 }, { tb_grp_article_media.CN_ARTICLE_UID, dicArticle[tb_grp_article.CN_UID] } }); if (sMsg != null) { break; } List qrsArticleMedia = (crpArticleMedia.param["data"] as JToken).ToObject>(); List lsName = new List(); int nMediaCount = 0; // Dowload media for (int nMediaIdx = 0; nMediaIdx < qrsArticleMedia.Count; nMediaIdx++) { tb_grp_article_media dicMedia = qrsArticleMedia[nMediaIdx]; string sMediaUid = dicMedia.media_id.ToString(); string sMediaURL = $"{sDownloadURL}{sMediaUid}"; _log.Info($"Downlaod media({sMediaURL}) for name={dicArticle[tb_grp_article.CN_NAME]} uid={dicArticle[tb_grp_article.CN_UID]}"); using WebClient wc = new WebClient(); Byte[] byData = wc.DownloadData(sMediaURL); string header = wc.ResponseHeaders["Content-Disposition"] ?? string.Empty; if (header != string.Empty) { nMediaCount++; int nExtensionIdx = header.LastIndexOf(".", StringComparison.OrdinalIgnoreCase); string sFileName = $"{nMediaCount}{header.Substring(nExtensionIdx)}"; string sPath = Path.Combine(sWorkingSpace, sFileName); if (File.Exists(sPath)) { File.Delete(sPath); } File.WriteAllBytes(sPath, byData); lsName.Add(sFileName); } else { sMsg = $"No Header[\"Content - Disposition\""; break; } } if (sMsg != null) { break; } if (lsName.Count == 0) { break; } #endregion string sFBID = dicArticle[tb_grp_article.CN_FB_ARTICLE_ID].ToString(); string[] saFBID = sFBID.Split("_".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); _log.Info($"Generate Script for name={dicArticle[tb_grp_article.CN_NAME]} uid={dicArticle[tb_grp_article.CN_UID]} "); if (UseOrigtekrpa == "true") { sMsg = generateOrigtekRPAScrit(sWorkingName, sWorkingSpace, i_gUser.fb_account, i_gUser.fb_password, saFBID[0], saFBID[1], lsName); if (sMsg != null) { break; } sMsg = RunOrigtekRPAScript(sWorkingSpace); if (sMsg != null) { break; } _log.Info($"RunScript result = '{sMsg}'"); } else { sMsg = generatePupetterScrit(sWorkingName, sWorkingSpace, i_gUser.fb_account, i_gUser.fb_password, saFBID[0], saFBID[1], lsName); sMsg = RunPupetterScript(sWorkingSpace); _log.Info($"generatePupetterScrit result = '{sMsg}'"); } #region Origtek RPA #endregion _log.Info($"Handle article end {dicArticle[tb_grp_article.CN_NAME]}(uid={dicArticle[tb_grp_article.CN_UID]})"); } while (false); } catch (Exception ex) { sMsg = ex.Message; _log.Error($"Process name:(uid={dicArticle[tb_grp_article.CN_UID]}) exception fail. ErrorMsg={ex.Message} "); } return sMsg; } public string RunPupetterScript(string i_sWorkingSpace) { string sMsg = null; try { do { _log.Info($"RunPupetterScript('{i_sWorkingSpace}')"); var proc = new System.Diagnostics.Process(); proc.StartInfo.CreateNoWindow = true; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.FileName = "node.exe"; proc.StartInfo.Arguments = $"\"{Path.Combine(i_sWorkingSpace, "pupetter.js")}\""; proc.Start(); string sOut = proc.StandardOutput.ReadToEnd(); proc.WaitForExit(); if (!string.IsNullOrWhiteSpace(sOut)) { _log.Debug($"RPA Console output: {sOut}"); if (sOut.Trim() != "OK") { sMsg = sOut; } } _log.Info($"pupetter result '{sOut}'"); } while (false); } catch (Exception ex) { sMsg = ex.Message; } return sMsg; } public string RunOrigtekRPAScript(string i_sWorkingSpace) { string sMsg = null; try { do { FileInfo fi = new FileInfo(_dicSetting["rpa"]); _log.Debug($"RPA={_dicSetting["rpa"]}"); using Process pRun = new Process(); pRun.StartInfo.FileName = _dicSetting["rpa"]; pRun.StartInfo.Arguments = $"-w \"{i_sWorkingSpace}\""; pRun.StartInfo.UseShellExecute = false; pRun.StartInfo.RedirectStandardOutput = true; pRun.StartInfo.WorkingDirectory = fi.Directory.FullName; pRun.Start(); pRun.WaitForExit(150000); string sOut = pRun.StandardOutput.ReadToEnd(); if (!string.IsNullOrWhiteSpace(sOut)) { sMsg = sOut; break; } } while (false); } catch (Exception ex) { sMsg = ex.Message; } return sMsg; } private void _HandleMedia(IEnumerable> i_idicArticles) { try { do { string sServerURL = g_apiServer; string sCmdURL = $"{sServerURL}/Cmd"; int nLocalRetryMax = _dicSetting.ContainsKey("localretry") ? Int32.Parse(_dicSetting["localretry"]) : 1; _log.Info($"nLocalRetryMax = {nLocalRetryMax}"); // 跑每篇文章 foreach (Dictionary dicArticle in i_idicArticles) { if (!dicArticle.ContainsKey(tb_grp_article.CN_GROUP_UID)) { _log.Error($"{nameof(_HandleMedia)} No CN_GROUP_UID"); continue; } string sArticleUid = dicArticle[tb_grp_article.CN_UID].ToString(); string sGroupUid = dicArticle[tb_grp_article.CN_GROUP_UID].ToString(); if (!g_lsGroupUidsRPA.Contains(sGroupUid)) { _log.Debug($"Skip - {sArticleUid} since no matched group {sGroupUid}"); continue; } string sMsgOneArticle = null; if (!dicArticle.ContainsKey(tb_grp_article.CN_GROUP_USER_UID)) { _log.Error($"{nameof(_HandleMedia)} No CN_GROUP_USER_UID"); continue; } object oUserUID = dicArticle[tb_grp_article.CN_GROUP_USER_UID]; if (oUserUID == null) { _log.Error($"{nameof(_HandleMedia)} CN_GROUP_USER_UID = null"); continue; } string sUserUID = oUserUID.ToString(); if (string.IsNullOrWhiteSpace(sUserUID)) { _log.Error($"{nameof(_HandleMedia)} IsNullOrWhiteSpace"); continue; } tb_grp_group2user gUser = _lgroup2user2.FirstOrDefault(f => f.uid == sUserUID); if (gUser == null) { _log.Error($"{nameof(_HandleMedia)} No poster information"); continue; } if (string.IsNullOrWhiteSpace(gUser.fb_password) || string.IsNullOrWhiteSpace(gUser.fb_account)) { _log.Error($"{nameof(_HandleMedia)} No poster information {JsonConvert.SerializeObject(gUser)}"); continue; } for (int nLocalRetry = 0; nLocalRetry < nLocalRetryMax; nLocalRetry++) { sMsgOneArticle = _HandleMediaAnArticle(dicArticle, nLocalRetry, gUser); if (sMsgOneArticle == null) { break; } } if (sMsgOneArticle == null) { UpdateStatus(sCmdURL, "GROUP.ArticleManage2Service", out CResponseMessage crpArticleWait, new Dictionary() { { tb_grp_article.CN_RPA_STATUS, 1 } }, new Dictionary() { { tb_grp_article.CN_UID, dicArticle[tb_grp_article.CN_UID] } }); } else { _log.Error($"Process name:{dicArticle[tb_grp_article.CN_NAME]}(uid={dicArticle[tb_grp_article.CN_UID]}) fail. ErrorMsg={sMsgOneArticle} "); UpdateStatus(sCmdURL, "GROUP.ArticleManage2Service", out CResponseMessage crpArticleWait, new Dictionary() { { tb_grp_article.CN_RETRY, (int.Parse(dicArticle[tb_grp_article.CN_RETRY].ToString())+1) } }, new Dictionary() { { tb_grp_article.CN_UID, dicArticle[tb_grp_article.CN_UID] } }); } _forceCloseAllFFMPEG(); _forceCloseAllChrome(); } } while (false); } catch (Exception ex) { _log.Error($"{nameof(_HandleMedia)} exception fail. ErrorMsg={ex.Message}"); } if (i_idicArticles.Any()) { _forceCloseAllChrome(); _forceCloseAllFFMPEG(); } } private void _forceCloseAllChrome() { // Force remove all chrome foreach (var process in Process.GetProcesses().Where(pr => pr.ProcessName == "chrome")) { process.Kill(); } } private void _forceCloseAllFFMPEG() { // Force remove all chrome foreach (var process in Process.GetProcesses().Where(pr => pr.ProcessName == "FFMPEG_FILE")) { process.Kill(); } } private string PushPost(string i_sURL, string i_sDownloadURL, string i_sModule, out CResponseMessage o_crpResult, Dictionary i_dicData, Dictionary i_dicWhere) { _log.Info("PushPost"); Dictionary dicPara = new Dictionary(); dicPara.Add(BLWording.QRY_MASTER, new List>() { new Dictionary() { { BLWording.DATA, i_dicData }, { BLWording.WHEREDATA, i_dicWhere }, { "downloadurl", i_sDownloadURL }, } }); dicPara.Add("downloadurl", i_sDownloadURL); return _Action(i_sURL, i_sModule, "PushPost", out o_crpResult, dicPara); } protected string generatePupetterScrit( string i_sWorkingName, string i_sWorkSpath, string i_sAccount, string i_sPassword, string i_sGroupID, string i_sFBArticleID, List i_lsMediaPath) { string sMsg = null; try { do { string sTemplate = File.ReadAllText("pupetterTemplate.jst", Encoding.UTF8); if (!Directory.Exists(i_sWorkSpath)) { Directory.CreateDirectory(i_sWorkSpath); } string bNeedLogin = _dicSetting.ContainsKey("use_incognito") ? (_dicSetting["use_incognito"].ToLower() == "true" ? "true" : "false") : "false"; List lsMediaPath = new List(); if (i_lsMediaPath != null && i_lsMediaPath.Any()) { i_lsMediaPath.ForEach(f => { if (f.IndexOf(":") != -1) { lsMediaPath.Add(f); } else { lsMediaPath.Add(Path.Combine(i_sWorkSpath, f)); } }); } File.WriteAllText($"{Path.Combine(i_sWorkSpath, $"pupetter.js")}", sTemplate. Replace("<%NEED_LOGIN%>", bNeedLogin.ToString()). Replace("<%POSTURL%>", $"https://www.facebook.com/groups/{i_sGroupID}/permalink/{i_sFBArticleID}/"). Replace("<%ACCOUNT%>", i_sAccount). Replace("<%ENTERCODE%>", i_sPassword). Replace("<%UPLOAD_MEDIA_JSONARRAY%>", JsonConvert.SerializeObject(lsMediaPath)), Encoding.UTF8); } while (false); } catch (Exception ex) { System.Diagnostics.Debug.Write(ex.Message); // Ignore sMsg = ex.Message; } return sMsg; } protected string generateOrigtekRPAScrit( string i_sWorkingName, string i_sWorkSpath, string i_sAccount, string i_sPassword, string i_sGroupID, string i_sFBArticleID, List i_lsName) { string sMsg = null; try { do { bool bNeedLogin = _dicSetting.ContainsKey("use_incognito") ? _dicSetting["use_incognito"].ToLower() == "true" : false; string sURL = $"https://www.facebook.com/groups/{i_sGroupID}/permalink/{i_sFBArticleID}/"; List lci = new List(); if (bNeedLogin) { lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_SETURL_INCOGNITO, Value = sURL, SleepAfterEvent = 10 }); } else { lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_SETURL, Value = sURL, SleepAfterEvent = 10 }); } // Login if (bNeedLogin) { lci.AddRange(new List() { new CommandInfo() { Command = CommandInfo.EVENT_SENDKEY, Value = "{PGDN}", SleepAfterEvent = 2 }, new CommandInfo() { Command = CommandInfo.EVENT_POSITION_CLICK, Value = "CENTER", SleepAfterEvent = 2 }, new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\txtEmail.bmp" } }, SetMainBrowserFocus = true }, // 按掉FB LOADING失敗 new CommandInfo() { Command = CommandInfo.EVENT_PASTE, Value = i_sAccount, SetMainBrowserFocus = true }, new CommandInfo() { Command = CommandInfo.EVENT_POSITION_CLICK, Value = "CENTER" }, new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\txtPassword.bmp" } }, SetMainBrowserFocus = true }, new CommandInfo() { Command = CommandInfo.EVENT_PASTE, Value = i_sPassword, SetMainBrowserFocus = true }, new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnLogin.bmp" } }, SetMainBrowserFocus = true, SleepAfterEvent = 15 }, // Login }); } else { lci.AddRange(new List() { new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { {"PATH", @"assets\btnRestore.bmp" }, { "ACTIONIFEXIST", "TRUE"} }, SleepAfterEvent = 3}, // 按掉Chrome還原 new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { {"PATH", @"assets\btnDisablenotice.bmp" }, { "ACTIONIFEXIST", "TRUE"} }, SleepAfterEvent = 3}, // 關閉訊息推播 }); } lci.AddRange(new List() { new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { {"PATH", @"assets\btnMistake.bmp" }, { "ACTIONIFEXIST", "TRUE"} }, SleepAfterEvent = 5}, // 按掉FB LOADING失敗 // Enter Edit dialog new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { {"PATH", @"assets\btnPopMenu.bmp" } } , SleepAfterEvent = 2}, new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { {"PATH", @"assets\btnEditArticle.bmp" }, { "PATH1", @"assets\btnEditArticle2.bmp" } }, WaitTargetMilliSecond = 1500, SleepAfterEvent = 2}, new CommandInfo() { Command = CommandInfo.EVENT_MOUSE_MOVE, Value = "OUTBOUND" , SleepAfterEvent = 2 }, new CommandInfo() { Command = CommandInfo.EVENT_FB_REMOVE_ALLMEDIA, Parameters = new Dictionary() { {"PATH", @"assets\btnRemoveAllMedia.bmp" }, { "PATH1", @"assets\btnRemoveAllMedia2.bmp" }, { "PATH2", @"assets\btnRemoveAllMedia3.bmp" } } , SleepAfterEvent = 2}, new CommandInfo() { Command = CommandInfo.EVENT_POSITION_CLICK, Value = "CENTER" }, }); int nIdx = 0; foreach (string sPath in i_lsName) { if (nIdx++ == 0) { lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_MOUSE_MOVE, Value = "CENTER" }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_MOUSE_MOVE, Value = "OUTBOUND" }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnUploadZero.bmp" }, { "PATH4", @"assets\btnUploadNoneZero4.bmp" }, { "PATH3", @"assets\btnUploadNoneZero3.bmp" }, { "PATH2", @"assets\btnUploadNoneZero2.bmp" }, { "PATH1", @"assets\btnUploadNoneZero.bmp" } }, WaitTargetMilliSecond = 1500, SleepAfterEvent = 5 }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_POSITION_CLICK, Value = "CENTER", SleepAfterEvent = 2 }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_MOUSE_SCROLL, Value = "DOWN", Repeat = 5 }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_MOUSE_MOVE, Value = "OUTBOUND" }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnUploadNew1.bmp" }, { "PATH1", @"assets\btnUploadNew2.bmp" }, { "PATH4", @"assets\btnUploadZero.bmp" }, { "PATH5", @"assets\btnUploadNoneZero.bmp" }, { "PATH6", @"assets\btnUploadNoneZero2.bmp" }, { "PATH7", @"assets\btnUploadNoneZero3.bmp" }, { "PATH8", @"assets\btnUploadNoneZero4.bmp" } }, WaitTargetMilliSecond = 1500, SleepAfterEvent = 3 }); } else { lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnUploadNew3.bmp" }, { "PATH3", @"assets\btnUploadNew4.bmp" }, { "PATH4", @"assets\btnUploadZero.bmp" }, { "PATH5", @"assets\btnUploadNoneZero.bmp" }, { "PATH6", @"assets\btnUploadNoneZero2.bmp" }, { "PATH7", @"assets\btnUploadNoneZero3.bmp" }, { "PATH8", @"assets\btnUploadNoneZero4.bmp" } }, WaitTargetMilliSecond = 1500, SleepAfterEvent = 3 }); } lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_SETVALUETOUPLOADDLG, Parameters = new Dictionary() { { "CAPTION", "開啟" }, { "PATH", $"{sPath}" } }, SleepAfterEvent = 2 }); lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_CHECKWINDOWEXIST, Parameters = new Dictionary() { { "CAPTION", "開啟" }, { "EXIST", "False" } } }); } /* new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnUploadZero.bmp" }, { "PATH1", @"assets\btnUploadNoneZero.bmp" } } , SleepAfterEvent = 2}, new CommandInfo() { Command = CommandInfo.EVENT_SETVALUETOUPLOADDLG, Parameters = new Dictionary() { { "CAPTION", "開啟" } , {"PATH", @"D:\Data\test\2.jpg" }}}, new CommandInfo() { Command = CommandInfo.EVENT_CHECKWINDOWEXIST, Parameters = new Dictionary() { { "CAPTION", "開啟" }, { "EXIST", "False"} }}, new CommandInfo() { Command = CommandInfo.EVENT_IMAGES_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnUploadZero.bmp" }, { "PATH1", @"assets\btnUploadNoneZero.bmp" } } , SleepAfterEvent = 2}, new CommandInfo() { Command = CommandInfo.EVENT_SETVALUETOUPLOADDLG, Parameters = new Dictionary() { { "CAPTION", "開啟" } , {"PATH", @"D:\Data\test\1.jpg" }}}, new CommandInfo() { Command = CommandInfo.EVENT_CHECKWINDOWEXIST, Parameters = new Dictionary() { { "CAPTION", "開啟" }, { "EXIST", "False"} }}, */ lci.Add(new CommandInfo() { Command = CommandInfo.EVENT_IMAGE_CLICK, Parameters = new Dictionary() { { "PATH", @"assets\btnSave.bmp" } }, SetMainBrowserFocus = true, SleepAfterEvent = 10 }); File.WriteAllText(Path.Combine(i_sWorkSpath, $"{i_sWorkingName}.json"), JsonConvert.SerializeObject(lci), Encoding.UTF8); string[] saOriginPaths = Directory.GetFiles("FBMedia.MyScript"); string sAssetsFolder = Path.Combine(i_sWorkSpath, "assets"); Directory.CreateDirectory(sAssetsFolder); foreach (string sOriginPath in saOriginPaths) { FileInfo fi = new FileInfo(sOriginPath); string sNewPath = Path.Combine(sAssetsFolder, fi.Name); File.Copy(sOriginPath, sNewPath); } } while (false); } catch (Exception ex) { System.Diagnostics.Debug.Write(ex.Message); // Ignore sMsg = ex.Message; } return sMsg; } private static string _Action(string i_sURL, string i_sModule, string i_sMethod, out CResponseMessage o_crpResult, Dictionary i_ldicPara) { string sMsg; CResponseMessage crpResult = null; try { do { SendWebApiRequest swr = new SendWebApiRequest(); CRequestMessage crm = new CRequestMessage() { module = i_sModule, method = i_sMethod, param = i_ldicPara, customparam = new Dictionary() { { BLWording.PROGRAMID, "TruckAP" } } }; CReqestPack crqp = new CReqestPack { Reqs = new List() { new CReqestItem(){ Req = crm } } }; sMsg = swr.RunEncryptRequest(i_sURL, crqp, out string sResult); if (sMsg != null) { _log.Error($"Result = {sMsg}"); break; } else { _log.Info($"Response = {sResult}"); CResponsePack crppResult = JsonConvert.DeserializeObject(sResult); if (crppResult == null) { sMsg = "Covert CResponsePack Fail"; break; } CResponseMessage crp = crppResult.Reps[0]; if (crp.result == EResponseResult.RR_FALSE) { sMsg = crp.msg; break; } crpResult = crp; } } while (false); } catch (Exception ex) { sMsg = ex.Message; } o_crpResult = crpResult; return sMsg; } private void UpdateStatus(string i_sURL, string i_sModule, out CResponseMessage o_crpResult, Dictionary i_dicData, Dictionary i_dicWhere) { Dictionary dicPara = new Dictionary { { BLWording.UPD_MASTER, new List>() { new Dictionary() { { BLWording.DATA, i_dicData }, { BLWording.WHEREDATA, i_dicWhere } } } } }; _Action(i_sURL, i_sModule, "UpdateStatus", out o_crpResult, dicPara); } private string Read(string i_sURL, string i_sModule, out CResponseMessage o_crpResult, Dictionary i_dicWhere) { return Query(i_sURL, i_sModule, "Read", out o_crpResult, i_dicWhere); } private string Query(string i_sURL, string i_sModule, string i_sAction, out CResponseMessage o_crpResult, Dictionary i_dicWhere = null) { Dictionary dicPara = new Dictionary { { BLWording.QRY_MASTER, new List>() { new Dictionary() { { BLWording.WHEREDATA, i_dicWhere } } } } }; return _Action(i_sURL, i_sModule, i_sAction, out o_crpResult, dicPara); } private static void LoadLog4netConfig() { var repository = LogManager.CreateRepository( Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy) ); XmlConfigurator.Configure(repository, new FileInfo("Log4Net.config")); } private void Form1_Load(object sender, EventArgs e) { string sMsg = null; try { string[] saFolders = Directory.GetDirectories(ScriptFolder); foreach (string sFoder in saFolders) { DirectoryInfo di = new DirectoryInfo(sFoder); if (di.CreationTime.AddDays(3) < DateTime.Now) { Directory.Delete(sFoder, true); } } } catch { } int nIndex = 0; StringBuilder sb = new StringBuilder($"Form1_Load start! Current directory: {Directory.GetCurrentDirectory()}"); string[] saCmd = Environment.GetCommandLineArgs(); foreach (string sCmd in saCmd) { sb.AppendLine($"Para[{nIndex++}] = '{sCmd}'"); } _log.Info(sb.ToString()); string sForceScript = null; if (saCmd.Any()) { for (int nIdx = 0; nIdx < saCmd.Count(); nIdx++) { if (saCmd[nIdx] == "-w") { sForceScript = saCmd[nIdx + 1]; nIdx++; } } } try { if (sForceScript != null) { if (UseOrigtekrpa == "true") { RunOrigtekRPAScript(sForceScript); } else { RunPupetterScript(sForceScript); } } else { string sapiurlori = _dicSetting["apiserver"]; string[] saapiurl = sapiurlori.Split(";,".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); _log.Info($"apiserver:{sapiurlori}"); g_lsGroupUidsPost = _uidsInSetting(group_uids_post); g_lsGroupUidsRPA = _uidsInSetting(group_uids_rpa); if (g_lsGroupUidsPost.Any() || g_lsGroupUidsRPA.Any()) { foreach (string sapiurl in saapiurl) { g_apiServer = sapiurl; string sSuffix = ""; foreach (string sCmd in saCmd) { if (sCmd == "-a" || sCmd == "-v") { sSuffix = sCmd; break; } } sMsg = Run(sSuffix); Thread.Sleep(500); } } } } catch (Exception ex) { sMsg = ex.Message; } if (sMsg != null) { _log.Info($"Form1_Load end with exception. {sMsg}"); } else { _log.Info($"Form1_Load end Success."); } this.Close(); } private List _uidsInSetting(string i_sKey) { List lsUids = new List(); string sSettingValue = _dicSetting[i_sKey]; string[] saUids = sSettingValue.Split(";,".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (string sUid in saUids) { lsUids.Add(sUid); _log.Info($"{i_sKey} - group_uid:{sUid}"); } return lsUids; } } }