?

Log in

No account? Create an account

Previous Entry | Next Entry

Решил добавить в свой проект http://bcam.spb.ru возможность комментирования альбомов (страниц сайта). Наиболее удобным и гибким решением посчитал использование фейсбуковского виджета комментариев.

Добавляется всё довольно просто, но есть несколько неочевидных моментов, о которых я бы хотел рассказать.


Идентификатор объекта - что комментируем?

Когда вы добавляете виджет на страницу, то наверняка захотите, чтобы комментарии ассоциировались именно с этой страницей. Для этого там есть такая штука, называемая (в разных местах их документации :) как xid, unique id и еще кое-где ids.
Это строка (т.е. необязательно число) , которая может быть, к примеру, URL'ем вашей страницы. Но есть два момента: 1) обязательно сделайте ей urlencode 2) помните, что url нужно будет привести к единому виду. К примеру, http://bcam.spb.ru/uzbekistan/, http://bcam.spb.ru/uzbekistan/index.html, uzbekistan/index.html , uzbekistan/ и т.п. должны всегда преобразовываться в один и тот же xid="uzbekistan".

Настройка стилей

В документации у Facebook'a об этом нет ни слова (я уже даже не удивляюсь). Но хоть цвета как-то ведь надо привести в соответствие с сайтом! Так что, берём FireBug (меню CSS) или что-нибудь подобное, загружаем любую страницу с виджетом, и смотрим, какие классы за какие элементы виджета отвечают. Смысла их документировать особого нет, т.к. они у них имеют свойство меняться (например, пока я разбирался, они поменяли gray_box на uiBoxGray :)
Можете посмотреть мой CSS, хотя там много лишнего.

Так или иначе, создаём свой .css файлик, и указываем путь к нему в <fb:comments css="yourcss.css" ..>
И да, не забудьте, что css закэшируется, так что по факту вам придётся сделать что-то типа
...  css="yourcss.css?' . rand(0,9999) ...

Помимо цветов, через css можно также избавиться от кнопки Like , которая к комментариям принудительно прилагается: div.like {display:none;}

Странности

Чтобы вы не тратили время на удивление, сразу скажу:

1) Галочка "Publish Feed" ("Добавить комментарий к моему профилю на Facebook") установлена всегда - атрибут publish_feed="0" ни на что не влияет. Снять её можно только в браузере.

2) notify="true" не работает - т.е. никакие уведомления о комментариях никому присылаться не будут.

И то и другое на форумах обсуждают месяцами, так что расслабьтесь - может когда-нибудь починят (если fbml раньше не упразднят ;)

Итак, что у нас получилось?

Что-то типа следующего:

<script src="http://connect.facebook.net/ru_RU/all.js#appId=_id_приложения_&amp;xfbml=1"></script><fb:comments xid="_id_страницы_'" css="yourcss.css?' . rand(0,9999) . '" simple="0" notify="true" publish_feed="0" width="700"></fb:comments></div>

_id_приложения_ - это appid некоего приложения-заглушки, с которым будут ассоциироваться  все комментарии на вашем сайте (и не только - мало ли чего вы еще захотите).
Надо его создать, ввести URL сайта в Web Site / Site URL и посмотреть App ID созданного приложения. См. еще тут

Все опции для fb:comments можно найти здесь http://developers.facebook.com/docs/reference/fbml/comments

Если нужно поменять язык, вместо "ru_RU" пишите, например, "en_US".

Просмотр комментариев

Если у вас 2-3 странички, можно просто на них зайти и посмотреть, чего вам там накомментировали. Но если их сотни, такой вариант, конечно, не годится.

Facebook не предоставляет никакого интерфейса для просмотра всех комментариев.
Но зато у них очень обширный API, и при желании можно вытащить любую информацию, причём даже несколькими способами.
Будем использовать FQL. (на SQL он только похож - нельзя указывать в SELECT большей одной таблицы, и еще много чего нельзя):

require 'inc/facebookclass.php';// новый класс работает только с PHP5!

$facebook = new Facebook(array(
    'appId'  => '_appid_вашего_приложения_',
    'secret' => _secret_вашего_приложения_,
    'cookie' => true,
));

$since = 1;
$app_id = $facebook -> getAppId();

// Внутрь запроса нельзя вставлять переводы строк и другие спецсимволы! Иначе будете долго гадать, что же это за загадочное сообщение об ошибке

