Не могу настроить администраторов для комментариев в фейсбуке

У нас странная проблема на нашем сайте с комментариями в Facebook. Похоже, парсер фейсбука неправильно анализирует (по крайней мере одну из) наших веб-страниц, поэтому администраторы не могут модерировать комментарии.

Если перейти по этой ссылке:

http://www.beliefnet.com/Espanol/10-Atletas-olimpicos-mas-inspiradores.aspx

и просмотреть исходный код, вы увидите, что у нас есть соответствующие теги в заголовке, в том числе один для fb:admins. Если я вхожу в Facebook под этой учетной записью, у меня нет модератора.

Запустив страницу через отладчик объектов facebook, я получаю сообщение об ошибке, что у нас есть метатеги в теле. В частности, эта ошибка:

Meta Tags In Body:  You have tags ouside of your . This is either because 
your was malformed and they fell lower in the parse tree, or you accidentally
put your Open Graph tags in the wrong place. Either way you need to fix it 
before the tags are usable.

Глядя на очищенный URL-адрес внизу этой страницы, я вижу, что похоже на то, что facebook «реорганизовал» наш html и поместил метатеги из заголовка в тело.

Кто-нибудь знает, что вызывает это? Я подумал, что, возможно, у нас где-то на странице был какой-то искаженный HTML-код, из-за которого все сбивалось, но я просмотрел html для этой страницы, и он выглядит хорошо. Есть ли что-то еще, что мне здесь не хватает?


person Mike Corcoran    schedule 07.08.2012    source источник


Ответы (2)


Прохождение вашего URL через validator.w3.org показывает несколько предупреждающих знаков:

Line 77, Column 14: document type does not allow element "noscript" here; assuming missing "object" start-tag
Line 154, Column 699: document type does not allow element "meta" here

Мне удалось сузить (потенциальную) проблему до следующих строк на вашей странице:

document.write('<a href="' + OAS.config.url + 'click_nx.ads/' + OAS.config.sitepage + '/1' + OAS.config.rns + '@' + OAS.config.listpos + '!' + pos + '?' + OAS.config.query + '" target=' + OAS.config.target + '>');
document.write('<img src="' + OAS.config.url + 'adstream_nx.ads/' + OAS.config.sitepage + '/1' + OAS.config.rns + '@' + OAS.config.listpos + '!' + pos + '?' + OAS.config.query + '" border=\"0\" /></a>');

Эти строки document.write() также не проходят валидатор w3.org:

Line 53, Column 197: character "+" is not allowed in the value of attribute "target"

Более того, я считаю неправильным использовать document.write() для вставки DOM (и потому что это может привести к блокировке рендеринга страницы). Можете ли вы перейти на использование объектов js и манипулирование DOM?

После того, как FB получает ваш URL-адрес, он запускает его через анализатор DOM, который, вероятно, задыхается, когда сталкивается с этими строками document.write(). Тот факт, что в этих строках есть элемент ‹a›, охватывающий два document.writes(), вероятно, сбивает синтаксический анализатор. И синтаксический анализатор, вероятно, думает, что достиг «тела» страницы, отсюда и ошибка «Метатеги в теле».

В качестве быстрого теста попробуйте поместить метатег fb:admins над этими строками document.write(). Впрочем, не удивлюсь, если парсер все-таки захлебнется, но попробовать стоит.

Чтобы проверить исходный код html вашей страницы, я использовал простой скрипт, представленный в комментарии в конце этой страницы php.net: http://www.php.net/manual/en/class.domxpath.php

Выдало ошибки:

Unexpected end tag : a in /home/dlee/tmp/tmp.html, line: 54
Unexpected end tag : head in /home/dlee/tmp/tmp.html, line: 183
htmlParseStartTag: misplaced <body> tag in /home/dlee/tmp/tmp.html, line: 184

Где tmp.html — это HTML-код вашей страницы, сохраненный в файл. Строка 54 — это ранее упомянутая строка document.write().

Дайте мне знать, если какой-либо из вышеперечисленных результатов будет выполнен, и я соответствующим образом отредактирую этот ответ.

person Donn Lee    schedule 07.08.2012
comment
спасибо за совет, он действительно поставил меня на правильный путь. см. мой пост для ответа. - person Mike Corcoran; 09.08.2012

так что в конечном итоге проблема заключалась в том, что в голове был вложен <noscript>...</noscript>, который пытался включить пиксель отслеживания для браузеров без включенного javascript, как часть рекламного сервиса, который мы используем.

проблема должна была быть очевидной, глядя на вывод, который Facebook дал нам для «как они видят вашу страницу». тело начинается сразу после скрипта, но непосредственно перед тем, где начинается тег. судя по всему, парсер фейсбука психует, когда видит в голове элемент, который должен быть в теле, поэтому тут же запускает туда тело.

...вывод фейсбука...

        console.log(OAS);
    })();
</script><!-- End OAS Setup --><!-- Begin comScore Tag --><script>
      var _comscore = _comscore || [];
      _comscore.push({ c1: "2", c2: "8428430" });
      (function() {
        var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
        s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
        el.parentNode.insertBefore(s, el);
      })();
    </script>
</head>
<body>
<noscript>

    </noscript>
    <!-- End comScore Tag -->

... наш html...

<head>   
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    <asp:PlaceHolder id="OASHeader" runat="server" />

    <!-- Begin comScore Tag -->
    <script type="text/javascript">
      var _comscore = _comscore || [];
      _comscore.push({ c1: "2", c2: "8428430" });
      (function() {
        var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
        s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
        el.parentNode.insertBefore(s, el);
      })();
    </script>    
    <!-- End comScore Tag -->
    <noscript>
        <img src="http://b.scorecardresearch.com/p?c1=2&c2=8428430&cv=2.0&cj=1" alt="" />
    </noscript>

    <script type="text/javascript">
    ....
    <body>
    ....

поэтому в будущем недопустимые элементы заголовка могут определенно вызывать эту проблему.

person Mike Corcoran    schedule 08.08.2012
comment
Хорошая находка и продолжение! - person Donn Lee; 09.08.2012