using AllBase; using AllBase.Model.Result; using AllBase.Model.Result.TemuResult; using CefSharp; using CefSharp.WinForms; 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.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using TemuKJD.BaseForms; using TemuKJD.Extension; using TemuKJD.Helper; using TemuKJD.KJDForms.ProductSelectForms; using TemuKJD.PDDForms.ProductSelectForms; using Work; using Work.BLL.Tools; namespace TemuKJD.ToolForms { public partial class DouBaoTitleFissionCefForm : BaseGeneralForm { ChromiumWebBrowser cefWebBrowser = null; List lstDbProd = new List(); KJDDBProduct currentProd = null; string Url { get; set; } = "https://www.doubao.com/chat/"; List Cookies = new List(); public DouBaoTitleFissionCefForm(List dbProdList, string url = "", List cookies = null) { InitializeComponent(); if (dbProdList != null) lstDbProd.AddRange(dbProdList); if (!string.IsNullOrEmpty(url)) Url = url; if (cookies != null) Cookies = cookies; this.Width = Math.Min(1600, Screen.PrimaryScreen.Bounds.Width); this.Height = Math.Min(900, Screen.PrimaryScreen.Bounds.Height); this.StartPosition = FormStartPosition.CenterScreen; } private void DouBaoCefForm_Load(object sender, EventArgs e) { this.dgvDbProduct.AddSelectorColumn("colSelect"); this.dgvDbProduct.AddImgColumn("colMainImg", "colMainImgUrl"); cefWebBrowser = NaiBa.CefHelper.CEFBrowser.CreateChromiumWebBrowser(Url); cefWebBrowser.AutoSize = true; cefWebBrowser.Dock = DockStyle.Fill; CustomResourceRequestHandlerLocal resourceRequestHandler = new CustomResourceRequestHandlerLocal(); resourceRequestHandler.ResourceLoadCompleteEvent += RequestHandler_ResourceLoadComplete; resourceRequestHandler.BeforeResourceLoadEvent += RequestHandler_BeforeResourceLoad; cefWebBrowser.RequestHandler = new NaiBa.CefHelper.Handler.CustomRequestHandler(resourceRequestHandler); //cefWebBrowser.RequestContext = new RequestContext(requestContextSettings); cefWebBrowser.KeyboardHandler = new KJDForms.ToolForms.CefKeyboardHandler(); cefWebBrowser.FrameLoadEnd += CefWebBrowser_FrameLoadEnd; cefWebBrowser.AddressChanged += CefWebBrowser_AddressChanged; CustomDownloadHandler downloadHandler = new CustomDownloadHandler(); downloadHandler.DownloadCompleteEvent += DownloadHandler_DownloadComplete; cefWebBrowser.DownloadHandler = downloadHandler; panel2.Controls.Add(cefWebBrowser); //this.splitContainer3.Panel2.Controls.Clear(); ShopProduct(); } private void DouBaoTitleFissionCefForm_VisibleChanged(object sender, EventArgs e) { } private bool RequestHandler_BeforeResourceLoad(object sender, string url, string postData, IRequest request) { return false; } void ShopProduct() { dgvDbProduct.Rows.Clear(); foreach (var prod in this.lstDbProd) { var rowId = this.dgvDbProduct.Rows.Add( false, prod?.id, prod?.from_shop_id, prod?.from_shop_name, prod?.main_img?.Replace("https", "http") + "?imageView2/2/w/90/h/90", DataGridViewExtension.defaultBitmap, prod?.product_name, prod?.spu_id, "" ); var row = this.dgvDbProduct.Rows[rowId]; row.Height = 60; } pbLoading2.Visible = false; } private void DownloadHandler_DownloadComplete(object browser, DownloadItem downloadItem) { BaseMsgForm.ShowInfo(downloadItem.FullPath + "下载完成"); //Invoke(new Action(() => //{ // if(currentSkuImgItem == null) // { // BaseMsgForm.ShowInfo("当前未选择sku,点击选择sku再下载,图片将直接上传到服务端!"); // this.lblMsg.Text = downloadItem.FullPath + "下载完成"; // } // else // { // if (UpdateSkuImg(currentSkuImgItem, downloadItem.FullPath)) // { // this.lblMsg.Text = downloadItem.FullPath + "下载并上传服务端完成"; // } // else // { // this.lblMsg.Text = downloadItem.FullPath + "下载完成"; // } // } // this.pnlMsg.Visible = true; //})); //Task.Run(() => //{ // Thread.Sleep(2000); // Invoke(new Action(() => // { // this.pnlMsg.Visible = false; // })); //}); } private void CefWebBrowser_AddressChanged(object sender, CefSharp.AddressChangedEventArgs e) { if (this.Created) { Invoke(new Action(() => { txtUrl.Text = e.Address; })); } } private void CefWebBrowser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e) { } private void btnGoTo_Click(object sender, EventArgs e) { this.cefWebBrowser.Load(txtUrl.Text.Trim()); } private void btnBatchCreateFissionTitle_Click(object sender, EventArgs e) { //var lstProdId = dgvDbProduct.Rows.Cast().Where(row // => row.Cells["colSelect"]?.Value.ParseToBool() == true).Select(r => r.Cells["col_spu_id"]?.Value.ToString().Split(' ').FirstOrDefault()).ToList(); //var prodList = this.lstDbProd.Where(p => lstProdId.Contains(p.spu_id)).ToList(); //if (prodList.Count == 0) //{ // BaseMsgForm.ShowInfo("请选择商品"); // return; //} Task.Run(() => { var rows = dgvDbProduct.Rows.Cast().Where(row => row.Cells["colSelect"]?.Value.ParseToBool() == true).ToList(); if (rows.Count == 0) { BaseMsgForm.ShowInfo("请选择商品"); return; } foreach (var row in rows) { var cell = row.Cells["colOpResult"]; Invoke(new Action(() => { cell.Value = "生成中..."; })); var prodId = row.Cells["col_spu_id"].Value.ParseToString(); var prod = this.lstDbProd.FirstOrDefault(p => prodId == p.spu_id); currentProd = prod; if (prod == null) { Invoke(new Action(() => { cell.Value = "商品不存在"; })); continue; } Thread.Sleep(Randomx.GetId(500, 1000)); string resultStr = ""; var jsStr = @"(function() { var txtElements = document.getElementsByTagName('textarea'); for (i = 0; i { cell.Value = "页面打开失败"; })); continue; } var result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); result.Wait(5000); resultStr = result.Result.Result.Value.ParseToString(); if (resultStr.IsNullOrEmpty()) { Invoke(new Action(() => { cell.Value = "商品图片查询失败"; })); continue; } Thread.Sleep(Randomx.GetId(200, 1000)); var img_url = prod.main_img; string getImgError; if (!img_url.Contains("wst.wxapp.tc.qq.com") && !img_url.Contains("mmecimage.cn")) img_url = img_url.Replace("https://", "http://"); var image = GetHtml.GetUrlImg(img_url, out getImgError); Invoke(new Action(() => { Clipboard.SetImage(image); })); host.SendKeyEvent(new CefSharp.KeyEvent() { WindowsKeyCode = 86, Type = KeyEventType.RawKeyDown, Modifiers = CefEventFlags.ControlDown }); Thread.Sleep(Randomx.GetId(1500, 2500)); result = client.Runtime.EvaluateAsync(jsStr, null, true, null, null, true, null, true); result.Wait(5000); resultStr = result.Result.Result.Value.ParseToString(); if (resultStr.IsNullOrEmpty()) { Invoke(new Action(() => { cell.Value = "提示词调用失败"; })); continue; } Thread.Sleep(Randomx.GetId(200, 1000)); var askText = ""; Invoke(new Action(() => { askText = textBox1.Text.Trim(); if (chkWithTitle.Checked) askText = row.Cells["col_product_name"].Value.ParseToString() + "。" + textBox1.Text.Trim(); Clipboard.SetText(askText); })); host.SendKeyEvent(new CefSharp.KeyEvent() { WindowsKeyCode = 86, Type = KeyEventType.RawKeyDown, Modifiers = CefEventFlags.ControlDown }); Thread.Sleep(Randomx.GetId(200, 1000)); host.SendKeyEvent(new CefSharp.KeyEvent() { WindowsKeyCode = 13, Type = KeyEventType.RawKeyDown }); // 等待2分钟以防出现验证码等问题 for (int i = 0; i < 120; i++) { Thread.Sleep(1000); if (currentProd == null) break; } if (currentProd != null) { Invoke(new Action(() => { cell.Value = "生成失败,超时"; })); currentProd = null; } Invoke(new Action(() => { cefWebBrowser.Load(Url); })); Thread.Sleep(Randomx.GetId(3000, 5000)); } }); } private void RequestHandler_ResourceLoadComplete(object sender, string url, string postData, string responseData, IRequest request) { var pData = postData; var rData = responseData; //if (pData.Contains("这个产品生成一百二十个标题,纯文本,然后一行一个,不要加一二三四五六七八九这个序号,标题长度30个字,标题不要出现一模一样的。")) //{ //} if (url.StartsWith("https://www.doubao.com/chat/completion")) { Task.Run(() => { CefGetFissionTitle(rData); }); } } public void CefGetFissionTitle(string data) { if (currentProd == null || currentProd.spu_id.IsNullOrEmpty()) { currentProd = null; return; } var prodId = currentProd.spu_id; var dbId = currentProd.id; var rows = dgvDbProduct.Rows.Cast().Where(r => r.Cells["col_spu_id"].Value.ParseToString() == prodId).ToList(); if (chkWithTitle.Checked && !data.Contains(currentProd.product_name)) { foreach (var row in rows) Invoke(new Action(() => { row.Cells["colOpResult"].Value = "标题不匹配"; })); currentProd = null; return; } var titleStr = ""; var stringList = data.Split(new string[] { "data:" }, StringSplitOptions.RemoveEmptyEntries); foreach(var str in stringList) { var strTmp = str; var tts_content = BaseRegex.GetStringJson(ref strTmp, "tts_content"); if (!string.IsNullOrEmpty(tts_content)) { titleStr += tts_content; } } var titleList = titleStr.Split(new string[] { "\r", "\n", "\\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); for (int i =0; i< titleList.Count; i++) { for (int j = 0; j < 500; j++) if (titleList[i].StartsWith("" + j + ".")) titleList[i] = titleList[i].Substring(("" + j + ".").Length); } titleList = titleList.Where(t => t?.Length > 20).ToList(); if (titleList.Count() > 50) { if (dbId.IsNullOrZero()) dbId = 0; var url = BaseClass.BuildPDDObjString("product/mdy_db_product"); var body = UserLogin.GetSignaturex() + "&db_id=" + dbId; body += "&fission_words=fission_goods_names:" + GetHtml.UrlEncodeUtf8(string.Join("\r\n", titleList)); var html = GetHtml.PostUtf8(url, body); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(url, body); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) html = GetHtml.PostUtf8(url, body); if (string.IsNullOrEmpty(html) || !html.Contains("\"code\":200")) { //BaseMsgForm.ShowError("商品裂变编辑失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg")); foreach(var row in rows) { Invoke(new Action(() => { row.Cells["colOpResult"].Value = "标题裂变失败,请重试!" + BaseRegex.GetStringJson(ref html, "msg"); })); } } else { foreach (var row in rows) { Invoke(new Action(() => { row.Cells["colSelect"].Value = false; row.Cells["colOpResult"].Value = "标题裂变成功"; })); } } currentProd = null; } else { } } private void dgvDbProduct_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex < 0 || e.RowIndex < 0) return; string headerText = dgvDbProduct.Columns[e.ColumnIndex].HeaderText; var dbId = dgvDbProduct.Rows[e.RowIndex].Cells["col_db_id"].Value.ParseToString(); var dbProduct = lstDbProd.FirstOrDefault(p => p.id.ToString() == dbId); switch (headerText) { case "详情": case "编辑/详情": PDDDBProdEditForm editForm = new PDDDBProdEditForm(dbProduct); if (BaseClass.MainPath != "29pdd") { editForm.pnlSkuOption.Visible = false; editForm.txtProductName.ReadOnly = true; editForm.txtExtCode.ReadOnly = true; editForm.lblSkcId.Text = "仓库编码"; } editForm.ShowDialog(); //dgvDbProduct.Rows[e.RowIndex].Cells["col_notes"].Value = dbProduct.notes; //dgvDbProduct.Rows[e.RowIndex].Cells["col_ext_code"].Value = dbProduct.ext_code; //dgvDbProduct.Rows[e.RowIndex].Cells["colHeadWords"].Value = dbProduct.head_words; //dgvDbProduct.Rows[e.RowIndex].Cells["colEndWords"].Value = dbProduct.end_words; //dgvDbProduct.Rows[e.RowIndex].Cells["colFissionWords"].Value = dbProduct.fission_words; //dgvDbProduct.Rows[e.RowIndex].Cells["col_product_name"].Value = dbProduct.product_name; //dgvDbProduct.Rows[e.RowIndex].Cells["colSkuReplaceImgUrl"].Value = dbProduct.sku_img_replace_url; break; case "主图": ShowImgForm imgFrom = new ShowImgForm(dgvDbProduct.Rows[e.RowIndex].Cells["colMainImgUrl"].Value.ParseToString().Replace("?imageView2/2/w/90/h/90", "")); imgFrom.ShowDialog(); break; case "": dgvDbProduct.Rows[e.RowIndex].Cells["colSelect"].Value = !(bool)dgvDbProduct.Rows[e.RowIndex].Cells["colSelect"].Value; break; default: break; } } } }