422 lines
18 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|