腾格里

c# 通过手淘分享查询淘宝优惠券

要做一个淘宝客的微信公众号,想实现用户手淘分享商品公众号查内部优惠券的功能,但是淘宝联盟目前没有开放通过淘宝商品id查询优惠券、佣金信息的接口,好在有提供通用物料搜索api

我这里有发布好的接口,可供大家调用,需要的话,可加我微信

20190616194919.jpg

大体思路是解析手淘分享内容,找出商品关键字,然后通过商品关键字使用淘宝 通用物料搜索api查到佣金、优惠券信息。实现最终效果如下:

3634221189.jpg

实现

1 申请淘宝联盟appkey、secret

因为需要使用到淘宝接口,所以需要申请淘宝appkey、secret。需要开通淘宝客基础api和淘口令api,请自行前往淘宝联盟申请。

2 下载淘宝联盟sdk

需要申请淘宝appkey、secret之后在淘宝开放平台下载淘宝联盟SDK。

3 封装淘宝接口

目前只需要用到通用物料搜索api淘宝客淘口令api,所以封装了这两个接口。
代码如下:

    /// <summary>
    /// 淘宝物料搜索接口,获取佣金、优惠券信息
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public IList<MapDataDomain> MaterialOptional(string key)
    {

        if (string.IsNullOrEmpty(appkey)||string.IsNullOrEmpty(secret)||addzoneId==0)
        {
            throw new Exception("请检查是否设置接口url、淘宝appkey、secret及addzoneId");
        }

        ITopClient client = new DefaultTopClient(apiUrl,appkey,secret);

        TbkDgMaterialOptionalRequest req = new TbkDgMaterialOptionalRequest();
        req.AdzoneId = addzoneId;
        req.Platform = 2L;

        req.PageSize = 100L;
        req.Q = key;

        req.PageNo = 1L;
        TbkDgMaterialOptionalResponse rsp = client.Execute(req);
        return rsp.ResultList;
    }

    /// <summary>
    /// 获取淘口令
    /// </summary>
    /// <param name="url"></param>
    /// <param name="log_url"></param>
    /// <returns></returns>
    public string GetTaobaoKePassword(string url, string log_url)
    {
        
        ITopClient client = new DefaultTopClient(apiUrl, appkey, secret);
        TbkTpwdCreateRequest req = new TbkTpwdCreateRequest();

        if (url.Substring(0, 4) != "http")
        {
            url = "https:" + url;
        }
        req.Text = "关注“网购有券”,超值活动,惊喜多多!";
        req.Url = url;
        req.Logo = log_url;

        TbkTpwdCreateResponse rsp = client.Execute(req);
        return rsp.Data.Model;
        
    }


4. 解析商品关键字,并查询佣金、优惠券信息。

