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 static PDDShopUpdateFddlCookieForm instance; public PDDShopUpdateFddlCookieForm(ShopLoginInfo _shop, SetCookieFromEnum from = SetCookieFromEnum.normal_user) { instance = this; InitializeComponent(); shop = _shop; updateFrom = from; } private void PDDShopUpdateFddlCookieForm_Load(object sender, EventArgs e) { Task.Run(() => { int i = 0; while (true) { i++; string txt = "店铺 " + shop.ShopAccount + " 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; } if (this.Created && !this.Disposing && !this.IsDisposed) { // 窗口存在 } 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_1") && !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("基础连接已关闭")) { data = PDDShopListForm.GetShopStatus(cookieShop); } if (data.Contains("基础连接已关闭")) { 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 if (this.Created && !this.Disposing && !this.IsDisposed) Invoke(new Action(() => { this.OnSaveComplete(shop); this.Close(); })); } } private void PDDShopUpdateFddlCookieForm_FormClosed(object sender, FormClosedEventArgs e) { fddlHelper.UninstallFiddler(); } 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); // 店铺写入到服务端 } } } } }