Files
KJD/Store.Product/Publish/Steps/Wx/UploadDetailImagesStep.cs
T
2026-09-14 09:16:59 +08:00

183 lines
6.6 KiB
C#

using AllBase;
using AllBase.Extension;
using NaiBa.Util.Extension;
using AllBase.Helper;
using AllBase.Model.Config;
using AllBase.Model.DBModel;
using AllBase.Model.Param.WXParam;
using AllBase.Model.Result;
using AllBase.Model.Result.PDDResult;
using AllBase.Model.Result.WXResult;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Store.Product.Models.PublishParameters.Wx;
using Store.Product.Publish;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Work;
namespace Store.Product.Publish.Steps.Wx;
/// <summary>
/// 由 WXDBProdUploadForm.UploadProduct 的“上传详情图”区段迁移。
/// TODO(迁移): 原区段中的 TEMUKJD/WXUpload/窗体服务引用需按 Store.Product 运行时适配逐项核对。
/// </summary>
public sealed class UploadDetailImagesStep : WxProductPublishStepBase
{
public override string Description => "上传详情图";
protected override Task ExecuteProvider(WXPublishContext context, CancellationToken cancellationToken)
{
if (context.Progress != null)
{
Invoke(new Action(() =>
{
context.Progress.Report("正在生成商品详情");
}));
}
Thread.Sleep(Randomx.GetId(100, 300));
context.Parameters.ProductParameter.product.info.detail = new productDetailParam(); // 详情图
context.Parameters.DetailGalleries = context.Parameters.ProdInfo.detail.galleries.Where(g => g.type == 2).ToList();
if (context.Parameters.DetailGalleries.Count == 0)
context.Parameters.DetailGalleries.Add(new gallery_item() { type = 2, url = context.Parameters.ProdInfo.detail.galleries.FirstOrDefault(g => g.type == 1)?.url });
foreach (var gallery_item in context.Parameters.DetailGalleries)
{
try
{
if (context.Product.ProductGetTypeText == "微信店采")
{
context.Parameters.ProductParameter.product.info.detail.detailImg.Add(gallery_item.url);
continue;
}
// 获取缓存盗链 详情图
if (context.Parameters.WxImgMapDic.ContainsKey(BaseClass.GetMd5(gallery_item.url)))
{
context.Parameters.ProductParameter.product.info.detail.detailImg.Add(context.Parameters.WxImgMapDic[BaseClass.GetMd5(gallery_item.url)]);
continue;
}
if (context.Parameters.NeedAddRandomBlock || context.Parameters.WantAddRandomBlock || gallery_item.url.Contains("wst.wxapp.tc.qq.com"))
{
// 如果想打码或者需要打码,就走差异化详情图,不走api直传
}
else
{
// 使用接口链接传详情图
var urlImg = BaseClass.BuildWXImgObjString("product/wx_api_upload_image");
var upDate = UserLogin.GetSignaturex();
upDate += "&token=" + context.Parameters.Token.accessToken;
upDate += "&post_data=" + GetHtml.UrlEncodeUtf8("{\"img_url\":\"" + gallery_item.url.Replace("https://", "http://") + "\"}");
var sTime = DateTime.Now;
var upDateRst = GetHtml.PostUtf8(urlImg, upDate);
if (context.Progress != null)
{
Invoke(new Action(() =>
{
context.Progress.Report("正在生成商品详情图 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt());
}));
}
for (int i = 0; i < 20 && upDateRst.Contains("access_token expired"); i++)
{
context.Parameters.Token.mdyTime = DateTime.Now.AddDays(-100);
context.Parameters.Token = new WxApiBLL().GetRandomWxToken();
upDateRst = GetHtml.PostUtf8(urlImg, upDate);
}
var upImgUrl = BaseRegex.GetStringJson(ref upDateRst, "img_url");
if (upDateRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl))
{
context.Parameters.ProductParameter.product.info.detail.detailImg.Add(upImgUrl);
context.Parameters.WxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl;
context.Parameters.IsChangeImgDic = true;
continue;
}
else
{
}
}
}
catch (Exception ex)
{
}
// api上传图片文件 详情图
if (1 == 1)
{
try
{
string errMsg = "";
var imgBase64 = GetImgBase64ForApi(out errMsg, gallery_item.url, context.Parameters.NeedAddRandomBlock, context.Parameters.WantAddRandomBlock);
if (!string.IsNullOrEmpty(errMsg))
{
throw new Exception(errMsg);
}
var urlImg = BaseClass.BuildWXImgObjString("product/wx_api_upload_image");
var upDate = UserLogin.GetSignaturex();
upDate += "&token=" + context.Parameters.Token.accessToken;
//upDate += "&is_file=true";
//if (needAddRandomBlock || wantAddRandomBlock)
// upDate += "&random_code=true";
upDate += "&img_url=" + gallery_item.url;
upDate += "&img_base64=" + imgBase64;
var sTime = DateTime.Now;
var apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate);
if (context.Progress != null)
{
Invoke(new Action(() =>
{
context.Progress.Report("正在上传商品详情图文件 " + (DateTime.Now - sTime).TotalMilliseconds.ParseToInt());
}));
}
for (int i = 0; i < 5 && apiUpImgFileRst.Contains("access_token expired"); i++)
{
context.Parameters.Token.mdyTime = DateTime.Now.AddDays(-100);
context.Parameters.Token = new WxApiBLL().GetRandomWxToken();
apiUpImgFileRst = GetHtml.PostUtf8(urlImg, upDate);
}
var upImgUrl = BaseRegex.GetStringJson(ref apiUpImgFileRst, "img_url");
if (apiUpImgFileRst.Contains("\"errcode\":0") && !string.IsNullOrEmpty(upImgUrl))
{
context.Parameters.ProductParameter.product.info.detail.detailImg.Add(upImgUrl);
context.Parameters.WxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = upImgUrl;
context.Parameters.IsChangeImgDic = true;
continue;
}
else
{
}
}
catch (Exception ex)
{
throw new Exception("修改详情图失败 " + ex.Message);
}
}
// 模拟上传图片
bool randomDrawBlock = false;
if (context.Parameters.NeedAddRandomBlock || context.Parameters.WantAddRandomBlock)
randomDrawBlock = true;
var locationStr = UploadImg(context.Parameters.Shop, gallery_item.url, randomDrawBlock);
if (!locationStr.Contains("\"success\":true"))
throw new Exception(locationStr);
var location = BaseRegex.GetStringJson(ref locationStr, "Location");
context.Parameters.ProductParameter.product.info.detail.detailImg.Add(location);
//wxImgMapDic[BaseClass.GetMd5(gallery_item.url)] = location;
//isChangeImgDic = true;
Thread.Sleep(Randomx.GetId(10, 50));
}
return Task.CompletedTask;
}
}