Fb分享不能动态获取og:image。

4
我正在编写一个网站,其中包含多个页面(由用户提交)。这些页面可以通过类似http://www.mywebsite.com/?page=page1http://www.mywebsite.com/?page=page2等的方式访问。我想为每个页面添加一个类似于FB的分享按钮(在内容加载后),以便当他们点击该按钮时,它会在他们的FB上发布该特定页面(以及其图像)。到目前为止,一切都很顺利,直到我遇到了这个问题,让我头疼了两天。有些论坛说open-graph和fb-share存在漏洞,但我仍然希望我的需求是全球通用的,并且必须正常工作。
虽然fb-like和fb-share在共享特定URL方面表现良好,但它们没有选择正确的图像。我可以在头部定义OG元标记,但由于页面通过Ajax动态加载,这些标记可能会发生变化。
我通过jQuery覆盖这些标记og:url和og:image(显示已更新),但我认为fb-share没有读取它们。(或者我该如何测试?)
由于我使用ajax方法,FB调试器工具似乎没有太大帮助,它不显示更新的元标记,而是显示我在头部定义的内容,所以它对我没有太大帮助。如果我在头部硬编码我的值(不依赖于jQuery进行覆盖),那么我的两个页面都可以正常工作,并显示正确的内容、计数和URL,这证实了缓存、标记或我使用的图像都没有问题。但是当我将它们全部组合起来通过JavaScript进行覆盖时,似乎存在断开连接的情况,不确定出现在哪里。
根据我的理解,这是使用jQuery覆盖元标记的问题。此外,我认为fb-share在显示旁边的计数时也没有选择正确的URL。
简而言之,fb-share没有使用新的URL进行覆盖(根据我显示的页面ID),因为它显示所有页面的相同计数(like/share),并且它没有选择覆盖的元标记来显示正确的图片。任何我硬编码的内容都只适用于硬编码的页面。
我的index.php运行如下(请注意,我已经掩盖了网站详细信息和我的FB应用程序)。
<head>
...
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noarchive"/>
<meta name="GOOGLEBOT" content="noarchive"/>
<meta property="fb:app_id" content="4126120410011204"/>
<meta property="fb:admins" content="fbuser1"/>
<meta property="fb:admins" content="fbuser2"/>
<meta property="og:title" content="MYWEBSITE | A website on cloud being tested..."/>
…

</head>

<script>
        $( document ).ready(function() {

           …

           var selProfID = $("#profileID").val();

           if (selfProfID ) { 
             showOneProf(selfProfID);
            }

           function showOneProf(uid) {
             ...
            $.ajax({
            type: "POST",
            url: action.php,
            data: {'pageid' : uid},

            success: function(results)
            {
..          
 $.each(eval(results), function(i,item){


        …
        $('head').append('<meta property="og:url" content="http://www.mywebsite.com/?page='+item.pageid+'" />');
        $('head').append('<meta property="og:image" content="http://www.mywebsite.com/uploads/'+item.image+'" />');
        var linkurl = "http://www.mywebsite.com/?page=page1";

           document.getElementById('fblike2').setAttribute('href', linkurl);
           document.getElementById("fbcomments1").setAttribute('href', linkurl);
           FB.XFBML.parse(document.getElementById('fbc'));
           $("#contents").append(results);
         });
        ..
        });

</script>   

<?php
..

$profid = $_GET['page'];
echo "<input type='hidden' id='profileID' value='$profid'><BR>";

..
<div id='contents'>
<div id="fbc"></div>
<script>
function loadfbComments(){
var elemDiv = document.getElementById("fbc");

    var likes = '<div id="fblike2" class="fb-like" data-href="http://www.mywebsite.com" data-layout="button" data-action="like" data-send="true" data-show-faces="true" data-share="true"></div>';
    var markup = '';
        markup += '<div id="fbcomments1" class="fb-comments" data-colorscheme="light" data-href="http://www.mywebsite.com" data-order-by="reverse" data-num-posts="10" data-width="682" style="margin-top:2em;"></div>';
        elemDiv.innerHTML = "<BR>" + likes + "<BR>" + markup;
        FB.XFBML.parse(elemDiv);
}
loadfbComments();

                </script>
                <script type="text/javascript" src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=09090909090909"></script>
..  
</div>
?>

如果您认为我在这里犯了任何愚蠢的错误,请帮忙指正。非常感谢。

PK


1
Facebook不会在您的网站上执行任何ajax代码,它在页面加载时对源代码进行快照,并使用该快照。 - Jamie Taylor
谢谢,那么我们如何动态更改元标记以满足此类需求,以便每个页面都有自己关联的 fb-share,可以拉取正确的 URL 和图像? - Param
我想你需要用PHP生成og标签,这可能不是你要寻找的解决方案,但Facebook似乎没有其他选择 :( - Jamie Taylor
1个回答

3
正如Jamie在您的帖子评论中提到的那样,Facebook只是向您的网站发出请求并获取其找到的标头信息。Javascript由您的浏览器执行,而不是Facebook所做的简单请求。它只会检索静态元标记,而不是呈现的标记。当您想要使共享图像动态时,应在服务器端执行此操作。
您可以设置类似以下内容:
<meta property="og:image" content="<?= $shareImage ?>" />

谢谢,我测试了这个方法,它也起作用了,但是我不太喜欢将这些值作为查询字符串传递到我的URL中,因为它看起来很丑。通过这种方法,我们能否在用户看不到的情况下实现相同的效果,或者如果我没有清楚地理解您的建议,您能否重新表述一下?感谢您的帮助 :) - Param
不应该出现在URL中。我的意思是你的php脚本应该内部决定使用哪个链接和分享图片。所以,不要使用$('head').append('<meta property="og:image" content="http://www.mywebsite.com/uploads/someimage.jpg" />'),而是可以设置$shareImage = "http://www.mywebsite.com/uploads/someimage.jpg",并将其作为静态元值设置,如上面的帖子所示。 - Scott Finlay
你的页面目前是如何决定在JavaScript代码中放置哪个URL的? - Scott Finlay
我的最后一条回复之后有任何评论吗?我在等待您的帮助..谢谢。 - Param
1
伙计们,我已经破解了它,但没有在这里更新。我做了什么?我只是通过 .htaccess 将所有来自 Facebook 1.1 代理的请求重定向到一个单独的 PHP 脚本中,在头部设置所有这些元标记,除此之外什么也不做。基本上,它模仿了来自 Facebook 的请求会得到一个只有这些开放图形元标记的页面响应。.htaccess 中其余的请求将正常进行。这个方法非常有效。感谢大家一直以来的帮助,让我理解了这个过程。 - Param
显示剩余3条评论

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