互联网视频网站已经成为大家娱乐不可缺少的一部分,博客、微博、SNS都在大量的转发视频链接,如何在用户粘贴的视频网站链接后面增加对应视频的截图显示呢?这里提供我的解决思路和片段PHP代码。

1、如何在文本中获得URL?
获得诸如“http://www.xxx.com/.....”的URL地址,这个可以使用正则式来解决,执行后$urls就是输入$text字符串中找到的全部URL组成的一维数组:

引用自 preg_match_all("/(http:\/\/[a-z0-9:;&#@=_~%\?\/\.\,\+\-]+)/i", $text, $matches);
$urls = $matches[0];


2、如何还原短链接?
在转发中,很多链接都被转换成了短链接,例如视频地址http://www.tudou.com/programs/view/K2xBz5JFBdY/在在转发中被转换成了短地址http://t.cn/hghgjz,一般主要是为了微博节省文字的长度。常见的方法是调用对应短地址的API,还原得到长地址,但是各个短地址提供的方法不一样。短地址实际就是在访问过程中,使用了HTTP 301跳转(Permanently Moved),会在返回的HTTP头中带上真实的地址,使得浏览器可以跳转,这样的话,我们就可以模拟浏览器获得原始地址即可。

片段代码如下,其中$s_url是短地址,$l_url是还原的原始长地址:
引用自 $SHORT_URL = array (
"t.cn",
"url.cn",
"tinyurl.com",
"goo.gl",
......
);

//检查是否是短地址
$found = false;
foreach ($SHORT_URL as $v)
{
$pattern = "/{$v}/i";
if (preg_match($pattern, $s_url, $ret) == 1)
{
$found = true;
break;
}
}

if (!$found)
{
//不是短地址,直接返回
$l_url = $s_url;
}
else
{

//模拟HTTP访问,还原短地址
$u = parse_url($s_url);
$host_ip = gethostbyname($u["host"]);
$host_port = 80;

$request_header = "";
$request_header .= "GET {$u['path']} HTTP/1.1\r\n";
$request_header .= "Host:{$u['host']}\r\n";
$request_header .= "User-Agent: Mozilla/5.0\r\n";
$request_header .= "Accept: */*\r\n";
$request_header .= "Cache-Control: no-cache\r\n";
$request_header .= "Connection: Close\r\n";
$request_header .= "\r\n";
$request_header .= "\r\n";

$fh = fsockopen($host_ip, $host_port);
fputs($fh, $request_header);
$response = "";
while(!feof($fh))
{
$response .= fread($fh, 1);
}
fclose($fh);

if (preg_match("/Location:(.*?)\r\n/i", $response, $ret) != 0)
{
$l_url = rtrim(ltrim($ret[1]));
}

}



3、如何获取原始视频链接对应视频的截图?
常见的视频网站在视频播放页面的源码中都会有对应截图的URL地址,我们只需要打开视频地址,分析源码获取即可,这个就没有统一的方法来实现,例如土豆tudou的视频播放页面源码中看到类似“,thumbnail = 'http://i3.tdimg.com/080/946/236/p.jpg'”的这样一行,这个就是视频对应的截图地址。

片段代码如下,其中$url是视频网站地址,$img_url是对应截图URL地址:
引用自 //构建各个视频网站的截图地址分析正则式,这个需要根据不同网站的情况设定
$VIDEO_SITE = array (
"youku.com" => "/\+0800\|(.*?)\|\">/i",
"ku6.com" => "/<span class=\"s_pic\">(.*?)<\/span>/i",
"tudou.com" => "/thumbnail = '(.*?)'/i",
"56.com" => "/\"img\":\"(.*?)\"/i",
"video.sina.com.cn" => "/pic: '(.*?)'/i",
......
);

//检查是否是视频网站地址
$pattern_img = "";
foreach ($VIDEO_SITE as $k => $v)
{
$pattern_site = "/{$k}/i";
if (preg_match($pattern_site, $url, $ret) == 1)
{
$pattern_img = $v;
break;
}
}

//获得网页源码,分析截图URL
$content = file_get_contents($url);
preg_match($pattern_img, $content, $ret);
$img_url = $ret[1];




最后,由于我们需要连接获取的数据的短地址和视频网站可能访问速度不快,如果有大量重复的URL要处理(例如“我的微博”,展现的是最新20条,所以在一定时间内反复访问的也就是这20条中的URL),所以可以考虑自己做本地缓存,我是采用将短地址和长地址、视频地址和截图地址的对应关系作为二维数组保存,然后serialize保存到缓冲文件,同时考虑了缓冲过期(我设定为7天)删除的刷法,以免累计的旧数据太多,这里就不详细写了。

OK,打完,收工~~~!

标签: , , ,
吹牛苏
2011-06-01 09:16
大侠,你的blog我越来越看不懂了。
差距呀。。。
cry
无为而为 回复于 2011-06-01 12:32
最近少点风花雪夜,呵呵
feidao
2011-05-10 20:48
你在干嘛?搞咩研究?
无为而为 回复于 2011-05-10 20:59
做点小功能,记录备忘一下
分页: 1/1 第一页 1 最后页
发表评论   请注意:本站已经启用评论审核机制,审核通过才能显示!
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称 *   
网址   电邮   [注册]
               

验证码 不区分大小写