$result = $facebook->api(array(
    'method' => 'fql.multiquery',
    'queries' => '{"comments":"SELECT fromid, text, time, id, xid FROM comment WHERE xid IN (SELECT xid FROM comments_info WHERE app_id = ' . $app_id . ' AND updated_time > ' . $since . ') ORDER BY time desc",
    "users":"SELECT id, name, pic_square, url FROM profile WHERE id IN (SELECT fromid  FROM #comments)"}'
));

foreach ($result[0]["fql_result_set"] as $key => $value)
{
    $user =    getUserById($result[1]["fql_result_set"], $value["fromid"]);
    echo($key . ' [' . date("d/m/Y H:i:s",$value["time"]) . ']: <a href="http://bcam.spb.ru/' . $value["xid"] . '">' . 'http://bcam.spb.ru/' . $value["xid"] . '</a> ' . $value["text"] . ' ' . '<a href="' . $user["url"] . '">' . $user["name"] . '</a>' . '<br>');
}//foreach

// Сам знаю, что так не делают :)

function getUserById($raw_user,$id)
{
    foreach ( $raw_user as $k => $v)
        if ($v["id"] == $id) return $v;
}//getUserById


Необязательно использовать FQL. Просто это гибкий способ.
Можно использовать comments.get

Альтернативы?

С практической точки зрения одна - аналогичный виджет ВКонтакта
Он даже кое в чём лучше - можно администрировать все комментарии в одном месте, можно отвечать на комментарии (т.е. ветки образуются).
Основной недостаток - нет такого мощного API, как в Facebook - с доступом ко всем объектам.

Ну и можно, конечно, одновременно оба виджета использовать.

Comments

( 25 comments — Leave a comment )
ext_291415
Oct. 28th, 2010 06:38 pm (UTC)
А что получится, если использовать одновременно оба виджета? Можно будет отвечать вконтактом на фейсбуковские комментарии в виде веток?
cr
Oct. 28th, 2010 10:51 pm (UTC)
Нет. Просто будут два совершенно отдельных блока комментариев.
ext_291415
Oct. 29th, 2010 10:31 am (UTC)
Это плохо, недодумано. Дискуссии не получатся.
Мне больше нравится, как в ЖЖ, когда комментарии пользователей разных типов (родных, OpenID, Facebook, Twitter) нормально совмещаются в общую дискуссию.
cr
Oct. 29th, 2010 07:31 pm (UTC)
Не, ну ты в одну кучу не смешивай виджеты сервисов и интеграцию на сайте комментариев через API этих сервисов.
kolbin
Jul. 4th, 2011 03:43 am (UTC)
я оба использую)
nimoff
Dec. 1st, 2010 10:32 pm (UTC)
подскажите, пжта, при создании приложения на фейсе, он меня просит подтвердить аккаунт через смс. все вбил, но ни ответа, ни привета. а всего-то на сайт хотел комменты поставить =(
cr
Dec. 1st, 2010 11:30 pm (UTC)
Трудно сказать, что там случилось. Бывает, что на некоторые номера просто не приходят сообщения от каких-нибудь сервисов. Может просто снова попробовать?
http://www.facebook.com/mobile/?settings
Или он теперь вообще перестал пускать?
nimoff
Dec. 2nd, 2010 12:01 am (UTC)
спасибо за внимание к моей проблеме

я уж оппробовался
забил и ввел кредитку)

не сочтите за рекламу, но вдруг будет интересно
комменты для фейсбука были нужны для этого моего скромного проекта
точнее для его английской версии http://tosaythanx.com/
Vladimir Dolgov
Apr. 18th, 2011 10:36 am (UTC)
А с новой версией виджета вы разбирались? как получить через FQL комменты новой версии.
cr
Apr. 18th, 2011 01:30 pm (UTC)
С новой версией не разбирался (все откладываю :), но вышепроцитированный код работает как и прежде. Т.е. с точки зрения FQL ничего не поменялось (они вроде и не говорили, что что-то поменяется).
xenologos
Apr. 18th, 2011 03:26 pm (UTC)
жж пометил коммент через FB как спам.. повторю еще раз..

новая форма комментов больше не использует xid, вместо него href
через comment_info можно получить только комментарии от старой формы
не нашел как получить все комментарии для сайта (приложения). Если и можно, то видимо не через FQL.
разработчики предлягают получать комментарии только для определенных url.

Вообщем возникло желание вернуться к старой версии или попробовать разобраться с openid авторизацией.
cr_it
Apr. 18th, 2011 08:05 pm (UTC)
Т.е. вы хотите сказать, что при переходе на новый виджет (установке нового кода на сайт) старые комментарии пропадут?
Просто сейчас у меня стоит старый код и то что писали люди, скажем, 14-го апреля, я могу получать через FQL (проверил только что).
Так или иначе надо разбираться, фейсбуковцы грозились что в начале мая старый виджет проапгрейдится автоматически.

