Files
KJD/TEMUKJD/ToolForms/DouBaoTitleFissionCefForm.cs
T

422 lines
18 KiB
C#

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<KJDDBProduct> lstDbProd = new List<KJDDBProduct>();
KJDDBProduct currentProd = null;
string Url { get; set; } = "https://www.doubao.com/chat/";
List<Cookie> Cookies = new List<Cookie>();
public DouBaoTitleFissionCefForm(List<KJDDBProduct> dbProdList, string url = "", List<Cookie> 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<DataGridViewRow>().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<DataGridViewRow>().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 <txtElements.length; i++) {
var txtElement = txtElements[i];
var rect = txtElement.getBoundingClientRect();
txtElement.click();
return rect.left + ',' + rect.top;
}
return '';
})();";
var host = cefWebBrowser.GetBrowser().GetHost();
var client = cefWebBrowser.GetDevToolsClient();
if (host == null || client == null)
{
Invoke(new Action(() => { 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<DataGridViewRow>().Where(r => r.Cells["col_spu_id"].Value.ParseToString() == prodId).ToList();
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 (chkWithTitle.Checked && !data.Contains(currentProd.product_name))
{
foreach (var row in rows)
Invoke(new Action(() => { row.Cells["colOpResult"].Value = "标题不匹配"; }));
currentProd = null;
return;
}
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.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;
}
}
}
}