解析商品关键字有两种方式,一种是通过抓取淘宝分享内容中“【】”里的内容,将其作为关键字查询;另外一种是通过淘宝分享内容中的超链接,通过抓包方式获取关键字。
这两种都有些缺陷,第一种可能手淘版本的区别,会存在“【】”中内容不是淘宝商品关键字的情况,另外一种存在较小概率抓包失败的情况。所以目前这两种方式都需要用到。
第一种通过抓取淘宝分享内容中“【】”做关键字实现如下:

  public string QueryCoupon(string itemInfo)
    {
        

        string responeMessage = "";
        try
        {
            Match m_title = Regex.Match(itemInfo, @"【.*】");
            string temp = m_title.Value;
            if (!string.IsNullOrEmpty(temp))
            {
                temp = temp.Substring(1, temp.Length - 2);
            }
            else
            {
                return "";
            }

            if (temp.Contains("#手聚App"))
            {
                int IndexofA = temp.IndexOf("宝贝不错:");
                int IndexofB = temp.IndexOf("(分享自");
                temp = temp.Substring(IndexofA + 5, IndexofB - IndexofA - 5);
            }

            string title = temp;

            //解决手淘分享【】内非商品关键字bug
            if (title.Contains(",") | title.Contains(","))
            {
                return GetTaobaoCouponByLink(itemInfo);
            }

            var resultList = taobaoCommonApi.MaterialOptional(title);

            if (resultList!=null&&resultList.Count > 0)
            {
                //获取淘宝短链接
                Match m_url = Regex.Match(itemInfo, @"htt(p|ps):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?");

                if (m_url.Value == "")
                {
                    return responeMessage;
                }
                var s = HttpUtility.HttpGet(m_url.Value, "", "utf-8");

                //获取宝贝item id
                Match m_item = Regex.Match(s, @"((?<=m.taobao.com\/i)([0-9]+))|((?<=&id=)([0-9]+))");
                string item_id = m_item.Value;

                if (string.IsNullOrEmpty(item_id))
                {
                    Match am_url = Regex.Match(s, @"(?<=var url = ')(.*)(?=')");
                    var htmlContent = HttpUtility.HttpGet(am_url.Value, "", "gbk");
                    Match re_m_item = Regex.Match(htmlContent, @"(?<=taobao.com/item.htm\?id=)([0-9]*)");
                    item_id = re_m_item.Value;
                }

                if (string.IsNullOrEmpty(item_id))
                {
                   
                    var g = resultList.Where(y => !string.IsNullOrEmpty(y.CouponId)).OrderByDescending(w => w.Volume).FirstOrDefault();
                    if (g == null)
                    {
                        responeMessage = ConfigurationManager.AppSettings["tbk_nocoupon_msg"].Replace("\\n", "\n").Replace("\\ue231", "\ue231");

                    }
                    else
                    {
                        var hongbao = (decimal.Parse(g.ZkFinalPrice) - decimal.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;
                      
                        responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(g.ZkFinalPrice) - double.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.CouponShareUrl, g.PictUrl + "_400x400.jpg")}\n";

                    }
                    return responeMessage;

                }
                else
                {
                    float numid = 0;
                    try
                    {
                        numid = float.Parse(item_id);
                    }
                    catch (Exception ex)
                    {
                      
                        var g = resultList.Where(y => !string.IsNullOrEmpty(y.CouponId)).OrderByDescending(y => y.Volume).FirstOrDefault();

                        var hongbao = (decimal.Parse(g.ZkFinalPrice) - decimal.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;
                        responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(g.ZkFinalPrice) - double.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.CouponShareUrl, g.PictUrl + "_400x400.jpg")}\n";

                        return responeMessage;

                    }

                    foreach (var g in resultList)
                    {
                        if (g.NumIid == numid)
                        {
                            if (string.IsNullOrEmpty(g.CouponInfo))
                            {
                                var hongbao = decimal.Parse(g.ZkFinalPrice) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;

                                responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【约返利】{Math.Round(hongbao, 2)}元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.Url, g.PictUrl + "_400x400.jpg")}\n==========================\n下单确认收货后就能收到返利佣金啦~\n 点击查看  <a href='http://mp.weixin.qq.com/s?__biz=Mzg2NTAxOTEyMA==&mid=100000146&idx=1&sn=62405c8df3db46e74940aefb9ac3737b&chksm=4e61340d7916bd1bf645afbc6d10c1f19561d7fa59847516c01e64c0791e6d544f4f56c4f498#rd'>如何领取返利</a>";
                                return responeMessage;
                            }
                            else
                            {
                                var hongbao = (decimal.Parse(g.ZkFinalPrice) - decimal.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;
                                responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(g.ZkFinalPrice) - double.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.CouponShareUrl, g.PictUrl + "_400x400.jpg")}\n";
                                return responeMessage;
                            }
                        }
                    }

                    //没有找到,有相似宝贝推荐
                    var w = resultList.Where(y => !string.IsNullOrEmpty(y.CouponId)).OrderByDescending(y => y.Volume).FirstOrDefault();

                    if (w == null)
                    {
                        responeMessage = ConfigurationManager.AppSettings["tbk_nocoupon_msg"].Replace("\\n", "\n").Replace("\\ue231", "\ue231");
                    }
                    else
                    {
                        var hongbao = (decimal.Parse(w.ZkFinalPrice) - decimal.Parse(Regex.Match(w.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(w.CommissionRate) / 10000 * commission_rate;

                        responeMessage = $"/:rose 亲,这款商品的优惠返利活动结束了~\n已为你推荐以下宝贝。\n==========================\n{w.Title}\n【在售价】{w.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(w.ZkFinalPrice) - double.Parse(Regex.Match(w.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(w.CouponShareUrl, w.PictUrl + "_400x400.jpg")}\n";
                    }

                    return responeMessage;
                }

            }
            else
            {
                responeMessage = GetTaobaoCouponByLink(itemInfo);

            }

        }
        catch (Exception ex)
        {
           Senparc.Weixin.WeixinTrace.SendCustomLog("查询淘宝优惠券异常",ex.Message);

        }
        return responeMessage;
    }

