20,359
社区成员
发帖
与我相关
我的任务
分享
//引入核心文件
require_once './jaxl/jaxl.php';
error_reporting(E_ALL);
//初始化配置
$client = new JAXL(array(
"jid" => "reg",
"host" => "127.0.0.1",
"port" => "5222",
"log_level" => JAXL_DEBUG
));
var_dump($client);
$client->require_xep(array('0077'));
$form = array();
function wait_for_register_response($event, $args) {
global $client, $form;
if ($event == 'stanza_cb') {
$stanza = $args[0];
if ($stanza->name == 'iq') {
$form['type'] = $stanza->attrs['type'];
if ($stanza->attrs['type'] == 'result') {
echo "registration successful" . PHP_EOL . "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
} else if ($stanza->attrs['type'] == 'error') {
$error = $stanza->exists('error');
echo "registration failed with error code: " . $error->attrs['code'] . " and type: " . $error->attrs['type'] . PHP_EOL;
echo "error text: " . $error->exists('text')->text . PHP_EOL;
echo "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
} else {
echo "Error";
}
}
} else {
_notice("unhandled event $event rcvd");
}
}
function wait_for_register_form($event, $args) {
global $client, $form, $regdata; // reg data 為需求資料陣列
$stanza = $args[0];
$query = $stanza->exists('query', NS_INBAND_REGISTER);
if ($query) {
$instructions = $query->exists('instructions');
if ($instructions) {
echo $instructions->text . PHP_EOL;
}
foreach ($query->childrens as $k => $child) {
if ($child->name != 'instructions') {
// 原始 example 的 readline 改寫
$form[$child->name] = $regdata[$child->name];
}
}
// 移除無用欄位
unset($form["x"], $form["name"]);
$client->xeps['0077']->set_form($stanza->attrs['from'], $form);
return "wait_for_register_response";
} else {
$$client->send_end_stream();
return "logged_out";
}
}
// 取得註冊表單
$client->add_cb('on_stream_features', function($stanza) {
global $client, $domain; // $domain 請自行設定全域變數
$client->xeps['0077']->get_form($domain);
return "wait_for_register_form";
});
$client->start();
echo 'OK';
class xmpp {
public function register_user($username, $password) {
require_once './jaxl/jaxl.php';
$this->client = new JAXL(array(
'jid' => 'reg',
'host' => '127.0.0.1',
'port' => '5222',
'log_level' => JAXL_DEBUG
));
// var_dump($this->client);
$this->username = $username;
$this->password = $password;
$this->client->require_xep(array(
'0077' // InBand Registration
));
$thisClassObject = & $this;
$this->client->add_cb('on_stream_features', function($stanza) use(&$thisClassObject) {
$thisClassObject->client->xeps['0077']->get_form('localhost');
return array($thisClassObject, 'wait_for_register_form');
});
$this->client->start();
return;
}
public function wait_for_register_response($event, $args) {
if ($event == 'end_stream') {
return;
} else if ($event == 'stanza_cb') {
$stanza = $args[0];
echo '<pre>';
print_r($stanza);
if ($stanza->name == 'iq') {
if ($stanza->attrs['type'] == 'result') {
echo "registration successful" . PHP_EOL . "shutting down..." . PHP_EOL;
$client->send_end_stream();
return 'logged_out';
} else if ($stanza->attrs['type'] == 'error') {
$error = $stanza->exists('error');
echo "registration failed with error code: " . $error->attrs['code'] . " and type: " . $error->attrs['type'] . PHP_EOL;
echo "error text: " . $error->exists('text')->text . PHP_EOL;
echo "shutting down..." . PHP_EOL;
$client->send_end_stream();
return "logged_out";
}
}
}
}
public function wait_for_register_form($event, $args) {
$stanza = $args[0];
$query = $stanza->exists('query', NS_INBAND_REGISTER);
if ($query) {
$form = array();
$instructions = $query->exists('instructions');
if ($instructions) {
echo $instructions->text . PHP_EOL;
}
$this->client->xeps['0077']->set_form($stanza->attrs['from'], array('username' => $this->username, 'password' => $this->password));
return array($this, "wait_for_register_response");
} else {
$client->send_end_stream();
return "logged_out";
}
}
}
$xmppObj = new xmpp();
var_dump($xmppObj->register_user('user', 'password'));