使用Facebook Graph API发布嵌入式视频链接

41

在使用 Facebook 网页界面手动添加视频链接(来自 YouTube、Vimeo 等)到帖子时,Facebook 会自动识别该链接为视频,并允许生成的状态消息内联播放该视频。视频将以嵌入式播放器的形式显示在“墙”或“新闻来源”的页面上。


以下是手动发布后嵌入视频的示例。

Embedded Video


使用 Graph API 发布链接时,视频不会被嵌入。

curl -F 'access_token=...' \
     -F 'message=Link to YouTube' \
     -F 'link=http://www.youtube.com/watch?v=3aICB2mUu2k' \
     https://graph.facebook.com/me/feed

未嵌入视频


我猜答案与source参数有关,但我不确定应该在那里放置URL。指定相同的URL只会导致没有任何缩略图图像的帖子。

source: 指向要嵌入帖子的Flash电影或视频文件的URL。 read_stream.

如何仅使用Graph API实现相同的嵌入行为?


图片不可见了,可能它们应该上传到SE。 - Herbert
@Herbert 抱歉,这些图片以前是由 Skitch 托管的,直到 Stack Overflow 开始自己托管图片。我现在没有那些截图的副本了。而且 Skitch(又名 Evernote)已经取消了他们旧的 URL 模式:https://discussion.evernote.com/topic/80874-old-skitch-image-urls-all-broken/。 - Ryan McGeary
7个回答

49

看起来您需要自己从页面中提取实际 swf 的 URL 和缩略图像。例如,以下代码似乎可以实现:

curl -F 'access_token=...' \
     -F 'message=Link to YouTube' \
     -F 'link=http://www.youtube.com/watch?v=3aICB2mUu2k' \
     -F 'source=http://www.youtube.com/v/3aICB2mUu2k' \
     -F 'picture=http://img.youtube.com/vi/3aICB2mUu2k/0.jpg' \
     https://graph.facebook.com/me/feed

看起来你可以从页面 URL 生成有效的源和图片。URL 的格式为 http://www.youtube.com/watch?v=<code>;获取代码(这里是 3aICB2mUu2k),然后将其插入到以下 URL 中:http://www.youtube.com/e/<code> 作为源,http://img.youtube.com/vi/<code>/0.jpg 作为图片。


2
+1,但这不再起作用了。源参数不仅被忽略,而且还使图片参数被忽略。您能否确认我的观察是否正确? - Bozho
5
对于非基于YouTube的视频,怎么办? - user1039205
@PrasannaK,你所说的“页面本身”是什么意思?这不是一个“页面”,而是一个curl调用!你是在暗示其中一个参数应该指向一个包含这些嵌入标签的页面吗?如果是这样,那么应该是哪一个参数呢? - Yevgeny Simkin
我意识到这个答案已经超过一年了,但它不再正确。提供的特定代码作为示例会产生授权错误(这似乎是不正确的,因为我的应用程序有权在墙上发布并成功地使用图像进行了发布)。 - Yevgeny Simkin
@Dr.Dredel页面=被链接的YouTube页面。 - PrasannaK
显示剩余5条评论

6

以下是有关手动发布视频至YOUTUBE和VIMEO的方法(在网上很难找到)。具体来说,如果您想让链接值指向用户的网站/博客帖子,则需要遵循以下步骤:

                //search for youtube.com and vimeo.com in the 'link' value
                if (preg_match("/youtube.com/", $model->link) || preg_match("/youtu.be/", $model->link)){
                    if (preg_match('%(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $model->link, $match))
                    {
                        $video_code = $match[1];
                    }
                   $source = 'http://www.youtube.com/e/'.$video_code; 
               $picture = 'http://img.youtube.com/vi/'.$video_code.'/0.jpg';
                }
                else if (preg_match("/vimeo.com/", $model->link))
                {
                    if (preg_match('/vimeo\.com\/(clip\:)?(\d+).*$/', $model->link, $match))
                    {
                        $video_code = $match[2];
                     }
                    /* Get Vimeo thumbnail */
                    $hash = unserialize(file_get_contents("http://vimeo.com/api/v2/video/$video_code.php"));
                    $picture = $hash[0]['thumbnail_medium'];  
                    $source = 'https://secure.vimeo.com/moogaloop.swf?clip_id='.$video_code.'&autoplay=1';
                }

                $args = array(
                'message'   => //user's comment
                'name' => //Title of post
                'link'      => 'http://...'//link to video on user's website

                'source' => $source,
                'picture' => $picture,
                );

                if ($this->_facebook->api("/".$this->facebookUserID."/feed", "post", $args)){
                //posted to facebook
                }

如果我将嵌入视频的页面的URL放在“link”属性中,那么在Facebook上我会得到一个图像预览而不是视频预览。你真的可以为“source”和“link”设置不同的值吗? - Sulli

4

使用/links而不是/feed作为链接分享方式似乎更有效。 YouTube、Vimeo和Facebook视频会像手动发布一样嵌入。

curl -F 'access_token=...' \
     -F 'message=Link to YouTube' \
     -F 'link=http://www.youtube.com/watch?v=3aICB2mUu2k' \
     https://graph.facebook.com/me/links

非常感谢。经过几天的调查,使用'/me/links'起作用了。 - Jake W
@mindriot 看起来链接 API 现在已经被弃用了... 很遗憾听到这个消息。 - avenet

1
它无法在/feeds或/links中的小组发布中使用。 请点击这里查看。请投票支持该问题,以便尽快解决。
/links是/feeds的副本,仅显示用户自己发布的链接类型帖子。

giorgos,我很感激您发布的答案,但请以后避免使用URL缩短服务。您的帖子有65535个字符的限制,因此没有理由使用URL缩短服务。 - Matt

1
不要使用/feed,而是使用/links(https://graph.facebook.com/me/links/),并使用YouTube /watch?v=ZL7nV7WwJKg URL格式简单地POST“message”和“link”参数。/feed从未为我工作过,它只发布了一个静态图形和链接,但我希望它实际上在Facebook上嵌入播放,就像您将视频从YouTube分享到Facebook时一样。效果非常好。

0

0

相反,尝试将链接作为消息属性发布,这种方式对我有效。

message = your message + link

如果帖子的形式为(文本+链接+文本),则最好将整个内容包含在消息属性中。即使不指定链接=...,它也可以正常工作。 - Devaroop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接