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; } } }