使用 cURL 获取 TikTok 最终帖子 URL

问题描述

我希望对 TikTok 帖子 URL 进行 cURL 并跟踪它经过的每个单独的 URL。

在此示例 (https://vm.tiktok.com/ZMeh1yKUQ/) 中,我在浏览器中收到 https://m.tiktok.com/v/6841927751578946822.html 而不是最终网址:https://www.tiktok.com/@ibruno_maciel/video/6841927751578946822

    function getWebPage($url,$redirectcallback = null){
    $ch = curl_init($url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);
    curl_setopt($ch,CURLOPT_HEADER,true);
    curl_setopt($ch,CURLOPT_NOBODY,CURLOPT_TIMEOUT,10);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,CURLOPT_USERAGENT,"Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1) Gecko/20061024 BonEcho/2.0");

    $html = curl_exec($ch);
    $http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    if ($http_code == 301 || $http_code == 302) {
        list($httpheader) = explode("\r\n\r\n",$html,2);
        $matches = array();
        preg_match('/(Location:|URI:)(.*?)\n/',$httpheader,$matches);
        $nurl = trim(array_pop($matches));
        $url_parsed = parse_url($nurl);
        if (isset($url_parsed)) {
            if($redirectcallback){ // callback
                 $redirectcallback($nurl,$url);
            }
            $html = getWebPage($nurl,$redirectcallback);
        }
    }
    return $html;
}

function trackAllLocations($newUrl,$currentUrl){
    echo $currentUrl.' ---> '.$newUrl."\r\n";
}

getWebPage('https://vm.tiktok.com/ZMeh1yKUQ/','trackAllLocations');

有什么建议吗?

解决方法

不是 100% 确定为什么,但是如果您调试发回的标头以检查它想要重定向的方式...

对于 301 响应...

Location: https://m.tiktok.com/...

对于 302...

location: https://www.tiktok.com/@ib...

所以你的正则表达式没有找到 Location,一个快速的解决方法是让搜索不区分大小写(使用 /i 标志)...

preg_match('/(Location:|URI:)(.*?)\n/i',$httpheader,$matches);