diff --git a/AllBase/BaseClass.cs b/AllBase/BaseClass.cs index 7cfc74c..fd3b73e 100644 --- a/AllBase/BaseClass.cs +++ b/AllBase/BaseClass.cs @@ -27,7 +27,7 @@ namespace AllBase /// /// 版本ID /// - public static int VersionCount = 613; + public static int VersionCount = 615; //public static int VersionCount = 613; /// diff --git a/AllBase/Model/Result/ShopLoginInfo.cs b/AllBase/Model/Result/ShopLoginInfo.cs index ae8fd91..5b8f151 100644 --- a/AllBase/Model/Result/ShopLoginInfo.cs +++ b/AllBase/Model/Result/ShopLoginInfo.cs @@ -31,6 +31,7 @@ namespace AllBase.Model.Result public string TouTiaoId { get; set; } public string Cookies { get; set; } = ""; public string Cookies2 { get; set; } = ""; + public string pddid { get; set; } public ConcurrentList AntiContents { get; set; } = new ConcurrentList(); public Dictionary DictMultiCookies { get; set; } = new Dictionary(); public string LoginStatus { get; set; } diff --git a/DllReference/FiddlerCore4.dll b/DllReference/FiddlerCore4.dll new file mode 100644 index 0000000..bf22ee5 Binary files /dev/null and b/DllReference/FiddlerCore4.dll differ diff --git a/KJDService/KJD_WebService/BLL/BXX/BXXShopManage.cs b/KJDService/KJD_WebService/BLL/BXX/BXXShopManage.cs index e334b8e..ea78e5a 100644 --- a/KJDService/KJD_WebService/BLL/BXX/BXXShopManage.cs +++ b/KJDService/KJD_WebService/BLL/BXX/BXXShopManage.cs @@ -94,9 +94,9 @@ namespace KJD_Web.BLL.BXX } else { - sql = "SELECT s.id,s.login_name,s.login_pass,s.cookie,s.cookie2,s.anti_contents,s.shop_id,s.shop_account,s.sub_user_name,s.user_name," + - "s.company_name,s.notes,s.login_status,s.login_status2,c.add_product_remaining,c.add_product_month,s.add_time,s.mdy_time," + - "s.add_sub_sa_time,s.operate_sub_sa_name"; + sql = "SELECT s.id,s.login_name,s.login_pass,s.cookie,s.cookie2,s.anti_contents,s.pddid,s.shop_id,s.shop_account,s.sub_user_name," + + "s.user_name,s.company_name,s.notes,s.login_status,s.login_status2,c.add_product_remaining,c.add_product_month," + + "s.add_time,s.mdy_time,s.add_sub_sa_time,s.operate_sub_sa_name"; //sql += " FROM bxx.shop s WHERE 1=1"; sql += " FROM bxx.shop s LEFT JOIN bxx.shop_add_prod_count c ON s.shop_id=c.shop_id WHERE 1=1"; @@ -131,8 +131,8 @@ namespace KJD_Web.BLL.BXX login_status2 = row["login_status2"].ToString(), add_product_remaining = row["add_product_remaining"].ParseToInt(), add_product_month = row["add_product_month"].ParseToInt(), - operate_sub_sa_name = row["operate_sub_sa_name"] as string, - + operate_sub_sa_name = row["operate_sub_sa_name"].ParseToString(), + pddid = row["pddid"].ParseToString(), }; shopList.Add(shop); } @@ -683,6 +683,7 @@ namespace KJD_Web.BLL.BXX string cookie2 = RegexUtils.GetStringQuery(ref inputData, "cookie2"); string login_status = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "login_status")); string login_status2 = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "login_status2")); + string pddid = HtmlUtils.UrlDecodeUtf8(RegexUtils.GetStringQuery(ref inputData, "pddid")); int r2 = 0; int.TryParse(RegexUtils.GetStringQuery(ref inputData, "r2"), out r2); @@ -703,6 +704,8 @@ namespace KJD_Web.BLL.BXX sql += " login_status='" + login_status + "',"; if (login_status2 != null) sql += " login_status2='" + login_status2 + "',"; + if (pddid != null) + sql += " pddid='" + pddid + "',"; sql = sql.TrimEnd(','); sql += " where login_name='" + login_name + "'"; diff --git a/KJDService/KJD_WebService/Model/ShopModel/ShopParam.cs b/KJDService/KJD_WebService/Model/ShopModel/ShopParam.cs index 3a5b888..a1bbc62 100644 --- a/KJDService/KJD_WebService/Model/ShopModel/ShopParam.cs +++ b/KJDService/KJD_WebService/Model/ShopModel/ShopParam.cs @@ -13,6 +13,7 @@ namespace KJD_Web.Model.ShopModel public string cookie { get; set; } public string cookie2 { get; set; } public string anti_contents { get; set; } + public string pddid { get; set; } public string shop_id { get; set; } public string shop_account { get; set; } public string sub_user_name { get; set; } diff --git a/TEMUKJD/BLL/HttpResponseBLL.cs b/TEMUKJD/BLL/HttpResponseBLL.cs index 6620a0d..efd299a 100644 --- a/TEMUKJD/BLL/HttpResponseBLL.cs +++ b/TEMUKJD/BLL/HttpResponseBLL.cs @@ -331,6 +331,13 @@ namespace TemuKJD.BLL request.Headers.Add("Anti-Content", AntiContent); request.Headers.Add("sec-ch-ua-platform", @"""Windows"""); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"; + if (cookies.Contains("PASS_ID=windows") && !string.IsNullOrEmpty(shop.pddid)) + { + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.Headers.Add("pddid", @"zULm8bXS"); + request.Headers.Add("pddid", shop.pddid); + } request.Headers.Add("ETag", rckk); request.Headers.Add("sec-ch-ua", @"""Not;A=Brand"";v=""99"", ""Google Chrome"";v=""139"", ""Chromium"";v=""139"""); request.ContentType = "application/json"; @@ -409,6 +416,13 @@ namespace TemuKJD.BLL request.Headers.Add("Anti-Content", AntiContent); request.Headers.Add("sec-ch-ua-platform", @"""Windows"""); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"; + if (cookies.Contains("PASS_ID=windows") && !string.IsNullOrEmpty(shop.pddid)) + { + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.Headers.Add("pddid", @"zULm8bXS"); + request.Headers.Add("pddid", shop.pddid); + } request.Headers.Add("ETag", rckk); request.Headers.Add("sec-ch-ua", @"""Not;A=Brand"";v=""99"", ""Google Chrome"";v=""139"", ""Chromium"";v=""139"""); request.Headers.Add("sec-ch-ua-mobile", @"?0"); @@ -473,6 +487,13 @@ namespace TemuKJD.BLL request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0"); request.Headers.Add("sec-ch-ua-platform", @"""Windows"""); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"; + if (cookies.Contains("PASS_ID=windows") && !string.IsNullOrEmpty(shop.pddid)) + { + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + //request.Headers.Add("pddid", @"zULm8bXS"); + request.Headers.Add("pddid", shop.pddid); + } request.Headers.Add("ETag", rckk); request.Headers.Add("sec-ch-ua", @"""Not;A=Brand"";v=""99"", ""Google Chrome"";v=""139"", ""Chromium"";v=""139"""); request.ContentType = "multipart/form-data; boundary=" + boundary; diff --git a/TEMUKJD/BLL/MemoryReader.cs b/TEMUKJD/BLL/MemoryReader.cs new file mode 100644 index 0000000..4297c1c --- /dev/null +++ b/TEMUKJD/BLL/MemoryReader.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace TemuKJD.BLL +{ + public class MemoryReader + { + [DllImport("kernel32.dll")] + public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesRead); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesWritten); + + [DllImport("kernel32.dll")] + public static extern bool CloseHandle(IntPtr hObject); + + // 声明GetLastError函数 + [DllImport("kernel32.dll")] + private static extern int GetLastError(); + + const int PROCESS_WM_READ = 0x0010; + const int PROCESS_WM_WRITE = 0x0020; + const int PROCESS_WM_ALL = 0x003F; + const int PROCESS_ALL_ACCESS = 0x1F0FFF; + + public static void ReadMemory(int nProcess, int nAddress, int nReadSize) + { + int processId = nProcess; // 目标进程ID + //IntPtr hProcess = OpenProcess(PROCESS_WM_READ | PROCESS_WM_WRITE, false, processId); + IntPtr hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, processId); + if (hProcess == IntPtr.Zero) + { + int errorCode = GetLastError(); + //Console.WriteLine("Process access failed."); + BaseForms.BaseMsgForm.ShowError("Process access failed."); + return; + } + + int endAddress = nAddress + nReadSize; + while (nAddress < endAddress) + { + IntPtr address = new IntPtr(nAddress); // 目标内存地址 + byte[] buffer = new byte[1024]; // 读取数据的缓冲区 + uint bytesRead; + if (ReadProcessMemory(hProcess, address, buffer, (uint)buffer.Length, out bytesRead)) + { + //Console.WriteLine("Read successful."); + string s = System.Text.Encoding.Default.GetString(buffer); + if (s.Contains("pddidResult")) + { + + } + } + else + { + //Console.WriteLine("Read failed."); + // 获取最后一个错误代码 + int errorCode = GetLastError(); + //Console.WriteLine("Error code: " + errorCode); + // 将错误代码转换为异常(可选) + Exception ex = Marshal.GetExceptionForHR(errorCode); + //BaseForms.BaseMsgForm.ShowError(ex.Message); + } + nAddress += 1000; + } + //CloseHandle(hProcess); + } + } +} diff --git a/TEMUKJD/BLL/ShopBLL.cs b/TEMUKJD/BLL/ShopBLL.cs index 6fc9b2b..bd508f1 100644 --- a/TEMUKJD/BLL/ShopBLL.cs +++ b/TEMUKJD/BLL/ShopBLL.cs @@ -242,6 +242,7 @@ namespace TemuKJD.BLL shop.LoginStatus2 = BaseRegex.GetStringJson(ref shopStr, "login_status2"); shop.OperateSubSaName = BaseRegex.GetStringJson(ref shopStr, "operate_sub_sa_name"); shop.AddProductRemaining = BaseRegex.GetIntJson(ref shopStr, "add_product_remaining"); + shop.pddid = BaseRegex.GetStringJson(ref shopStr, "pddid"); if (BaseClass.MainPath == "binxixi") { diff --git a/TEMUKJD/Helper/CustomResourceRequestHandlerLocal.cs b/TEMUKJD/Helper/CustomResourceRequestHandlerLocal.cs index 8cc0163..6987584 100644 --- a/TEMUKJD/Helper/CustomResourceRequestHandlerLocal.cs +++ b/TEMUKJD/Helper/CustomResourceRequestHandlerLocal.cs @@ -23,7 +23,7 @@ namespace TemuKJD.Helper public class BaseResourceRequestHandler : ResourceRequestHandler { public string UserAgent = string.Empty; - public Func BeforeResourceLoadEvent; // sender, requestUrl, postData, true(表示取消执行) + public Func BeforeResourceLoadEvent; // sender, requestUrl, postData, true(表示取消执行) public Action ResourceLoadCompleteEvent; // sender, requestUrl, postData, responseData public Action ResourceRedirectEvent; // sender, requestUrl, postData, redirectUrl public string[] ResourceContentTypeRegister = new string[] { "application/json", "javascript", "application/x-www-form-urlencoded", "text/html", "text/plain" }; @@ -96,7 +96,7 @@ namespace TemuKJD.Helper try { string postData = GetPostData(request); - bool? result = BeforeResourceLoadEvent?.Invoke(chromiumWebBrowser, request.Url, postData); + bool? result = BeforeResourceLoadEvent?.Invoke(chromiumWebBrowser, request.Url, postData, request); } catch (Exception ex) { diff --git a/TEMUKJD/Helper/FddlHelper.cs b/TEMUKJD/Helper/FddlHelper.cs new file mode 100644 index 0000000..6be4617 --- /dev/null +++ b/TEMUKJD/Helper/FddlHelper.cs @@ -0,0 +1,90 @@ +using AllBase.Model.Result; +using Fiddler; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TemuKJD.BaseForms; + +namespace TemuKJD.Helper +{ + public class FddlHelper + { + + public bool InstallCertificate() + { + //FiddlerApplication.Log.LogString($"安装证书,为了监听https请求"); + if (!CertMaker.rootCertExists()) + { + if (!CertMaker.createRootCert() || !CertMaker.trustRootCert()) + { + BaseMsgForm.ShowError("证书安装失败,请重试!"); + return false; + } + } + return true; + } + + /// 启动fiddlercore本地设置的代理端口监听 + public void StartupFiddlerCore(int port = 9898) + { + //Console.WriteLine("fiddler启动了...listening: port: 127.0.0.1:" + port); + FiddlerApplication.Startup(port, FiddlerCoreStartupFlags.Default | FiddlerCoreStartupFlags.RegisterAsSystemProxy); + //FiddlerApplication.Log.LogString($"Created endpoint listening on port {CONFIG.ListenPort}"); + } + + public void AttachListening() + { + //FiddlerApplication.OnNotification += (o, nea) => Console.WriteLine($"** NotifyUser: {nea.NotifyString}"); + //FiddlerApplication.Log.OnLogString += (o, lea) => Console.WriteLine($"** LogString: {lea.LogString}"); + + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + FiddlerApplication.BeforeResponse += FiddlerApplication_BeforeResponse; + } + + /// 拦截请求返回Request信息 + private void FiddlerApplication_BeforeRequest(Session oSession) + { + //Debug.WriteLine(oSession.fullUrl); + + // In order to enable response tampering, buffering mode MUST + // be enabled; this allows FiddlerCore to permit modification of + // the response in the BeforeResponse handler rather than streaming + // the response to the client as the response comes in. + oSession.bBufferResponse = false; + + // Set this property if you want FiddlerCore to automatically authenticate by + // answering Digest/Negotiate/NTLM/Kerberos challenges itself + //session["X-AutoAuth"] = "(default)"; + + //FiddlerApplication.Log.LogString($" {oSession.fullUrl }"); + } + + /// 拦截请求返回Response信息 + private void FiddlerApplication_BeforeResponse(Session oSession) + { + + } + + /// 关闭fiddlercore设置的代理 + public void UninstallFiddler() + { + if (FiddlerApplication.IsStarted()) + { + FiddlerApplication.Shutdown(); + } + } + + /// 卸载证书 + public bool UninstallCertificate() + { + if (CertMaker.rootCertExists()) + { + if (!CertMaker.removeFiddlerGeneratedCerts(true)) + return false; + } + return true; + } + } +} diff --git a/TEMUKJD/KJD.csproj b/TEMUKJD/KJD.csproj index 5088128..6481174 100644 --- a/TEMUKJD/KJD.csproj +++ b/TEMUKJD/KJD.csproj @@ -54,6 +54,9 @@ False ..\DllReference\DevComponents.DotNetBar2.dll + + ..\DllReference\FiddlerCore4.dll + ..\DllReference\NaiBa.CefHelper.138.dll @@ -72,6 +75,7 @@ ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll + @@ -80,6 +84,7 @@ + @@ -92,6 +97,7 @@ + @@ -103,6 +109,7 @@ + Form @@ -473,6 +480,12 @@ UcAddPrice.cs + + Form + + + PDDShopUpdateFddlCookieForm.cs + Form @@ -917,6 +930,9 @@ UcAddPrice.cs + + PDDShopUpdateFddlCookieForm.cs + CefForm.cs diff --git a/TEMUKJD/KJDForms/ShopForms/ShopListForm.cs b/TEMUKJD/KJDForms/ShopForms/ShopListForm.cs index dbe50bd..1eb2c4b 100644 --- a/TEMUKJD/KJDForms/ShopForms/ShopListForm.cs +++ b/TEMUKJD/KJDForms/ShopForms/ShopListForm.cs @@ -224,6 +224,7 @@ namespace TemuKJD.KJDForms.ShopForms + "&login_status2=" + shop.LoginStatus2 + "&cookie=" + shop.Cookies.Replace("&", "&").Replace("%", "%").Replace("+", "+") + "&cookie2=" + shop.Cookies2.Replace("&", "&").Replace("%", "%").Replace("+", "+") + + "&pddid=" + shop.pddid + fTool; var result = GetHtml.PostUtf8(url, data); if (!result.Contains("\"code\":200")) diff --git a/TEMUKJD/PDDForms/AdminForms/PDDAdminShopLoginForm.cs b/TEMUKJD/PDDForms/AdminForms/PDDAdminShopLoginForm.cs index a745cb7..d46b513 100644 --- a/TEMUKJD/PDDForms/AdminForms/PDDAdminShopLoginForm.cs +++ b/TEMUKJD/PDDForms/AdminForms/PDDAdminShopLoginForm.cs @@ -193,6 +193,7 @@ namespace TemuKJD.PDDForms.AdminForms } } shop.Cookies = cookies; + shop.pddid = ""; // 网页登录无拼多多id(pddid) if (isSuccess) { shop.LoginStatus = "登录成功"; @@ -302,6 +303,7 @@ namespace TemuKJD.PDDForms.AdminForms cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(shopMainUrl, true); CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal(); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; + resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; cefWebBrowser.RequestHandler = new CustomRequestHandler(resourceRequestHandler); //var lifeSpanHandler = new LifeSpanHandlerLocal(PopWindowType.SelfWindow); var lifeSpanHandler = new LifeSpanHandlerLocal(PopWindowType.NewTitleWindow); @@ -355,6 +357,9 @@ namespace TemuKJD.PDDForms.AdminForms Thread.Sleep(20); CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null)); + if (cookieLst.Any(c => c.Name == "PddBrowser") && cookieLst.Any(c => c.Value.StartsWith("windows")) && !string.IsNullOrEmpty(shop.pddid)) + cefWebBrowser.ExecuteScriptAsync("navigator.__defineGetter__('userAgent', function() { return 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12'; });"); + //cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager //if (this.openType != EnumOpenType.login) { @@ -367,13 +372,13 @@ namespace TemuKJD.PDDForms.AdminForms } } - if (this.openType != EnumOpenType.login) - { - var cookie2 = shop.Cookies2; - //var t2 = CEFBrowser.SetCookieAsync(shopCookieHead2, cookie2, cefWebBrowser.RequestContext.GetCookieManager(null)); - var t2 = CEFBrowser.SetCookieAsync(shopCookieHead2, cookie2, cefWebBrowser.GetCookieManager(null)); // cef138 - t2.Wait(5000); - } + //if (this.openType != EnumOpenType.login) + //{ + // var cookie2 = shop.Cookies2; + // //var t2 = CEFBrowser.SetCookieAsync(shopCookieHead2, cookie2, cefWebBrowser.RequestContext.GetCookieManager(null)); + // var t2 = CEFBrowser.SetCookieAsync(shopCookieHead2, cookie2, cefWebBrowser.GetCookieManager(null)); // cef138 + // t2.Wait(5000); + //} //根据登录的具体店铺设置local storage if (!string.IsNullOrEmpty(shop.ShopId)) @@ -492,6 +497,29 @@ namespace TemuKJD.PDDForms.AdminForms cefWebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync(sb.ToString()); } + //public Func BeforeResourceLoadEvent; // sender, requestUrl, postData, request, true(表示取消执行) + private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request) + { + if (shop.Cookies.Contains("windows") && shop.Cookies.Contains("PddBrowser") && !string.IsNullOrEmpty(shop.pddid)) + { + var ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + request.SetHeaderByName("User-Agent", ua, true); + request.SetHeaderByName("pddid", shop.pddid, true); + request.SetHeaderByName("Accept-Encoding", "gzip, deflate, br", true); + var headers = request.Headers; + headers.Remove("sec-ch-ua"); + headers.Remove("sec-ch-ua-mobile"); + headers.Remove("sec-ch-ua-platform"); + headers.Remove("Accept-Language"); + headers.Remove("Origin"); + //headers["User-Agent"] = ua; + //headers["Accept-Encoding"] = "gzip, deflate, br"; + request.Headers = headers; + } + + return false; + } + int GetAntiContentsTimes = 40; private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.Designer.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.Designer.cs index c529034..4dbba6f 100644 --- a/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.Designer.cs +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.Designer.cs @@ -620,7 +620,7 @@ // colUpdateCookies // this.colUpdateCookies.FillWeight = 67F; - this.colUpdateCookies.HeaderText = "导入Cookie"; + this.colUpdateCookies.HeaderText = "获取Cookie"; this.colUpdateCookies.Name = "colUpdateCookies"; this.colUpdateCookies.ReadOnly = true; this.colUpdateCookies.Resizable = System.Windows.Forms.DataGridViewTriState.True; diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.cs index 31505e3..cd65f67 100644 --- a/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.cs +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopListForm.cs @@ -21,6 +21,7 @@ using Work; using NaiBa.Util; using System.Globalization; using TemuKJD.BLL; +using System.Diagnostics; //using TemuKJD.PDDForms.AdminForms; namespace TemuKJD.PDDForms.ShopForms @@ -203,6 +204,7 @@ namespace TemuKJD.PDDForms.ShopForms + "&login_status2=" + shop.LoginStatus2 + "&cookie=" + shop.Cookies.Replace("&", "&").Replace("%", "%").Replace("+", "+") + "&cookie2=" + shop.Cookies2.Replace("&", "&").Replace("%", "%").Replace("+", "+") + + "&pddid=" + shop.pddid + fTool; var result = GetHtml.PostUtf8(url, data); if (!result.Contains("\"code\":200")) @@ -488,7 +490,7 @@ namespace TemuKJD.PDDForms.ShopForms "多重登录", param.ApiAuthStatus, param.BuyApiAuth.ApiAuthStatus, - "导入Cookie", + "获取Cookie", "复制Cookie", "编辑", "删除"); @@ -614,7 +616,8 @@ namespace TemuKJD.PDDForms.ShopForms string refere = "https://mms.pinduoduo.com/login/"; refere = "https://mms.pinduoduo.com/home"; string body = @"{}"; - return HttpResponseBLL.PDDPostResponse(shop, url, body, refere); + var result = HttpResponseBLL.PDDPostResponse(shop, url, body, refere); + return result; } public static string CheckShopLogin(ShopLoginInfo shop, string refere = "https://mms.pinduoduo.com/home/") @@ -698,6 +701,44 @@ namespace TemuKJD.PDDForms.ShopForms shop.ShopSubAccountList.Add(subAccount); } } + + GetWorkBenchCookie(); + } + + void GetWorkBenchCookie() + { + return; + //FiddlerCore.Utilities.SmartAssembly.Attributes. + + Task.Run(() => + { + while (true) + { + var process = Process.GetProcessesByName("notepad").FirstOrDefault();// 获取Notepad进程的实例 + if (process != null) + { + IntPtr handle = process.Handle; + MemoryReader.ReadMemory(handle.ToInt32(), 0X1474DEC8, 0X50000000); + + break; + + } + //var memory = new Memory(process); // 创建Memory对象来操作进程内存 + //IntPtr address = new IntPtr(0x12345678); // 假设的内存地址(需要根据实际情况调整) + //byte[] buffer = new byte[1024]; // 读取数据的缓冲区大小根据需要调整 + //if (memory.Read(address, buffer)) // 读取内存到buffer中 + //{ + // Console.WriteLine("Read successful."); + // Console.WriteLine(Encoding.ASCII.GetString(buffer)); // 打印读取的数据(这里假设是ASCII文本) + //} + //else + //{ + // Console.WriteLine("Read failed."); + //} + + Thread.Sleep(5000); + } + }); } private void dgvShop_CellContentClick(object sender, DataGridViewCellEventArgs e) @@ -775,10 +816,15 @@ namespace TemuKJD.PDDForms.ShopForms Clipboard.SetDataObject(cookJs); BaseMsgForm.ShowInfo("复制成功"); break; + case "获取Cookie": case "导入Cookie": - PDDShopUpdateCookieForm updateCookieForm = new PDDShopUpdateCookieForm(shop); - updateCookieForm.SaveComplete += UpdateCookieForm_SaveComplete; - updateCookieForm.ShowDialog(); + //PDDShopUpdateCookieForm updateCookieForm = new PDDShopUpdateCookieForm(shop); + //updateCookieForm.SaveComplete += UpdateCookieForm_SaveComplete; + //updateCookieForm.ShowDialog(); + PDDShopUpdateFddlCookieForm updateFddlCookieForm = new PDDShopUpdateFddlCookieForm(shop); + updateFddlCookieForm.SaveComplete += UpdateCookieForm_SaveComplete; + updateFddlCookieForm.ShowDialog(); + updateFddlCookieForm.fddlHelper.UninstallFiddler(); break; case "删除": if (BaseMsgForm.ShowConfirm("确定删除店铺吗?删除后不可恢复!").DialogResult == DialogResult.Cancel) diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.Designer.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.Designer.cs index e1f4578..b26d264 100644 --- a/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.Designer.cs +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.Designer.cs @@ -112,7 +112,7 @@ this.splitContainer1.Panel2.Controls.Add(this.btnReload); this.splitContainer1.Panel2.Controls.Add(this.chkCloseAfterLogin); this.splitContainer1.Size = new System.Drawing.Size(1438, 736); - this.splitContainer1.SplitterDistance = 671; + this.splitContainer1.SplitterDistance = 672; this.splitContainer1.SplitterWidth = 3; this.splitContainer1.TabIndex = 4; // diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.cs index 398d6d6..6dc65bc 100644 --- a/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.cs +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopLoginForm.cs @@ -123,6 +123,7 @@ namespace TemuKJD.PDDForms.ShopForms if (!cefWebBrowser.GetBrowser().MainFrame.IsValid) continue; + // 刷新cookie if (openType == EnumOpenType.refresh_cookie) { string cookies = ""; @@ -144,6 +145,12 @@ namespace TemuKJD.PDDForms.ShopForms cookies += cookie.Name + "=" + cookie.Value + "; "; cookieListNew.Add(cookie); } + + if (cookieListNew.Any(c => c.Name == "PASS_ID" && c.Value.StartsWith("windows")) && + !cookieListNew.Any(c => c.Name == "PddBrowser")) + { + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "PddBrowser", Value = "1", Expires = DateTime.Now.AddYears(1), }); + } cookies = JsonHelper.SerializeObject(cookieListNew); if (!string.IsNullOrEmpty(cookies)) @@ -250,6 +257,7 @@ namespace TemuKJD.PDDForms.ShopForms s.LoginStatus = "登录成功"; s.Cookies = cookies; s.LastRefreshDate = DateTime.Now.ToString("yyyyMMdd"); + s.pddid = ""; // 网页登录无拼多多id(pddid) } StartUp.SaveLocalShopLoginInfo(); // 店铺保存到本地 PDDShopListForm.UpdateServerShopCookies(shop); // 店铺cookie写入服务端,多店共用一个登录账号一组cookie @@ -348,6 +356,7 @@ namespace TemuKJD.PDDForms.ShopForms cefWebBrowser = CEFBrowser.CreateChromiumWebBrowser(shopMainUrl, true); CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal(); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; + resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; cefWebBrowser.RequestHandler = new CustomRequestHandler(resourceRequestHandler); var lifeSapnHandler = new LifeSpanHandlerLocal(PopWindowType.SelfWindow); cefWebBrowser.LifeSpanHandler = lifeSapnHandler; @@ -399,11 +408,14 @@ namespace TemuKJD.PDDForms.ShopForms Thread.Sleep(20); CEFBrowser.DeleteCookie(cefWebBrowser.GetCookieManager(null)); + if (cookieLst.Any(c=>c.Name == "PddBrowser") && cookieLst.Any(c => c.Value.StartsWith ("windows")) && !string.IsNullOrEmpty(shop.pddid)) + cefWebBrowser.ExecuteScriptAsync("navigator.__defineGetter__('userAgent', function() { return 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12'; });"); + //cef 138 如果没有设置RequestContext 可能为空,直接getCookieManager //if (this.openType != EnumOpenType.login) { //var t = CEFBrowser.SetCookieAsync(JsonHelper.SerializeObject(cookieLst), cefWebBrowser.GetCookieManager(null)); - foreach(var cook in cookieLst) + foreach (var cook in cookieLst) { var t = CEFBrowser.SetCookieAsync(cook.Domain, cook.Name + "=" + cook.Value + ";", cefWebBrowser.GetCookieManager(null)); t.Wait(5000); @@ -537,6 +549,29 @@ namespace TemuKJD.PDDForms.ShopForms } } + //public Func BeforeResourceLoadEvent; // sender, requestUrl, postData, request, true(表示取消执行) + private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request) + { + if (shop.Cookies.Contains("windows") && shop.Cookies.Contains("PddBrowser") && !string.IsNullOrEmpty(shop.pddid)) + { + var ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.5.40.8 Safari/537.36 PddWorkbench-Online PddBrowser pdd_windows_version/3.0.3.12"; + request.SetHeaderByName("User-Agent", ua, true); + request.SetHeaderByName("pddid", shop.pddid, true); + request.SetHeaderByName("Accept-Encoding", "gzip, deflate, br", true); + var headers = request.Headers; + headers.Remove("sec-ch-ua"); + headers.Remove("sec-ch-ua-mobile"); + headers.Remove("sec-ch-ua-platform"); + headers.Remove("Accept-Language"); + headers.Remove("Origin"); + //headers["User-Agent"] = ua; + //headers["Accept-Encoding"] = "gzip, deflate, br"; + request.Headers = headers; + } + + return false; + } + static int GetAntiContentsTimes = 40; private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateCookieForm.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateCookieForm.cs index 3cb390e..1cd0f44 100644 --- a/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateCookieForm.cs +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateCookieForm.cs @@ -26,14 +26,14 @@ namespace TemuKJD.PDDForms.ShopForms } public partial class PDDShopUpdateCookieForm : LRBaseForm { - ShopLoginInfo shopLoginInfo = null; + ShopLoginInfo shop = null; SetCookieFromEnum updateFrom; string cookieVersion = ""; - public PDDShopUpdateCookieForm(ShopLoginInfo shop = null, SetCookieFromEnum from = SetCookieFromEnum.normal_user, string _cookieVersion="国内版") + public PDDShopUpdateCookieForm(ShopLoginInfo _shop = null, SetCookieFromEnum from = SetCookieFromEnum.normal_user, string _cookieVersion="国内版") { InitializeComponent(); - shopLoginInfo = shop; + shop = _shop; updateFrom = from; cookieVersion = _cookieVersion; this.TitleText = "更新Cookie"; @@ -45,8 +45,8 @@ namespace TemuKJD.PDDForms.ShopForms private void ShopUpdateCookieForm_Load(object sender, EventArgs e) { - if (shopLoginInfo != null) - txtLoginName.Text = shopLoginInfo.LoginName + " " + shopLoginInfo.ShopAccount + " " + shopLoginInfo.Notes; + if (shop != null) + txtLoginName.Text = shop.LoginName + " " + shop.ShopAccount + " " + shop.Notes; } /* @@ -78,7 +78,7 @@ namespace TemuKJD.PDDForms.ShopForms private void btnOk_Click(object sender, EventArgs e) { - if (shopLoginInfo == null) + if (shop == null) { BaseMsgForm.ShowError("店铺为空!"); return; @@ -87,7 +87,7 @@ namespace TemuKJD.PDDForms.ShopForms cookieVersion = this.radioButton1.Checked ? "国内版" : "国际版"; bool ok1 = false; bool ok2 = false; - if ((this.txtCookieJs1.Text.Contains("PASS_ID") && this.txtCookieJs1.Text.Contains("api_uid")) || !string.IsNullOrWhiteSpace(txtSubPassId.Text)) + if ((this.txtCookieJs1.Text.Contains("PASS_ID") /*&& this.txtCookieJs1.Text.Contains("api_uid")*/) || !string.IsNullOrWhiteSpace(txtSubPassId.Text)) { ok1 = GetCookie1(); } @@ -98,9 +98,13 @@ namespace TemuKJD.PDDForms.ShopForms if (ok1 || ok2) { - this.OnSaveComplete(shopLoginInfo); + this.OnSaveComplete(shop); this.Close(); } + else + { + BaseMsgForm.ShowError("缺少关键cookie字段,请确认是店铺登录的cookie!"); + } } bool GetCookie1() @@ -147,6 +151,7 @@ namespace TemuKJD.PDDForms.ShopForms "webp=" + webp + ";" + "x-visit-time=" + x_visit_time + ";"; + //PASS_ID=windows_1-txt3KQyFr2JBdl/PeNNwLLsMj2geDn/BnlN1xEg/hdkC8Kx5WrYvqwTCWi9i50ZfXH0jbMX80leYsfebgQ4kLQ_492379693_91339707; PddBrowser=1; api_uid=Ck3IU2jeM5VoLABZFGCTAg==; rckk=F0JWp023Drn2QqjzLaKOJ0omuqKhTPlC; _bee=F0JWp023Drn2QqjzLaKOJ0omuqKhTPlC; ru1k=f3d9839e-c5ed-430f-8a85-41e6827c526e; _f77=f3d9839e-c5ed-430f-8a85-41e6827c526e; ru2k=20807545-2762-4365-8aa8-b8de45bd76f0; _a42=20807545-2762-4365-8aa8-b8de45bd76f0 List cookieList = new List(); if (!string.IsNullOrEmpty(_a42)) cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "_a42", Value = _a42, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); @@ -174,6 +179,8 @@ namespace TemuKJD.PDDForms.ShopForms cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "webp", Value = webp, Expires = DateTime.Now.AddDays(14), Path= "/home" }); if (!string.IsNullOrEmpty(x_visit_time)) cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "x-visit-time", Value = x_visit_time, Expires = DateTime.Now.AddDays(100), }); + if (PASS_ID.StartsWith("windows") && !cookieList.Any(c => c.Name == "PddBrowser")) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "PddBrowser", Value = "1", Expires = DateTime.Now.AddYears(1), }); cookie = JsonHelper.SerializeObject(cookieList); var cookieShop = new ShopLoginInfo(); @@ -197,14 +204,14 @@ namespace TemuKJD.PDDForms.ShopForms return false; } - if (!shopLoginInfo.LoginName.EndsWith(maskMobile) && shopLoginInfo.LoginName != username && shopLoginInfo.LoginName != mallName) + if (!shop.LoginName.EndsWith(maskMobile) && shop.LoginName != username && shop.LoginName != mallName) { BaseMsgForm.ShowError("cookie与店铺不匹配,请核对店铺!"); return false; } List serverShopLst = new List(); - var rst = ShopBLL.AdminGetServerShopLstForSetCookie(shopLoginInfo, serverShopLst); + var rst = ShopBLL.AdminGetServerShopLstForSetCookie(shop, serverShopLst); if (rst != "success") { @@ -217,29 +224,29 @@ namespace TemuKJD.PDDForms.ShopForms if (updateFrom == SetCookieFromEnum.normal_user) // 普通用户更新本地店铺 { - var localShop = GlobalConfig.ShopLoginList.Where(v => v.LoginName == shopLoginInfo.LoginName).ToList(); + var localShop = GlobalConfig.ShopLoginList.Where(v => v.LoginName == shop.LoginName).ToList(); foreach (var sc in localShop) { sc.Cookies = cookie; sc.LoginStatus = "登录成功"; } } - shopLoginInfo.Cookies = cookie; - shopLoginInfo.ShopId = username; - shopLoginInfo.ShopAccount = mallName; - shopLoginInfo.LoginStatus = "登录成功"; + shop.Cookies = cookie; + shop.ShopId = username; + shop.ShopAccount = mallName; + shop.LoginStatus = "登录成功"; // 店铺更新写入到服务端 var url = BaseClass.BuildObjString("shop/mdy_shop"); var data1 = UserLogin.GetSignaturex() - + "&login_name=" + shopLoginInfo.LoginName - + "&new_shop_id=" + shopLoginInfo.ShopId - + "&shop_account=" + shopLoginInfo.ShopAccount; + + "&login_name=" + shop.LoginName + + "&new_shop_id=" + shop.ShopId + + "&shop_account=" + shop.ShopAccount; var result = GetHtml.PostUtf8(url, data1); - PDDShopListForm.UpdateServerShopCookies(shopLoginInfo); // 店铺cookie写入服务端,不同账号下的同名店铺一起更新cookie + PDDShopListForm.UpdateServerShopCookies(shop); // 店铺cookie写入服务端,不同账号下的同名店铺一起更新cookie - PDDShopLoginForm loginForm = new PDDShopLoginForm(shopLoginInfo); + PDDShopLoginForm loginForm = new PDDShopLoginForm(shop); loginForm.openType = EnumOpenType.refresh_cookie; loginForm.ShowDialog(); @@ -290,14 +297,14 @@ namespace TemuKJD.PDDForms.ShopForms //var maskMobile = BaseRegex.GetStringJson(ref data, "maskOwnerMobile"); //if (!shopLoginInfo.LoginName.EndsWith(maskMobile)) - if (!data.Contains(shopLoginInfo.ShopAccount)) + if (!data.Contains(shop.ShopAccount)) { BaseMsgForm.ShowError("cookie与国际版店铺不匹配,请核对店铺!"); return false; } List serverShopLst = new List(); - var rst = ShopBLL.AdminGetServerShopLstForSetCookie(shopLoginInfo, serverShopLst); + var rst = ShopBLL.AdminGetServerShopLstForSetCookie(shop, serverShopLst); if (rst != "success") { @@ -310,16 +317,16 @@ namespace TemuKJD.PDDForms.ShopForms if (updateFrom == SetCookieFromEnum.normal_user) // 普通用户更新本地店铺 { - var localShop = GlobalConfig.ShopLoginList.Where(v => v.LoginName == shopLoginInfo.LoginName).ToList(); + var localShop = GlobalConfig.ShopLoginList.Where(v => v.LoginName == shop.LoginName).ToList(); foreach (var sc in localShop) { sc.Cookies2 = cookie2; sc.LoginStatus2 = "国际版在线"; } } - shopLoginInfo.Cookies2 = cookie2; - shopLoginInfo.LoginStatus2 = "国际版在线"; - PDDShopListForm.UpdateServerShopCookies(shopLoginInfo); // 店铺cookie写入服务端,多店共用一个登录账号一组cookie + shop.Cookies2 = cookie2; + shop.LoginStatus2 = "国际版在线"; + PDDShopListForm.UpdateServerShopCookies(shop); // 店铺cookie写入服务端,多店共用一个登录账号一组cookie return true; } @@ -329,7 +336,7 @@ namespace TemuKJD.PDDForms.ShopForms /// void GetShopFirstLogin(string loginData, List lstServerShop) { - if (this.shopLoginInfo == null) + if (this.shop == null) return; if (lstServerShop == null) lstServerShop = new List(); @@ -347,7 +354,7 @@ namespace TemuKJD.PDDForms.ShopForms { AccountId = BaseRegex.GetStringJson(ref prod, "mallId"), AccountName = BaseRegex.GetStringJson(ref prod, "mallName"), - LoginName = shopLoginInfo.LoginName, + LoginName = shop.LoginName, UserName = BaseClass.UserName, LoginStatus = "登录成功", }; @@ -359,14 +366,14 @@ namespace TemuKJD.PDDForms.ShopForms { ShopLoginInfo newShop = new ShopLoginInfo() { - UserName = shopLoginInfo.UserName, - LoginName = shopLoginInfo.LoginName, - Password = shopLoginInfo.Password, - GroupName = shopLoginInfo.GroupName, + UserName = shop.UserName, + LoginName = shop.LoginName, + Password = shop.Password, + GroupName = shop.GroupName, ShopAccount = sc.AccountName, ShopId = sc.AccountId, - SubUserName = shopLoginInfo.SubUserName, - Notes = shopLoginInfo.Notes, + SubUserName = shop.SubUserName, + Notes = shop.Notes, }; var oldServerShop = lstServerShop.FirstOrDefault(s => diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.Designer.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.Designer.cs new file mode 100644 index 0000000..cd5cba4 --- /dev/null +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.Designer.cs @@ -0,0 +1,110 @@ + +namespace TemuKJD.PDDForms.ShopForms +{ + partial class PDDShopUpdateFddlCookieForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PDDShopUpdateFddlCookieForm)); + this.panel2 = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // panel2 + // + this.panel2.BackColor = System.Drawing.Color.White; + this.panel2.Controls.Add(this.label3); + this.panel2.Controls.Add(this.label2); + this.panel2.Controls.Add(this.label1); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(1, 33); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(543, 289); + this.panel2.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("微软雅黑", 12F); + this.label2.Location = new System.Drawing.Point(62, 87); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(202, 21); + this.label2.TabIndex = 1; + this.label2.Text = "请使用小蜜蜂打开店铺后台"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("微软雅黑", 12F); + this.label1.Location = new System.Drawing.Point(62, 133); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(175, 21); + this.label1.TabIndex = 0; + this.label1.Text = "Cookie获取中,请稍候"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Font = new System.Drawing.Font("微软雅黑", 12F); + this.label3.ForeColor = System.Drawing.Color.Red; + this.label3.Location = new System.Drawing.Point(62, 180); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(74, 21); + this.label3.TabIndex = 2; + this.label3.Text = "错误提示"; + // + // PDDShopUpdateFddlCookieForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(545, 323); + this.Controls.Add(this.panel2); + this.Font = new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "PDDShopUpdateFddlCookieForm"; + this.Text = "更新Cookie"; + this.TitleText = "更新Cookie"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.PDDShopUpdateFddlCookieForm_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.PDDShopUpdateFddlCookieForm_FormClosed); + this.Load += new System.EventHandler(this.PDDShopUpdateFddlCookieForm_Load); + this.Controls.SetChildIndex(this.panel2, 0); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Panel panel2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + } +} \ No newline at end of file diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.cs b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.cs new file mode 100644 index 0000000..e94b318 --- /dev/null +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.cs @@ -0,0 +1,331 @@ +using AllBase; +using AllBase.Helper; +using AllBase.Model.Result; +using CefSharp; +using Fiddler; +using NaiBa.Util.Extension; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using TemuKJD.BaseForms; +using TemuKJD.BLL; +using TemuKJD.Helper; +using Work; + +namespace TemuKJD.PDDForms.ShopForms +{ + public partial class PDDShopUpdateFddlCookieForm : LRBaseForm + { + ShopLoginInfo shop = null; + SetCookieFromEnum updateFrom; + public FddlHelper fddlHelper = new FddlHelper(); + + public PDDShopUpdateFddlCookieForm(ShopLoginInfo _shop, SetCookieFromEnum from = SetCookieFromEnum.normal_user) + { + InitializeComponent(); + shop = _shop; + updateFrom = from; + } + + private void PDDShopUpdateFddlCookieForm_Load(object sender, EventArgs e) + { + Task.Run(() => + { + int i = 0; + while (true) + { + i++; + string txt = "Cookie获取中,请稍候"; + for (int j = 0; j < i % 3 + 1; j++) + { + txt += "."; + } + + if (!Created || Disposing || IsDisposed) + break; + Invoke(new Action(() => + { + this.label1.Text = txt; + })); + Thread.Sleep(500); + } + }); + + fddlHelper.InstallCertificate(); + // 监听 + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + fddlHelper.StartupFiddlerCore(); // 启动fiddler + + label3.Text = ""; + + } + + private void FiddlerApplication_BeforeRequest(Session oSession) + { + // https://mms.pinduoduo.com/newjersy/api/mms/popup //https://mms.pinduoduo.com/janus/api/heartbeat/v2 + // https://mms.pinduoduo.com/janus/api/subSystem/getAuthToken // https://mms.pinduoduo.com/janus/api/new/userinfo + // https://mms.pinduoduo.com/home/ // https://mms.pinduoduo.com/janus/api/checkLogin + if (oSession.fullUrl.StartsWith("https://mms.pinduoduo.com")) + { + var header = oSession.RequestHeaders; + if (!header.Any(h => h.Name == "Cookie")) + return; + + var headerCookie = header["Cookie"]; + if (headerCookie.Contains("JSESSIONID") && headerCookie.Contains("_nano_fp") && headerCookie.Contains("api_uid") && + headerCookie.Contains("_f77") && headerCookie.Contains("mms_b84d1838") && headerCookie.Contains("_a42") && + headerCookie.Contains("rckk") && headerCookie.Contains("ru1k") && headerCookie.Contains("ru2k") && + headerCookie.Contains("x-visit-time") && headerCookie.Contains("PASS_ID")) + { + } + else + { + return; + } + + shop.pddid = ""; + if (header.Any(h => h.Name == "pddid")) + { + shop.pddid = header["pddid"]; + } + else + { + return; + } + + FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest; + + string JSESSIONID = BaseRegex.GetStringCookie(ref headerCookie, "JSESSIONID").ParseToString().Trim('\'', '\n', '\r'); + string _nano_fp = BaseRegex.GetStringCookie(ref headerCookie, "_nano_fp").ParseToString().Trim('\'', '\n', '\r'); + string api_uid = BaseRegex.GetStringCookie(ref headerCookie, "api_uid").ParseToString().Trim('\'', '\n', '\r'); + string _bee = BaseRegex.GetStringCookie(ref headerCookie, "_bee").ParseToString().Trim('\'', '\n', '\r'); + string _f77 = BaseRegex.GetStringCookie(ref headerCookie, "_f77").ParseToString().Trim('\'', '\n', '\r'); + string mms_b84d1838 = BaseRegex.GetStringCookie(ref headerCookie, "mms_b84d1838").ParseToString().Trim('\'', '\n', '\r'); + string _a42 = BaseRegex.GetStringCookie(ref headerCookie, "_a42").ParseToString().Trim('\'', '\n', '\r'); + string rckk = BaseRegex.GetStringCookie(ref headerCookie, "rckk").ParseToString().Trim('\'', '\n', '\r'); + string ru1k = BaseRegex.GetStringCookie(ref headerCookie, "ru1k").ParseToString().Trim('\'', '\n', '\r'); + string ru2k = BaseRegex.GetStringCookie(ref headerCookie, "ru2k").ParseToString().Trim('\'', '\n', '\r'); + string webp = BaseRegex.GetStringCookie(ref headerCookie, "webp").ParseToString().Trim('\'', '\n', '\r'); + string x_visit_time = BaseRegex.GetStringCookie(ref headerCookie, "x-visit-time").ParseToString().Trim('\'', '\n', '\r'); + string PASS_ID = BaseRegex.GetStringCookie(ref headerCookie, "PASS_ID").ParseToString().Trim('\'', '\n', '\r'); + + + string cookie = "_a42=" + _a42 + ";" + + "_bee=" + _bee + ";" + + "_f77=" + _f77 + ";" + + "_nano_fp=" + _nano_fp + ";" + + "api_uid=" + api_uid + ";" + + "JSESSIONID=" + JSESSIONID + ";" + + "mms_b84d1838=" + mms_b84d1838 + ";" + + "PASS_ID=" + PASS_ID + ";" + + "rckk=" + rckk + ";" + + "ru1k=" + ru1k + ";" + + "ru2k=" + ru2k + ";" + + "webp=" + webp + ";" + + "x-visit-time=" + x_visit_time + ";"; + + //PASS_ID=windows_1-txt3KQyFr2JBdl/PeNNwLLsMj2geDn/BnlN1xEg/hdkC8Kx5WrYvqwTCWi9i50ZfXH0jbMX80leYsfebgQ4kLQ_492379693_91339707; PddBrowser=1; api_uid=Ck3IU2jeM5VoLABZFGCTAg==; rckk=F0JWp023Drn2QqjzLaKOJ0omuqKhTPlC; _bee=F0JWp023Drn2QqjzLaKOJ0omuqKhTPlC; ru1k=f3d9839e-c5ed-430f-8a85-41e6827c526e; _f77=f3d9839e-c5ed-430f-8a85-41e6827c526e; ru2k=20807545-2762-4365-8aa8-b8de45bd76f0; _a42=20807545-2762-4365-8aa8-b8de45bd76f0 + List cookieList = new List(); + if (!string.IsNullOrEmpty(_a42)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "_a42", Value = _a42, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(_bee)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "_bee", Value = _bee, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(_f77)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "_f77", Value = _f77, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(_nano_fp)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "_nano_fp", Value = _nano_fp, Expires = DateTime.Now.AddDays(400), }); + if (!string.IsNullOrEmpty(api_uid)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "api_uid", Value = api_uid, Expires = DateTime.Now.AddDays(400), }); + if (!string.IsNullOrEmpty(JSESSIONID)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "JSESSIONID", Value = JSESSIONID, HttpOnly = true, }); + if (!string.IsNullOrEmpty(mms_b84d1838)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "mms_b84d1838", Value = mms_b84d1838, Expires = DateTime.Now.AddDays(100), }); + if (!string.IsNullOrEmpty(PASS_ID)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "PASS_ID", Value = PASS_ID, Expires = DateTime.Now.AddDays(30), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(rckk)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "rckk", Value = rckk, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(ru1k)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "ru1k", Value = ru1k, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(ru2k)) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "ru2k", Value = ru2k, Expires = DateTime.Now.AddYears(1), HttpOnly = true, Secure = true, }); + if (!string.IsNullOrEmpty(webp)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "webp", Value = webp, Expires = DateTime.Now.AddDays(14), Path = "/home" }); + if (!string.IsNullOrEmpty(x_visit_time)) + cookieList.Add(new Cookie() { Domain = "mms.pinduoduo.com", Name = "x-visit-time", Value = x_visit_time, Expires = DateTime.Now.AddDays(100), }); + if (PASS_ID.StartsWith("windows") && !cookieList.Any(c => c.Name == "PddBrowser")) + cookieList.Add(new Cookie() { Domain = ".pinduoduo.com", Name = "PddBrowser", Value = "1", Expires = DateTime.Now.AddYears(1), }); + headerCookie = JsonHelper.SerializeObject(cookieList); + + var cookieShop = new ShopLoginInfo(); + cookieShop.pddid = shop.pddid; + cookieShop.Cookies = JsonHelper.SerializeObject(cookieList); + + var data = ""; + data = PDDShopListForm.GetShopStatus(cookieShop); + if (!data.Contains("\"success\":true") || data.Contains("会话已过期")) + { + Invoke(new Action(() => + { + //BaseMsgForm.ShowError("cookie已失效!"); + label3.Text = "cookie已失效!"; + })); + FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest; + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + return; + } + + var username = BaseRegex.GetStringJson(ref data, "username"); + var maskMobile = BaseRegex.GetStringJson(ref data, "mobile"); + var mallName = BaseRegex.GetStringJson(ref data, "mall_name"); + maskMobile = maskMobile.Split('*').Last(); + if (string.IsNullOrWhiteSpace(maskMobile) || string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(mallName)) + { + Invoke(new Action(() => + { + //BaseMsgForm.ShowError("店铺信息获取失败!"); + label3.Text = "店铺信息获取失败!"; + })); + FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest; + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + return; + } + + if (!shop.LoginName.EndsWith(maskMobile) && shop.LoginName != username && shop.LoginName != mallName) + { + Invoke(new Action(() => + { + //BaseMsgForm.ShowError("cookie与店铺不匹配,请核对店铺!"); + label3.Text = "cookie与店铺不匹配,请核对店铺!"; + })); + FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest; + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + return; + } + + List serverShopLst = new List(); + var rst = ShopBLL.AdminGetServerShopLstForSetCookie(shop, serverShopLst); + + if (rst != "success") + { + Invoke(new Action(() => + { + //BaseMsgForm.ShowError(rst); + label3.Text = rst; + })); + FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest; + FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest; + return; + } + + //如果店铺没有cookie登录过,处理店铺第一次登录(分裂cookie下的所有店铺) + GetShopFirstLogin(data, serverShopLst); + + if (updateFrom == SetCookieFromEnum.normal_user) // 普通用户更新本地店铺 + { + var localShop = GlobalConfig.ShopLoginList.Where(v => v.LoginName == shop.LoginName).ToList(); + foreach (var sc in localShop) + { + sc.Cookies = headerCookie; + sc.LoginStatus = "登录成功"; + } + } + shop.Cookies = headerCookie; + shop.ShopId = username; + shop.ShopAccount = mallName; + shop.LoginStatus = "登录成功"; + + // 店铺更新写入到服务端 + var url = BaseClass.BuildObjString("shop/mdy_shop"); + var data1 = UserLogin.GetSignaturex() + + "&login_name=" + shop.LoginName + + "&new_shop_id=" + shop.ShopId + + "&shop_account=" + shop.ShopAccount; + var result = GetHtml.PostUtf8(url, data1); + + PDDShopListForm.UpdateServerShopCookies(shop); // 店铺cookie写入服务端,不同账号下的同名店铺一起更新cookie + + Invoke(new Action(() => + { + this.OnSaveComplete(shop); + this.Close(); + })); + } + } + + private void PDDShopUpdateFddlCookieForm_FormClosed(object sender, FormClosedEventArgs e) + { + } + + private void PDDShopUpdateFddlCookieForm_FormClosing(object sender, FormClosingEventArgs e) + { + //UninstallCertificate(); // 移除 CertMaker.dll, BCMakeCert.dll 文件后,无需每次删除证书 + fddlHelper.UninstallFiddler(); + } + + /// + /// 如果店铺没有cookie登录过,处理店铺第一次登录(分裂cookie下的所有店铺) + /// + /// + void GetShopFirstLogin(string loginData, List lstServerShop) + { + if (this.shop == null) + return; + if (lstServerShop == null) + lstServerShop = new List(); + + List lstShopCompany = new List(); + var jObj = JObject.Parse(loginData); + var jArr = jObj["result"]?["companyList"]?[0]?["malInfoList"] as JArray; + if (jArr == null) + jArr = new JArray(); + + foreach (var productObj in jArr) + { + var prod = JsonHelper.SerializeObject(productObj); + ShopCompany sc = new ShopCompany() + { + AccountId = BaseRegex.GetStringJson(ref prod, "mallId"), + AccountName = BaseRegex.GetStringJson(ref prod, "mallName"), + LoginName = shop.LoginName, + UserName = BaseClass.UserName, + LoginStatus = "登录成功", + }; + lstShopCompany.Add(sc); + } + + var lstShopCompanyCopy = lstShopCompany.ToList(); + foreach (ShopCompany sc in lstShopCompanyCopy) + { + ShopLoginInfo newShop = new ShopLoginInfo() + { + UserName = shop.UserName, + LoginName = shop.LoginName, + Password = shop.Password, + GroupName = shop.GroupName, + ShopAccount = sc.AccountName, + ShopId = sc.AccountId, + SubUserName = shop.SubUserName, + Notes = shop.Notes, + }; + + var oldServerShop = lstServerShop.FirstOrDefault(s => + s.LoginName == newShop.LoginName && s.ShopId == newShop.ShopId); + if (oldServerShop == null) + { + if (updateFrom != SetCookieFromEnum.normal_user) + ShopBLL.AdminAddServerShop(newShop); // 店铺写入到服务端 + else + ShopBLL.AddServerShop(newShop); // 店铺写入到服务端 + } + } + } + } +} diff --git a/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.resx b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.resx new file mode 100644 index 0000000..2bdeb30 --- /dev/null +++ b/TEMUKJD/PDDForms/ShopForms/PDDShopUpdateFddlCookieForm.resx @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAEAgIAQAAAAAABoKAAAFgAAACgAAACAAAAAAAEAAAEABAAAAAAAACgAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP// + AAD///8AAAAAAAAAAAAAAAAzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMQ + AAAAAAAAAAAAAAAAAAAAAAAAABM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZkzEAAAAAAAAAAAAAAAAAAAAAADOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZMwAAAAAAAAAAAAAAAAAAABOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZkzAAAAAAAAAAAAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmTEAAAAAAAAAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAAAAAAAA5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAAAAAADmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAAAA5mZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAADmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAGZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAJmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZAAAAAA + OZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmT + AAAAAZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmRAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZkwAAAZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZkwAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZMAAJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZEAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTADmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkwCZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkRmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZOZmZOZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmP+JmZmZmZmZj/////// + ///4OZmZj/eZmZmZmZmZmPg5OZmZmZuI//iIuZmZmZmZmZmZmZM5mZmZmZmZmZmZmb//+JmZmZmZmP// + //////////OZmP//uZmZmZmZmY//+ZmZOZf///////h5k5mZmZmZmZmTOZmZmZmZmZmZmZmP//iZmZmZ + mZ/////////////4mZ///4mZmZmZmZP///uZmZmP////////+JmZmZmZmZmZkzmZmZmZmZmZmZmZj//4 + mZmZmZmf////////////+Jmf//+JmZmZmZmb///4mZmY//////////+JmZmZmZmZmZM5mZmZmZmZmZmZ + mY//+JmZmZmZn/////////////mZmP//iZmZmZmZk///+5mZj/////iP////+JmZmZmZmZmTOZmZmZmZ + mZmZmZmP//iZmZmZmZ////iIiIiIiIiZOZj//4mZmZmZmZP///uZmf////eZmT////+ZmZmZmZmZkzmZ + mZmZmZmZmZmZj//4mZmZmZmf//+JmZmZmZmZk5mY//+JmZmZmZmT///7mZj///+ZmZmZj///uZmZmZmZ + mZM5mZmZmZmZmZmZmY//+JmZmZmZn///iZmZmZmZmZmZmP//iZmZN5k5k///+5mY///zk5mZOT///4mZ + mZmZmZmTOZmZmZmZmZmZmZmP//iZmZmZmZ///4mZmZmZmZmZmZj//4mZmP/5k5P///uZmP//+ZmZmZmY + //+JmZmZmZmZkzmZmZmZmZmZmZmZj//4mZmZmZmf///4iIiIiIg5mZmY//+JOb//+JmT///7mZj//4mZ + mZmZmP//+ZmZmZmZmZM5mZmZmZmZmZmZmY//+JmZmZmZn///////////85mZmP//iZn///+Jk///+5mf + //+JmZmZmZj///mZmZmZmZmTOZmZmZmZmZmZmZmP//iZmZmZmZ////////////+ZmZj//4mY////85v/ + //uZmP//iZmZmZmY///5mZmZmZmZkzmZmZmZmZmZmZmZj//4mZmZmZmf////////////mZmY//+Jv/// + //+Z///7mZj//4mZmZmZmP//+ZmZmZmZmZM5mZmZmZmZmZmZmY//+JmZmZmZn///////////+JmZmP// + if//////if//+5mY//+JmZmZmZj///mZmZmZmZmTOZmZmZmZmZmZmZmP//iZmZmZmZ///////////4mZ + mZj//4j///////j///uZmP//iZmZmZmY///5mZmZmZmZkzmZmZmZmZmZmZmZj//4mZmZmZmf//+JMzMz + MzOZOZmY//////+D///////7mZj//4mZmZmZmP//+ZmZmZmZmZM5mZmZmZmZmZmZmY//+JmZmZmZn/// + iZmZmZmZmZmZmP//////mY//////+5mY//+JmZmZmZj///mZmZmZmZmTOZmZmZmZmZmZmZmP//iZmZmZ + mZ///4mZmZmZmZmZmZj/////+5mf//////uZmP//iZmZmZmY///5mZmZmZmZkzmZmZmZmZmZMzM5j//4 + kzMzmZmf//+JMzMzMzM5mZmY/////4mTk//////7mZj//4mZmZmZmP//+ZmZmZmZmZM5mZmZmZmZmP// + /////////4mZn////////////4mZmP////+ZmZmP////+5mY//+JmZmZmZj///mZmZmZmZmTOZmZmZmZ + mY/////////////4mZ/////////////7mZj////7mZmZn/////uZmP//iZmZmZmY///5mZmZmZmZkzmZ + mZmZmZn//////////////5mf////////////+Jmf////iZmZk5P////4mZ///4mZmZmZmP//+ZmZmZmZ + mZM5mZmZmZmZj/////////////iZn/////////////iZmP///5mZmZmZj///+5mY//+JmZmZmZj//4mZ + mZmZmZmTOZmZmZmZmZ/////////////zmZP///////////+JmZP///uTmZmZmZj//4mZm///mZmZmZmZ + //85mZmZmZmZkzmZmZmZmZOZiIiIiIiIiIiImTmZOIiIiIiIiIiImTmZOIi5mZmZmZOZiIuZmZk4iZOZ + mZmZOZiDmZmZmZmZmZM5mZmZmZmZOZmZmZmZmZmZmZOZmZmZmZmZmZmZmZOZmZmZmZmZmZmZOZmZmZmZ + mZk5mZmZmZOZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmTuIiIiIs5mZmZmZmZ + mTu4i7mZmZmZmZmZmTMzmZOZmZkzOZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmTmbj///////+HmT + mZmZk4j/////iJmZmZk4iP////iZOZmZj/mZOZOIiIiIiIiIiDmZmZmZmZmZkzmZmZmZmZmZj/////// + ///4mZk5k4///4iI///4OZOY////////iZOZmb/5mZmP///////////4mZmZmZmZmZM5mZmZmZmZn/// + //////////mZmY///5mZmZP///iZmP////////+ZOZk/iZmY/////////////4mZmZmZmZmTOZmZmZmZ + mZ/////////////5mZ////+JmZmY////iZl/////////+ZmZP4mZP//////////////7mZmZmZmZkzmZ + mZmZmZmb////////////uZP/j///+HM3j/////+ZmYj///////iZmT+JmY//////////////+JmZmZmZ + mZM5mZmZmZmZmY//////////+JmT+Jv///////////iPmTmZOI/4mP//uTk/iZmP//////////////iZ + mZmZmZmTOZmZmZmZmZmf//////////mZmZmZ///////////5mZmZmZmTOZk///mZP4mZj/////////// + ///4mZmZmZmZkzmZmZmZmZmTmP////////+JOZmZOY//////////iZmZmZmZmZk5mf/4mT+JmY////// + ////////+JmZmZmZmZM5mZmZmZmZmZn/////////mZmZmZk//////////zmZmZmZmZmZmTmP/zm/iZmP + //////////////iZmZmZmZmTOZmZmZmZmZk5v///////85OZmZkzmP////////iZmZmZmZmZmZmZn//4 + /4mZj/////hzN4/////4mZmZmZmZkzmZmZmZmZmZmZj//////4mZmTmY/4j////////4mZmZmZmZmZmZ + mZj///+JmY////+JmZmY////+JmZmZmZmZM5mZmZmZmZmZmZ//////+ZmZmZj////////////4mZmZmZ + mZmZmZmb////+ZmP///4mZu5mY////iZmZmZmZmTOZmZmZmZmZmZOb/////4k5mZmP/////////////7 + mZmZmZmZmZmZk/////OZv///+ZmP+Jmf///4mZmZmZmZkzmZmZmZmZmZmZmf////+ZmZmZj////////4 + eI//+JmZmZmZmZmZmZP////4mb///4mY//+JmP//+5mZmZmZmZM5mZmZmZmZmZk5v/////uTmZmb//// + ///4mZmX//iZmZmZmZmZmZmZ////+Jmf//95n///+Zj///OZmZmZmZmTOZmZmZmZmZmZmf//////mZmZ + mY//////+ZOZmZiJmZmZmZmZmZmZmY////+ZmP//+I////iP//+JmZmZmZmZkzmZmZmZmZmZmZj///// + /4mZmZmf/////5k5mZOZmTmZmZmZmZmZmZmP///4mZP/////////////OZmZmZmZmZM5mZmZmZmZmZk/ + ///////zmZmZm/////iZmZmZmZmZmZmZmZmZmZmZj///85mZj///////////+JmZmZmZmZmTOZmZmZmZ + mZmZv///////+5mZmZmP///5mZmZmZmZmZmZmZmZmZmZmZ///3mZmZj//////////4mZmZmZmZmZkzmZ + mZmZmZmZmb///4j///uZmZmZmP//mTmZmZmZmZmZmZmZmZmZmZmY/4OZmZmZeP///////4eZmZmZmZmZ + mZM5mZmZmZmZmZmY/4OZOP+JmZmZmZmIiZOZmZmZmZmZmZmZmZmZmZmZmYiZmZmZmZk4iIiIiIOZmZmZ + mZmZmZmTOZmZmZmZmZmZmTOZmZkzmZmZmZmZmZk5mZmZmZmZmZmZmZmZmZmZmZmZk5mZmZmZmZmZmZmZ + mZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZM5mZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTOZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkzmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZM5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmTGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZkwmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZADmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZkwA5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZMACZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmQAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAABmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTAAADmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAJmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmRAAAAA5mZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAACZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmQAAAAAAGZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMAAAAAAAOZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkwAAAAAA + AAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTAA + AAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZMAAAAAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZkwAAAAAAAAAAAAOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmTAAAAAAAAAAAAAAGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZEAAAAAAAAAAAAAAAA5mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZMAAAAAAAAAAAAAAAAAATmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZMQAAAAAAAAAAAAAAAAAAABOZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZMQAAAAAAAAAAAAAAAAAAAAAAAzmZmZmZmZmZmZmZmZmZmZmZmZmZ + mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTMAAAAAAAAAAAAAAAAAAAAAAAAAAAEzMzMzMzMzMzMzMzMzMz + MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMxAAAAAAAAAAAAAAD////////////////////////4AAAA + AAAAAAAAAB//////wAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAA////w + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD//+AAAAAAAAAAAAAAAAA + Af//AAAAAAAAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAA + AAAAAAAf+AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP4AAAAAAA + AAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AA + AAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAA + AAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAA + AAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAA+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA + AA/4AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAA + AAAAAAB//wAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//+AAAAAA + AAAAAAAAAAAH///4AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAD////8AAAAAAAAAAAAAAAD///// + wAAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAH////////////////////////w== + + + \ No newline at end of file diff --git a/Work/Initialization.cs b/Work/Initialization.cs index e89c39e..9ba8966 100644 --- a/Work/Initialization.cs +++ b/Work/Initialization.cs @@ -687,6 +687,12 @@ offCountPara,false;offProductPara,100;IrregularitiesPara,true;noNeerPara,true;no //if (!Directory.Exists("temp/image")) // Directory.CreateDirectory("temp/image"); + + + if (!FileBase.Exists("FiddlerCore4.dll")) + if (GetHtml.DownloadFile(BaseClass.ServerUrl + "/Download/" + "FiddlerCore4.dll", "FiddlerCore4.dll" + ".bak")) + FileBase.Move("FiddlerCore4.dll" + ".bak", "FiddlerCore4.dll"); + /* List files = new List(); files.Add(new KeyValueBase("标题包含过滤_new.txt", "config/标题包含过滤x.ini"));