将淘宝客加密链接转换成普通淘宝链接

 更新时间:2017年8月9日 23:10  点击:929

1,先获取淘宝客链接一枚:
$clickurl="http://s.click.taobao.com/t?e=m%3D2%26s%3D1xJRigdN6vgcQipKwQzePOeEDrYVVa64REOHN%2B0iJT23bLqV5UHdqdSm9rmNrfhQMlIj6E1wLr6Z1upWVE%2FY63jUGTUkifoD6Iu7YpSAkMmDDvvObppylOm%2B2Cp2Y4AZdQRGST%2FOE66WnyaKIIfB45Ka7uvYZB3KIXgUnhszXk7H%2FWo6QkJXpnEKIlIBiOAf%2BiEiH3X0n4yiZ%2BQMlGz6FQ%3D%3D";

2,PHP获取初步跳转后的URL:
$headers = get_headers($clickurl, TRUE);
$tu = $headers['Location'];

得到链接如下:
$tu="http://s.click.taobao.com/t_js?tu=http%3A%2F%2Fs.click.taobao.com%2Ft%3Fe%3Dm%253D2%2526s%253D1xJRigdN6vgcQipKwQzePOeEDrYVVa64REOHN%252B0iJT23bLqV5UHdqdSm9rmNrfhQMlIj6E1wLr6Z1upWVE%252FY63jUGTUkifoD6Iu7YpSAkMmDDvvObppylOm%252B2Cp2Y4AZdQRGST%252FOE66WnyaKIIfB45Ka7uvYZB3KIXgUnhszXk7H%252FWo6QkJXpnEKIlIBiOAf%252BiEiH3X0n4yiZ%252BQMlGz6FQ%253D%253D%26ref%3D%26et%3DU1NBEMyybRSMZqT%252FAdx5AObU6XqsSK9q";

因此链接中带有一个参数tu,后面要用到,所以将此链接取名为tu,继续第三步。


3,取得tu链接中的tu参数,也就是等号后面的内容:
http%3A%2F%2Fs.click.taobao.com%2Ft%3Fe%3Dm%253D2%2526s%253D1xJRigdN6vgcQipKwQzePOeEDrYVVa64REOHN%252B0iJT23bLqV5UHdqdSm9rmNrfhQMlIj6E1wLr6Z1upWVE%252FY63jUGTUkifoD6Iu7YpSAkMmDDvvObppylOm%252B2Cp2Y4AZdQRGST%252FOE66WnyaKIIfB45Ka7uvYZB3KIXgUnhszXk7H%252FWo6QkJXpnEKIlIBiOAf%252BiEiH3X0n4yiZ%252BQMlGz6FQ%253D%253D%26ref%3D%26et%3DU1NBEMyybRSMZqT%252FAdx5AObU6XqsSK9q

对编码熟悉的同学应该看出来了这其实是一条URL地址被escape编码了,我们使用php自定义一个解码函数对其进行处理一下,网上找到的unescape解码函数:

function unescape($str) { 
    $ret = ''; 
    $len = strlen($str); 
    for ($i = 0; $i < $len; $i ++) 
    { 
        if ($str[$i] == '%' && $str[$i + 1] == 'u') 
        { 
            $val = hexdec(substr($str, $i + 2, 4)); 
            if ($val < 0x7f) 
                $ret .= chr($val); 
            else  
                if ($val < 0x800) 
                    $ret .= chr(0xc0 | ($val >> 6)) . 
                     chr(0x80 | ($val & 0x3f)); 
                else 
                    $ret .= chr(0xe0 | ($val >> 12)) . 
                     chr(0x80 | (($val >> 6) & 0x3f)) . 
                     chr(0x80 | ($val & 0x3f)); 
            $i += 5; 
        } else  
            if ($str[$i] == '%') 
            { 
                $ret .= urldecode(substr($str, $i, 3)); 
                $i += 2; 
            } else 
                $ret .= $str[$i]; 
    } 
       return $ret; 
    }


解码后得到的URL地址为:
$ref="http://s.click.taobao.com/t?e=m%3D2%26s%3D1xJRigdN6vgcQipKwQzePOeEDrYVVa64REOHN%2B0iJT23bLqV5UHdqdSm9rmNrfhQMlIj6E1wLr6Z1upWVE%2FY63jUGTUkifoD6Iu7YpSAkMmDDvvObppylOm%2B2Cp2Y4AZdQRGST%2FOE66WnyaKIIfB45Ka7uvYZB3KIXgUnhszXk7H%2FWo6QkJXpnEKIlIBiOAf%2BiEiH3X0n4yiZ%2BQMlGz6FQ%3D%3D&ref=&et=Tu9eFLz3gxx7bGejK8KgtemqA%2BR0RX35";

