using dodohold.core; using Sayaka.Common; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace molilian.core { public partial class PddUnionPlus { static string _baseUrl = "https://gw-api.pinduoduo.com/api/router"; public class ErrorResponse { public string error_msg { get; set; } public string sub_msg { get; set; } public string sub_code { get; set; } public int error_code { get; set; } public string request_id { get; set; } } public class GoodsZsUnitGenerateResponse { public string multi_group_mobile_short_url { get; set; } public string multi_group_url { get; set; } public string mobile_url { get; set; } public string multi_group_short_url { get; set; } public string mobile_short_url { get; set; } public string multi_group_mobile_url { get; set; } public string request_id { get; set; } public string url { get; set; } public string short_url { get; set; } } public class UnionGeneratelinkDTO { public GoodsZsUnitGenerateResponse goods_zs_unit_generate_response { get; set; } public ErrorResponse error_response { get; set; } } public static Dictionary GenerateSignature(PddPoolDTO account, Dictionary args) { if (args.ContainsKey("sign")) args.Remove("sign"); // 对参数进行ASCII升序排序 var sortedArgs = args.OrderBy(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value); // 拼接排序后的参数 StringBuilder stringBuilder = new StringBuilder(); foreach (var kv in sortedArgs) { stringBuilder.Append(kv.Key).Append(kv.Value); } // 在头部和尾部分别拼接client_secret string signString = account.app_secret + stringBuilder.ToString() + account.app_secret; signString = signString.MD5(false, false); if (!args.TryAdd("sign", signString)) { args["sign"] = signString; } return args; } /// /// 多多进宝转链接口 /// /// /// /// /// public async Task UnionGeneratelink(PddDataDTO result, string sourceUrl, CancellationToken cancellationToken = default) { string api_type = "pdd.ddk.goods.zs.unit.url.gen"; if (!string.IsNullOrEmpty(_account.access_token)) { api_type = "pdd.ddk.oauth.goods.zs.unit.url.gen"; } var ts = DateTime.Now.Convert2UnixTimestamp(true); var args = new Dictionary { { "type",api_type}, { "data_type", "JSON" }, { "client_id", _account.app_key }, { "access_token", _account.access_token }, { "pid", _account.pid }, { "source_url", sourceUrl }, { "timestamp", ts.ToString() } }; args = GenerateSignature(_account, args); var query = HttpUtility.ParseQueryString(string.Empty); foreach (var kvp in args) query[kvp.Key] = kvp.Value; string urlWithQuery = $"{_baseUrl}?{query}"; WebClientUtility client = new(); client.Proxy = _proxy; #if DEBUG client.Proxy = null; #endif client.SetContentType("application/json"); var response = await client.RequestAsync(urlWithQuery, "GET", cancellationToken); //https://gw-api.pinduoduo.com/api/router?type=pdd.ddk.oauth.goods.zs.unit.url.gen&data_type=JSON&client_id=c8823690b47842649e4fee054317e0c1&access_token=5742da3542b94f86a29f1582e02cdfce76260f09&pid=41188561_292056956&source_url=https%3A%2F%2Fp.pinduoduo.com%2FbycsAB3L×tamp=1725306430&sign=31EFD135B3530C639AAC32B9DFF1F2F4 //https://gw-api.pinduoduo.com/api/router?type=pdd.ddk.goods.zs.unit.url.gen&data_type=JSON&client_id=c8823690b47842649e4fee054317e0c1&access_token=5742da3542b94f86a29f1582e02cdfce76260f09&pid=41188561_292056956&source_url=https%3a%2f%2fp.pinduoduo.com%2fbycsAB3L×tamp=1725306278417&sign=72D2F327C0199AC68C1CF1136C14FA4B string body = response.Body(); var root = body.Convert2Object(); string message = string.Empty; if (root.error_response != null || root.goods_zs_unit_generate_response == null) { message = $"{root.error_response.sub_code}:{root.error_response.sub_msg}"; result.success = false; result.message = "转链失败"; result.reason = message; _ = new LoggerLibrary("PddUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync(); if ("30007".Equals(root.error_response.sub_code)) { PddPoolCore.AccountRisk(_account); } return result; } if (string.IsNullOrEmpty(root.goods_zs_unit_generate_response.url)) { result.success = false; result.message = "转链失败"; result.reason = "无法转链"; _ = new LoggerLibrary("PddUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync(); return result; } result.itemId = root.goods_zs_unit_generate_response.url.GetContentPart("goods_id=", "&"); if (string.IsNullOrEmpty(root.goods_zs_unit_generate_response.short_url)) { result.success = false; result.message = "转链失败"; result.reason = "链接无效"; _ = new LoggerLibrary("PddUnion", "UnionGeneratelink").Info(urlWithQuery, body).SaveAsync(); return result; } result.success = true; result.message = "OK"; result.link_type = LinkTypeEnum.goods; result.shortLinkurl = root.goods_zs_unit_generate_response.short_url; result.content = result.shortLinkurl; result.deeplink_url = GetDeeplink(result.shortLinkurl); return result; } } }