p.s. На e-mail почему-то получил оба коммента, а в ЖЖ вижу только второй, от xenologos..
xenologos
Apr. 19th, 2011 04:05 am (UTC)
По крайней мере, когда я в марте заменил форму, то старые комменты пропали, но их можно получить с помощью вашего кода.
Но я тогда форму делал как описано на FB - добавлением атрибута href, а не использовал migrated=1
при использовании migrated - комментарии в форме остаются.
Сейчас проверил, xid - тоже для новых проставляется..
интересно, что будет, когда откажутся совсем от старой версии..
David Koyava
Apr. 26th, 2011 11:17 am (UTC)
css
Никак не могу разобраться со стилями нового виджета. css="путь_к_стилю" не хочет работать. Подскажите, в чём может быть проблема?
cr_it
Apr. 26th, 2011 11:33 am (UTC)
Re: css
Фейсбук заявляет что в новых виджетах custom css невозможен и что можно только выбирать из вариантов "черный" и "белый". Сам я пока не проверял.
Михаил Жила
Apr. 26th, 2011 06:47 pm (UTC)
скорее всего глупый вопрос, но где посмотреть "Секрет приложения" для комментариев?
cr_it
Apr. 26th, 2011 08:55 pm (UTC)
Учитывая, через какое место в фейсбуке сделан интерфейс, вопрос не очень глупый :)
Во-первых, должно быть создано некое пустое приложение, с которым будут связываться комментарии. Ну и далее идешь в настройки этого приложения на http://www.facebook.com/developers/apps.php?app_id=xxx
(где xxx - id этого приложения) и там прямо написано App Secret (и другие параметры). Туда же можно попасть через http://www.facebook.com/developers/apps.php
Михаил Жила
Apr. 27th, 2011 10:17 am (UTC)
согласен интерфейс жуткий, юзабильность не их конек... а как связать пустое приложение с комментариями?
как то вконтакте все по проще оказалось...
cr_it
Apr. 28th, 2011 12:20 pm (UTC)
Оно само свяжется - за счёт того, что appid в коде вставки комментария будет от этого пустого приложения. Насчёт простоты - если хочется просто вставить комментарии на сайт (т.е. если не нужно их читать из своих скриптов), то по идее никакое приложение заводить не нужно.
David Koyava
Apr. 28th, 2011 11:52 am (UTC)
я не специалист по JS, поэтому у меня возник такой вопрос:
А возможно ли, что после fb:comments подгрузить JS-скрипт в ручную написанный, который и заменит стили на нужные?
cr_it
Apr. 28th, 2011 12:15 pm (UTC)
В новой версии виджета - не знаю. В старой - достаточно просто свой css прописать и всё (в посте я об этом и писал).
liudwp
May. 14th, 2011 10:40 am (UTC)
Скажите, пожалуйста, а в блоггер как-то комментарии фейсбука вставить можно? Я попробовала вставить код, который фейсбук сейчас даёт (там у них не script а frame), этот вид в блоггере не показывает, а простого скрипта я не нашла.

Моих знаний в программировании хватает на то, чтобы скопировать код и прилепить его куда мне надо так что... Ну вот куда деться -вебмастер я там, самая умная :0)))

А, блог в блоггере вот этот www.domashnij.com и заходят люди кто с я.ру, кто с фейсбука, кто с твиттера, а мне хотелось как-то всех "унифицировать" или в крайнем случае предоставить возможность комментировать у нас, а не возвращаться в фейсбук и т.д. и комментировать на моей странице, что мне совсем неинтересно.

И ещё знаете по этому же поводу: в блоггере нельзя в комментарий вставлять картинку или видео как вот тут, в ЖЖ, например. Это решаемо?


kolbin
Jul. 4th, 2011 03:47 am (UTC)
Здравствуйте!
Подскажите, пожалуйста! не знакомо ли Вам простое решения просмотра всех комментариев, как вконтакте, например.)

Коечно, хотелось бы, чтобы и на мыло приходили, но это уже мечты и фантазии)))
geleosan
Nov. 18th, 2011 09:43 am (UTC)
А не знаете как можно посмотреть сразу все комментарии оставленные на сайте?

Поставил тоже такой виджет, и получается, я не знаю, когда и на какую статью появляются комменты.
vseslavd
Nov. 7th, 2014 02:40 pm (UTC)
Добрый день!
Скажите, а можно ли как-то попроще администрировать комментарии в Facebookовском виджете, как в контактовском?
( 25 comments — Leave a comment )