这地址跟我们获取的淘宝客链接几乎相同,就是后面多了两个参数,一个ref,一个et,这里我们把这个地址命名为ref。


淘宝客链接的跳转其实就是一个封装的js程序,通过JS发起带有header参数的请求从而达到跳转的,这个header参数中最重要的就是referer,下面我就用PHP模拟请求一下这个地址:



请求后的结果输出跳转后的302头部信息,里面已经有我们想要的淘宝商品实际地址了。


以下是完整的提取淘宝URL函数:


function geturl($clickurl){        
                $headers = get_headers($clickurl, TRUE);
                $tu = $headers['Location'];
                $eturl = unescape($tu);
                $u = parse_url($eturl);
               $param = $u['query'];                
                $ref = str_replace('tu=', '', $param);
                $ch = curl_init();  
                curl_setopt($ch, CURLOPT_URL, $ref);                  
                curl_setopt($ch, CURLOPT_REFERER, $tu);   
                curl_setopt($ch, CURLOPT_HEADER, false);  
                curl_setopt($ch, CURLOPT_NOBODY,1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
                curl_setopt($ch, CURLOPT_MAXREDIRS,2);                
                $out = curl_exec($ch);  
                $dd =  curl_getinfo($ch);
                curl_close($ch);  
                $item_url = $dd['url'];
                return $item_url; 
}




另外说明一下,curl中如果这个CURLOPT_FOLLOWLOCATION参数无效,很有可能是PHP运行模式问题,可以使用其他方法替代。示例:

function geturl($clickurl){        
                $headers = get_headers($clickurl, TRUE);
                $tu = $headers['Location'];
                $eturl = unescape($tu);
                $u = parse_url($eturl);
                $param = $u['query'];                
                $ref = str_replace('tu=', '', $param);
                $ch = curl_init();  
                curl_setopt($ch, CURLOPT_URL, $ref);                  
                curl_setopt($ch, CURLOPT_REFERER, $tu);   
                curl_setopt($ch, CURLOPT_HEADER, false);  
                curl_setopt($ch, CURLOPT_NOBODY,1);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
                curl_setopt($ch, CURLOPT_MAXREDIRS,2);                
                $out = curl_exec($ch);  
                $dd =  curl_getinfo($ch);
                curl_close($ch);  
                if($dd['redirect_url']){
                $item_url= $dd['redirect_url'];        
                }else{
                if($dd['url']){
                $item_url= $dd['url'];        
                }else{
                $chl = curl_init();  
                curl_setopt($chl, CURLOPT_URL, $et);                  
                curl_setopt($chl, CURLOPT_REFERER, $tu);   
                curl_setopt($chl, CURLOPT_HEADER, true);  
                curl_setopt($chl, CURLOPT_NOBODY,1);
                curl_setopt($chl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($chl, CURLOPT_FOLLOWLOCATION,true);
                curl_setopt($chl, CURLOPT_MAXREDIRS,2);                
                $out = curl_exec($chl);                  
                curl_close($chl);
                $item_url= get_word($out,'Location: ','&ali_trackid');
                }
           }
          return $item_url; 
}


http://bbs.yangtata.com/forum.php?mod=viewthread&tid=4182

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • PHP添加MongoDB扩展实例教程

    由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
  • php身份证校验码的计算例子

    下面来给各位同学介绍一个php身份证校验码的计算例子,希望本函数代码能帮助到各位同学哦。 例子 代码如下 复制代码 public function id_ver...2016-11-25
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php生成二维码中文乱码问题解决方法

    最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • php5.3下使用php管理crontab计划任务

    php5.3或以上版本可以使用php管理crontab计划任务,下面我先来体验一下,有需要学习了解的朋友可进入参考。 1.使用php-crontab-manager管理计划任务 要求 PHP>=5.3...2016-11-25
  • ASP/PHP sql注入语句整理大全

    SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作 标准注入语句1.判...2016-11-25
  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • PHP7快速编译安装的步骤

    编译安装非常的简单了我们现在的php版本已经到了php7了,下文小编来为各位介绍一篇关于PHP7快速编译安装的步骤,希望文章能够帮助到各位。 一、安装必要一些依赖 yum...2016-11-25
  • php KindEditor文章内分页的实例方法

    我们这里介绍php与KindEditor编辑器使用时如何利用KindEditor编辑器的分页功能实现文章内容分页,KindEditor编辑器在我们点击分页时会插入代码,我们只要以它为分切符,就...2016-11-25
  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • PHP+Ajax手机发红包的程序例子

    PHP+Ajax有许多的功能都会用到它小编今天就有使用PHP+Ajax实现的一个微信登录功能了,下面我们来看一个PHP+Ajax手机发红包的程序例子,具体如下所示。 PHP发红包基本...2016-11-25