第二种通过超链接抓包方式获取关键字方式,代码如下:

 public string GetTaobaoCouponByLink(string itemInfo)
    {

        string tbk_nocoupon_msg = ConfigurationManager.AppSettings["tbk_nocoupon_msg"].Replace("\\n", "\n").Replace("\\ue231", "\ue231");

        Match m_url = Regex.Match(itemInfo, @"htt(p|ps):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?");

        if (m_url.Value == "")
        {
            return tbk_nocoupon_msg;
        }
        var s = HttpUtility.HttpGet(m_url.Value, "", "utf-8");

       
        //获取宝贝item id
        Match m_item = Regex.Match(s, @"((?<=m.taobao.com\/i)([0-9]+))|((?<=&id=)([0-9]+))");
        string item_id = m_item.Value;

        Match am_url = Regex.Match(s, @"(?<=var url = ')(.*)(?=')");
        var htmlContent = HttpUtility.HttpGet(am_url.Value, "", "gbk");
        Match keyMatch = Regex.Match(htmlContent, "(?<=title\\>).*(?=</title)");

        if (string.IsNullOrEmpty(item_id))
        {
            Match re_m_item = Regex.Match(htmlContent, @"(?<=taobao.com/item.htm\?id=)([0-9]*)");
            item_id = re_m_item.Value;

        }

        if (string.IsNullOrEmpty(keyMatch.Value))
        {
            return tbk_nocoupon_msg;
        }

        var mapDataResponse = taobaoCommonApi.MaterialOptional(keyMatch.Value.Split('-')[0]);

      
        string responeMessage = "";

        float numid = float.Parse(item_id);

        if (mapDataResponse!=null&&mapDataResponse.Count > 0)
        {

            foreach (var g in mapDataResponse)
            {
                if (g.NumIid == numid)
                {
                    if (string.IsNullOrEmpty(g.CouponInfo))
                    {
                        var hongbao = decimal.Parse(g.ZkFinalPrice) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;

                        responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【约返利】{Math.Round(hongbao, 2)}元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.Url, g.PictUrl + "_400x400.jpg")}\n==========================\n下单确认收货后就能收到返利佣金啦~\n 点击查看  <a href='http://mp.weixin.qq.com/s?__biz=Mzg2NTAxOTEyMA==&mid=100000146&idx=1&sn=62405c8df3db46e74940aefb9ac3737b&chksm=4e61340d7916bd1bf645afbc6d10c1f19561d7fa59847516c01e64c0791e6d544f4f56c4f498#rd'>如何领取返利</a>";
                        return responeMessage;
                    }
                    else
                    {
                        var hongbao = (decimal.Parse(g.ZkFinalPrice) - decimal.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(g.CommissionRate) / 10000 * commission_rate;
                        responeMessage = $"{g.Title}\n【在售价】{g.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(g.ZkFinalPrice) - double.Parse(Regex.Match(g.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(g.CouponShareUrl, g.PictUrl + "_400x400.jpg")}\n";
                        return responeMessage;
                    }
                }
            }

            //没有找到,有相似宝贝推荐
            var w = mapDataResponse.Where(y => !string.IsNullOrEmpty(y.CouponId)).OrderByDescending(y => y.Volume).FirstOrDefault();

            if (w == null)
            {
                responeMessage = ConfigurationManager.AppSettings["tbk_nocoupon_msg"].Replace("\\n", "\n").Replace("\\ue231", "\ue231");
            }
            else
            {
                var hongbao = (decimal.Parse(w.ZkFinalPrice) - decimal.Parse(Regex.Match(w.CouponInfo, "减" + @"(\d+)").Groups[1].Value)) * decimal.Parse(w.CommissionRate) / 10000 * commission_rate;

                responeMessage = $"/:rose 亲,这款商品的优惠返利活动结束了~\n已为你推荐以下宝贝。\n==========================\n{w.Title}\n【在售价】{w.ZkFinalPrice}元\n【巻后价】{Math.Round(double.Parse(w.ZkFinalPrice) - double.Parse(Regex.Match(w.CouponInfo, "减" + @"(\d+)").Groups[1].Value), 2)} 元\n复制这条信息,打开「手机绹宝」领巻下单{taobaoCommonApi.GetTaobaoKePassword(w.CouponShareUrl, w.PictUrl + "_400x400.jpg")}\n";
            }

            return responeMessage;

        }
        else
        {
            return ConfigurationManager.AppSettings["tbk_nocoupon_msg"].Replace("\\n", "\n").Replace("\\ue231", "\ue231");

        }
    }

代码较乱,请见谅。目前代码也在整理中,如有问题可以留言。
完整代码 github下载

未经允许不得转载:腾格里 » c# 通过手淘分享查询淘宝优惠券

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址