2019年9月開發的線上影音模組,其中有一項功能是用爬蟲去爬FB影片擷取縮圖後儲存資料表的功能 https://neohsuxoops.blogspot.com/2019/09/ajaxphpjsfacebook.html
但最近發現許多原本擷取的FB縮圖都無法讀取了,圖片位置顯示URL signature expired,原來FB影片縮圖也是有時效性的,一段時間fb就會重建縮圖檔,檔名跟時間搓都會變動,難怪一開始擷取的FB縮圖都會變成無法顯示!
解決方法就是寫一個FB自動重建縮圖程式,放在影片區塊程式的前面,然後迴圈檢查FB縮圖如果回傳是URL signature expired則重建縮圖,否則不做操作,這樣並不會消耗系統太多效能,方法如下:
1、先在模組的function.php裡面加上這三個function
//重建縮圖程式
function fbtmburlfunction(,$url="",$tmburl="",$where="",$dbname=""){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "".$tmburl."");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),));
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 1); //成功連線伺服器前等時間/秒
curl_setopt ($ch, CURLOPT_TIMEOUT, 100); //超過指令碼將會斷開連線/秒
$boxcurl_exec = curl_exec($ch);
curl_close($ch);
if (preg_match("/URL signature expired/", $boxcurl_exec)){ //比對縮圖是否存在
$fbbox=onlinevideobox($url=$url); //重建爬取縮圖程式
$tmburl=substr(CatchStrfunction($fbbox," img"," alt"),11,-5); //擷取字串
//寫入資料表
$setvar="set tmburl='".$tmburl."' ".$where."";
update($dbname=$dbname,$set=$setvar);
}
}
//指定範圍擷取字串程式
function CatchStrfunction($Str, $StaKey, $EndKey){
$sp=strpos($Str,$StaKey);
$ep=strpos($Str,$EndKey);
$sl=strlen($StaKey);
$el=strlen($EndKey);
$res=substr($Str,$sp,$ep-$sp+$el);
return $res;
}
//重新爬取縮圖程式
function onlinevideobox($url=""){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "https://www.facebook.com/plugins/video.php?href=".$url."");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),));
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$box = curl_exec($ch);
curl_close($ch);
return $box;
}
2、然後再顯示影片縮圖的區塊迴圈前面加上重建縮圖程式(首頁區塊及影片首頁)
//開啟資料區
$dbneme="neilonlinevideocenter"; //資料表名稱
$where2=" ".$DBdata." ".$order." limit ".$options[0].""; //where數值
//重新產生縮圖程式
foreach($Arrboxtop as $key=> $val){
fbtmburlfunction($width="",$height="",$url=$Arrboxtop[$key]['url'],$type="fr",$img="",$tmburl="".$Arrboxtop[$key]['tmburl']."",$wheretop=" where centerid='".$Arrboxtop[$key]['centerid']."'",$dbname="neilonlinevideocenter");
}
foreach($onlinevideocenterArrbox as $key=> $val){
略...............
}
這樣當USER開啟頁面時,就先執行重新產生縮圖程式,然後判斷FB縮圖是否存在,若已失效則重建,之後寫入資料表再由下一段程式讀取影片資料表開啟迴圈顯示影片縮圖,這樣即使已失效的縮圖USER開啟頁面也會先重新產生縮圖,而不會顯示X。
工作心得撰寫: 徐嘉裕 Neil hsu
但最近發現許多原本擷取的FB縮圖都無法讀取了,圖片位置顯示URL signature expired,原來FB影片縮圖也是有時效性的,一段時間fb就會重建縮圖檔,檔名跟時間搓都會變動,難怪一開始擷取的FB縮圖都會變成無法顯示!
解決方法就是寫一個FB自動重建縮圖程式,放在影片區塊程式的前面,然後迴圈檢查FB縮圖如果回傳是URL signature expired則重建縮圖,否則不做操作,這樣並不會消耗系統太多效能,方法如下:
1、先在模組的function.php裡面加上這三個function
//重建縮圖程式
function fbtmburlfunction(,$url="",$tmburl="",$where="",$dbname=""){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "".$tmburl."");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),));
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 1); //成功連線伺服器前等時間/秒
curl_setopt ($ch, CURLOPT_TIMEOUT, 100); //超過指令碼將會斷開連線/秒
$boxcurl_exec = curl_exec($ch);
curl_close($ch);
if (preg_match("/URL signature expired/", $boxcurl_exec)){ //比對縮圖是否存在
$fbbox=onlinevideobox($url=$url); //重建爬取縮圖程式
$tmburl=substr(CatchStrfunction($fbbox," img"," alt"),11,-5); //擷取字串
//寫入資料表
$setvar="set tmburl='".$tmburl."' ".$where."";
update($dbname=$dbname,$set=$setvar);
}
}
//指定範圍擷取字串程式
function CatchStrfunction($Str, $StaKey, $EndKey){
$sp=strpos($Str,$StaKey);
$ep=strpos($Str,$EndKey);
$sl=strlen($StaKey);
$el=strlen($EndKey);
$res=substr($Str,$sp,$ep-$sp+$el);
return $res;
}
//重新爬取縮圖程式
function onlinevideobox($url=""){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "https://www.facebook.com/plugins/video.php?href=".$url."");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),));
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$box = curl_exec($ch);
curl_close($ch);
return $box;
}
2、然後再顯示影片縮圖的區塊迴圈前面加上重建縮圖程式(首頁區塊及影片首頁)
//開啟資料區
$dbneme="neilonlinevideocenter"; //資料表名稱
$where2=" ".$DBdata." ".$order." limit ".$options[0].""; //where數值
//重新產生縮圖程式
$Arrboxtop=databasetablewhile($dbneme,$where=$where2);
fbtmburlfunction($width="",$height="",$url=$Arrboxtop[$key]['url'],$type="fr",$img="",$tmburl="".$Arrboxtop[$key]['tmburl']."",$wheretop=" where centerid='".$Arrboxtop[$key]['centerid']."'",$dbname="neilonlinevideocenter");
}
//區塊內容區
$onlinevideocenterArrbox=databasetablewhile($dbneme,$where=$where2);
$onlinevideocenterArrbox=databasetablewhile($dbneme,$where=$where2);
foreach($onlinevideocenterArrbox as $key=> $val){
略...............
}
這樣當USER開啟頁面時,就先執行重新產生縮圖程式,然後判斷FB縮圖是否存在,若已失效則重建,之後寫入資料表再由下一段程式讀取影片資料表開啟迴圈顯示影片縮圖,這樣即使已失效的縮圖USER開啟頁面也會先重新產生縮圖,而不會顯示X。
工作心得撰寫: 徐嘉裕 Neil hsu
留言
張貼留言