using dodohold.core;
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using Top.Api;
using Top.Api.Request;
using Top.Api.Response;
using Top.Api.Util;
namespace molilian.core
{
public partial class TaobaoOpenPlus
{
///
/// 万能解析:解析淘宝链接或淘口令,返回物料类型、物料ID及原始链接。
///
/// 待解析的链接或淘口令。
/// 可选的渠道管理ID。
/// 可选返回字段,例如 origin_pid。
public TbkDgGeneralLinkParseResponse GeneralLinkParseRequest(
string materialUrl, string? relationId = null, string? fields = null)
{
ArgumentException.ThrowIfNullOrWhiteSpace(materialUrl);
return GeneralLinkParseRequest(new[] { materialUrl }, relationId, fields);
}
///
/// 批量解析淘宝链接或淘口令,每个物料的解析结果独立返回。
///
public TbkDgGeneralLinkParseResponse GeneralLinkParseRequest(
IEnumerable materialUrls, string? relationId = null, string? fields = null)
{
ArgumentNullException.ThrowIfNull(materialUrls);
List materials = new();
foreach (string materialUrl in materialUrls)
{
if (string.IsNullOrWhiteSpace(materialUrl))
{
throw new ArgumentException("materialUrls cannot contain empty values", nameof(materialUrls));
}
materials.Add(new TbkDgGeneralLinkParseRequest.LkMaterialDtoDomain
{
MaterialUrl = materialUrl
});
}
if (materials.Count == 0)
{
throw new ArgumentException("at least one material URL is required", nameof(materialUrls));
}
if (string.IsNullOrWhiteSpace(_pid))
{
throw new ArgumentException("pid is required", nameof(_pid));
}
string[] pidParts = _pid.Split('_');
if (pidParts.Length != 4 || pidParts[0] != "mm" ||
string.IsNullOrWhiteSpace(pidParts[1]) || string.IsNullOrWhiteSpace(pidParts[2]) ||
!long.TryParse(pidParts[3], out long adzoneId) || adzoneId <= 0)
{
throw new ArgumentException("pid format is invalid", nameof(_pid));
}
var client = new DefaultTopClient(_server_url, _app_key, _app_secret, "json");
client.SetProxy(_proxy);
TbkDgGeneralLinkParseRequest req = new()
{
AdzoneId = adzoneId,
MaterialDto_ = materials,
RelationId = relationId,
Fields = fields
};
TbkDgGeneralLinkParseResponse rsp = client.Execute(req);
if (_debug)
{
var requestJson = req.Convert2Json();
var responseJson = rsp.Convert2Json();
new LoggerLibrary("debug", _pid).Info(requestJson, responseJson).Save();
}
return rsp;
}
}
}
namespace Top.Api.Request
{
///
/// TOP API: taobao.tbk.dg.general.link.parse
///
public class TbkDgGeneralLinkParseRequest : BaseTopRequest
{
///
/// 推广位ID,mm_xx_xx_xx 中的最后一段。
///
public long? AdzoneId { get; set; }
///
/// 渠道管理ID。
///
public string? RelationId { get; set; }
///
/// 链接/口令物料列表的JSON数组。
///
public string MaterialDto { get; set; } = string.Empty;
public List MaterialDto_
{
set { MaterialDto = TopUtils.ObjectToJson(value); }
}
///
/// 可选返回字段,有 origin_pid 使用场景时传入 origin_pid。
///
public string? Fields { get; set; }
public override string GetApiName()
{
return "taobao.tbk.dg.general.link.parse";
}
public override IDictionary GetParameters()
{
TopDictionary parameters = new();
parameters.Add("adzone_id", AdzoneId?.ToString());
parameters.Add("relation_id", RelationId);
parameters.Add("material_dto", MaterialDto);
parameters.Add("fields", Fields);
return parameters;
}
public override void Validate()
{
RequestValidator.ValidateRequired("adzone_id", AdzoneId);
}
[Serializable]
public class LkMaterialDtoDomain : TopObject
{
///
/// 物料链接,可以为URL或淘口令。
///
[XmlElement("material_url")]
public string MaterialUrl { get; set; } = string.Empty;
}
}
}
namespace Top.Api.Response
{
///
/// 淘宝客-推广者-万能解析响应。
///
public class TbkDgGeneralLinkParseResponse : TopResponse
{
[XmlElement("data")]
public TbkLinkDtoDomain? Data { get; set; }
///
/// 业务错误码。
///
[XmlElement("biz_error_desc")]
public long BizErrorDesc { get; set; }
///
/// 业务结果描述。
///
[XmlElement("result_msg")]
public string ResultMsg { get; set; } = string.Empty;
[Serializable]
public class TbkLinkDtoDomain : TopObject
{
[XmlArray("material_url_list")]
[XmlArrayItem("material_url_list")]
public List MaterialUrlList { get; set; } = new();
}
[Serializable]
public class MaterialUrlListDomain : TopObject
{
///
/// 物料对应错误描述。
///
[XmlElement("msg")]
public string Msg { get; set; } = string.Empty;
///
/// 物料对应错误码,需逐项检查解析结果。
///
[XmlElement("code")]
public long Code { get; set; }
[XmlElement("link_info_dto")]
public LinkInfoDtoDomain? LinkInfoDto { get; set; }
///
/// 入参物料链接。
///
[XmlElement("input_material_url")]
public string InputMaterialUrl { get; set; } = string.Empty;
///
/// 解析成功时的补充说明。
///
[XmlElement("extra_info")]
public string ExtraInfo { get; set; } = string.Empty;
}
[Serializable]
public class LinkInfoDtoDomain : TopObject
{
///
/// 1-商品,2-店铺,3-会场,4-承接开放,5-优惠券,6-直播间。
///
[XmlElement("material_type")]
public long MaterialType { get; set; }
///
/// 入参口令/链接对应的原链接。
///
[XmlElement("tpwd_origin_url")]
public string TpwdOriginUrl { get; set; } = string.Empty;
///
/// 物料ID,根据物料类型区分商品ID、卖家ID或会场ID。
///
[XmlElement("material_id")]
public string MaterialId { get; set; } = string.Empty;
///
/// 1-联盟口令,2-主站口令;非淘口令场景不返回。
///
[XmlElement("tk_biz_type")]
public long TkBizType { get; set; }
///
/// 入参推广链接中的PID,需传入 fields=origin_pid,且属于当前推广者才返回。
///
[XmlElement("origin_pid")]
public string OriginPid { get; set; } = string.Empty;
}
}
}