Как отправить сообщение в чате facebook через JAXL?

Я пытаюсь отправить прямое сообщение с JAXL от имени пользователя (аутентифицированное приложение с xmpp_login). В примере чата jaxl facebook есть эхо сообщения структура, по-прежнему перенаправляет полученный XMPPStanza отправителю. Но попытка сгенерировать XMPPStanza для отправки ничего не дает

$client->send($stanza);

вот мой код инициализации XMPPStanza

$stanza = new XMPPMsg(null);
$stanza->from = $client->full_jid->to_string();
$stanza->to = '[email protected]';
$stanza->type = 'chat';
$stanza->body = 'test message';
$client->send($stanza);

Подводя итог, как я могу отправить сообщение с сервера от имени клиента через JAXL?

ИЗМЕНИТЬ

Я забыл упомянуть, что использую JAXL v3, и подумал о добавлении полного кода и конфигурации системы, которые были бы более полезными.

<?php

define('FACEBOOKBOT_PHP', TRUE);


// Include XMPP Engine 'JAXL'
// Path might be alter in time.
// require_once ROOT_DIR.'/JAXL/jaxl.php';
require_once '/var/www/JAXL/jaxl.php';
require_once '/var/www/JAXL/xmpp/xmpp_msg.php';


function sendMessage($client)
{

    //  // $stanza = new XMPPMsg(null);
//  // $stanza->from    = $client->full_jid->to_string();
//  // $stanza->to      = $to;
//  // $stanza->type    = 'chat';
//  // $stanza->body    = 'test message 1';

//  // foreach ($stanza->childrens as $value)
//  // {
//  //  $value->ns = 'jabber:client';
//  // }

//  // $client->send($stanza);

    $msg = new XMPPMsg(array('to'=>'example-user-id-and-it-got-to-work-i-checked-on-below-echo-stanza@chat.facebook.com'), 'test message');
    $client->send($msg);

    _info("test messages sent");
}


$user = 'gokhanbarisaker'; // my user id (www.facebook.com/gokhanbarisaker)
// $user = $argv[1];    // User name or facebook id
$jidSuffix = '@chat.facebook.com';  // Facebook chat account suffix
$appKey = 'example-app-key';    // Taken from developer.facebook.com
// $appKey = $argv[2];  // Facebook app token
$accessToken = 'example-access-token';  // Facebook user token - tried both app token tool on developer.facebook.com and token provided after user login both posses xmpp-login permission
// $accessToken = $argv[3];

$client = new JAXL( array(  // (required) credentials
                            'jid' => $user.$jidSuffix,
                            'fb_app_key' => $appKey,
                            'fb_access_token' => $accessToken,

                            // force tls (facebook require this now)
                            'force_tls' => true,
                            // (required) force facebook oauth
                            'auth_type' => 'X-FACEBOOK-PLATFORM',

                            // (optional)
                            //'resource' => 'resource',

                            'log_level' => JAXL_INFO,
                            'priv_dir'  => '.'
                        ));

$client->add_cb('on_auth_success', function()
{
    global $client;
    _info("got on_auth_success cb, jid ".$client->full_jid->to_string());
    $client->set_status("available!", "dnd", 10);

    // Here is the part where i tried to send message. In addition, i tried to call this function wherever i can on the code.
    sendMessage($client);
});

$client->add_cb('on_auth_failure', function($reason)
{
    global $client;
    $client->send_end_stream();
    _info("got on_auth_failure cb with reason $reason");

});

$client->add_cb('on_chat_message', function($stanza)
{
    global $client;

    // echo back incoming message stanza
    $stanza->to = $stanza->from;
    $stanza->from = $client->full_jid->to_string();
    $client->send($stanza);

    _info("echo message sent");

    sendMessage($client);
});

$client->add_cb('on_disconnect', function()
{
    _info("got on_disconnect cb");
});

$client->start();

echo "done\n";

?>

Конфигурация системы:

  • Ubuntu 12.04.01 LTS
  • Apache 2.2.22
  • PHP 5.3.10

Терминальная команда для выполнения;

  • > php facebookbot.php

person Gökhan Barış Aker    schedule 15.01.2013    source источник


Ответы (2)


Вот несколько вещей, которые вы должны попробовать и посмотреть, помогут ли они вам отладить это:

  1. Установите 'log_level' => JAXL_DEBUG, и проверьте журналы, чтобы узнать, что именно Jaxl отправляет в facebook. Если можете, обновите вопрос исходящей строфой, чтобы мы могли проверить, что здесь действительно не так.
  2. Если вы используете идентификатор facebook для отправки сообщений, помните, что вам нужно отправить сообщение 'to'=>'[email protected]'. Обратите внимание на знак минус.
  3. Facebook довольно умно ловит спамеров в своей сети. Если вы пытаетесь отправить слишком много похожих сообщений за короткое время, серверы facebook ответят боту с соответствующей ошибкой (они даже могут временно отключить вашу учетную запись чата). Проверьте журналы, чтобы узнать, получаете ли вы какой-либо ответ об ошибке от серверов facebook.
person Abhinav Singh    schedule 20.01.2013
comment
Отличная информация. Мне удалось отправить сообщение на идентификатор facebook (по-прежнему не удается отправить на [email protected]). В дополнение к этому, я должен завершить php-скрипт при успешной или неудачной отправке сообщения. Однако я не смог найти для него правильный обратный вызов. Кроме того, иногда facebook отклоняет соединение с ошибкой 111, благодаря JAXL он превосходно обрабатывает повторное соединение с небольшой задержкой. При всех этих возможностях успеха, ошибок и неудач есть ли для этого правильный обратный вызов? - person Gökhan Barış Aker; 21.01.2013
comment
Когда целевой сервер jabber отказал в соединении, обратный вызов 'on_connect_error' запускается с errno и errstr. Однако этот обратный вызов не будет запущен, если errno равно 61, 110, 111, поскольку в таких случаях JAXL выполняет повторную попытку соединения с экспоненциальной стратегией отсрочки. Когда бот JAXL завершает свою работу, непосредственно перед завершением скрипта он запускает 'on_disconnect' обратный вызов, вероятно, это то, что вы ищете. - person Abhinav Singh; 21.01.2013
comment
не мог поймать ошибку или отключить обратный вызов, однако я исправил с помощью sleep (15); выход; после отправки команды сообщения. Я знаю, что это ненадежный патч, но он будет работать до тех пор, пока я не найду способ здорового завершения после отправки сообщения. - person Gökhan Barış Aker; 22.01.2013

пытаться:

$msg = new XMPPMsg(array('to'=>'[email protected]'), 'test message');
$client->send($msg);
person Alex    schedule 18.01.2013
comment
Я все еще не могу отправить с помощью вашего фрагмента кода. Не могли бы вы объяснить дополнительные требования к использованию. Например, должен быть открыт порт 1234 и т. Д. - person Gökhan Barış Aker; 18.01.2013