• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Fork me on GitHub
            隨筆 - 215  文章 - 13  trackbacks - 0
            <2016年1月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456


            專(zhuān)注即時(shí)通訊及網(wǎng)游服務(wù)端編程
            ------------------------------------
            Openresty 官方模塊
            Openresty 標(biāo)準(zhǔn)模塊(Opm)
            Openresty 三方模塊
            ------------------------------------
            本博收藏大部分文章為轉(zhuǎn)載,并在文章開(kāi)頭給出了原文出處,如有再轉(zhuǎn),敬請(qǐng)保留相關(guān)信息,這是大家對(duì)原創(chuàng)作者勞動(dòng)成果的自覺(jué)尊重!!如為您帶來(lái)不便,請(qǐng)于本博下留言,謝謝配合。

            常用鏈接

            留言簿(1)

            隨筆分類(lèi)

            隨筆檔案

            相冊(cè)

            Awesome

            Blog

            Book

            GitHub

            Link

            搜索

            •  

            積分與排名

            • 積分 - 216865
            • 排名 - 118

            最新評(píng)論

            閱讀排行榜

            來(lái)自 Csdn https://blog.csdn.net/nassue_sn

            XMPP相關(guān)資料:https://blog.csdn.net/nassue_sn/article/category/6635474
            Ejabberd相關(guān)資料:https://blog.csdn.net/nassue_sn/article/category/6601126


            群聊離線(xiàn)消息實(shí)現(xiàn):http://www.cnblogs.com/lovechengcheng/p/4083398.html

            簡(jiǎn)單集群搭建:https://blog.csdn.net/yongche_shi/article/details/52956125

            C#連接ejabberd2.1.x —— agsxmpp
            注冊(cè)新賬戶(hù)方法:(偽碼)

                        XmppClientConnection xmppCon;
                        xmppCon.RegisterAccount = true; // 設(shè)為true代表是新用戶(hù)注冊(cè)
                        xmppCon.OnRegistered += (sender) => {
                            // 新用戶(hù)注冊(cè)成功
                        };
                        xmppCon.OnRegisterError += (sender, e) => {
                            // 老用戶(hù)重復(fù)注冊(cè)
                        };
                        xmppCon.Open();

























            ----------------------------------------- 下方內(nèi)容因版本不匹配暫時(shí)廢棄 --------------------------------------------------


            PHP通過(guò)xmlrpc注冊(cè)ejabberd用戶(hù)

            http://www.bubuko.com/infodetail-551255.html

            正在研發(fā)一款社交軟件,架構(gòu)im使用了ejabberd作為xmpp服務(wù)器,于是遇到了如何通過(guò)php注冊(cè)xmpp用戶(hù)的問(wèn)題。
            解決方法有幾個(gè):
            1.用xmpphp框架發(fā)送含<body>元數(shù)據(jù)的消息到服務(wù)器要求處理,這個(gè)可參考:http://blog.csdn.net/newjueqi/article/details/7864066
            //1、測(cè)試文件 adduser.php

            include_once './XMPPHP/XMPP.php';

            $conn = new XMPPHP_XMPP($host, 5222, $xmppUserName$xmppPassword,  'xmpphp', 'svn.zhaoduila.net', false);

            try {
                $conn->connect();

                //發(fā)送好友請(qǐng)求、發(fā)送消息、刪除好友   需要以下兩行
                $conn->processUntil('session_start');
                $conn->presence();


                //添加用戶(hù) 
            //    $conn->registerNewUser($xmppUserName, $xmppPassword, $email);

                //發(fā)送消息 
            //    $conn->message('liuruikang1@svn.zhaoduila.net', 'This is a test message!');

                //發(fā)送好友請(qǐng)求
            //    $conn->addRosterContact($jid, $name);

                //刪除好友

                $conn->deleteRosterContact($jid);

                $conn->disconnect();


            catch (XMPPHP_Exception $e) {
                die($e->getMessage());
            }

            //2、我是直接把方法追加到  XMPP.php  文件中的

            /**
              * Register a new user.
              *
              * @param $entity
              * Entity we want information about
              
            */
              public function registerNewUser($username$password = NULL$email){
                if (!isset($password))
                    $password = $this->genRandomString(15);

                $id = 'reg_' . $this->getID();
                $xml = "<iq type='set' id='$id'>
                            <query xmlns='jabber:iq:register'>
                                <username>" . $username . "</username>
                                <password>" . $password . "</password>
                                <email>" . $mail . "</email>
                                <name></name>
                            </query>
                        </iq>";
                $this->addIdHandler($id, 'register_new_user_handler');
                $this->send($xml);
              }


              /**
              * Handler for new user registration
              *
              * @param XML Object $xml
              
            */
              public function register_new_user_handler($xml){
                      //dpm($xml);
                      //var_dump($xml);

                      switch ($xml->attrs['type']) {
                        case 'error':
                          $this->event('new_user_registered', 'error');
                          break;
                        case 'result':
                            // dpm($xml->subs);
                            $query = $xml->sub('query');
                            $username='';
                            $password='';
                            if(!is_array($query->subs)) {
                                foreach ($query->sub as $key => $value) {
                                    switch ($value->name) {
                                        case 'username':
                                            $username = $value->data;
                                            break;

                                        case 'password':
                                            $password = $value->data;
                                            break;
                                    }
                                }
                            }
                            $this->event('new_user_registered', array('jid' => $username . "@{$this->server}", 'password' => $password));
                        default:
                            $this->event('new_user_registered', 'default');
                    }
              }

              /**
               * Add contact to your roster
               
            */
              public function addRosterContact($jid$name$groups = array()){
                  // return if there is no jid specified
                  if(!$jidreturn;
                  // set name to the jid if none is specified
                  if (!$name) { $name = $jid; }
                  $id = $this->getID();
                  $xml = "<iq type='set' id='$id'>";
                  $xml .= "<query xmlns='jabber:iq:roster'>";
                  $xml .= "<item jid='$jid' name='$name'>";
                  foreach ($groups as $group) {
                          $xml .= "<group>$group</group>";
                  }
                  $xml .= "</item>";
                  $xml .= "</query>";
                  $xml .= "</iq>";
                  $xml .= "<presence to='" . $jid . "' type='subscribe'/>";
                  $this->addIdHandler($id, 'add_roster_contact_handler');
                  $this->send($xml);
              }

              /**
              * @param XML Object $xml
              
            */
              protected function add_roster_contact_handler($xml) {
                // do anything you wish here
                $this->event('contact_added');
              }

              /**
              *
              * @param $jid
              *       Contact you wish to remove
              
            */
             
              public function deleteRosterContact($jid) {
                $id = $this->getID();
                $xml = "<iq type='set' id='$id'>";
                $xml .= "<query xmlns='jabber:iq:roster'>";
                $xml .= "<item jid='" . $jid . "' subscription='remove' />";
                $xml .= "</query>";
                $xml .= "</iq>";
                $this->addIdHandler($id, 'delete_roster_contact_handler');
                $this->send($xml);
              }

              /**
              *
              * @param XML Object $xml
              
            */
              protected function delete_roster_contact_handler($xml) {
                // do any handling you wish here
                $this->event('contact_removed');
              }


                  function genRandomString($length){
                    $str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
                    $len=strlen($str)-1;
                    $randstr='';
                    for($i=0;$i<$length;$i++){
                        $num=mt_rand(0,$len);
                        $randstr .= $str[$num];
                    }
                    return $randstr;
                  }
            2.使用php的xmpp庫(kù)jaxl,其demo代碼中包含一個(gè)register_user的腳本,通過(guò)shell調(diào)用:
            php example/register_user.php YOUR_DOMAIN
            即可生成用戶(hù),缺點(diǎn)是性能較差且慢,不建議
            3.最優(yōu)方法是使用ejabberd自帶的命令行工具ejabberdctl來(lái)直接生成用戶(hù)。網(wǎng)上的回答基本是通過(guò)修改sudo用戶(hù)組權(quán)限來(lái)直接在php使用exec語(yǔ)句來(lái)執(zhí)行此命令
            $username = ‘tester‘;
            $password = ‘testerspassword‘;
            $node = ‘myserver.com‘;
            exec(‘sudo /usr/sbin/ejabberdctl register ‘.$username.‘ ‘.$node.‘ ‘.$password.‘ 2>&1‘,$output,$status);
            if($output == 0)
            {
                // Success!
            }
            else
            {
                // Failure, $output has the details
                echo ‘<pre>‘;
                foreach($output as $o)
                {
                    echo $o."\n";
                }
                echo ‘</pre>‘;
            }
            需要在sudoer文件中添加ejabberd用戶(hù)權(quán)限,相對(duì)不安全也比較麻煩,也不推薦。
            4.其實(shí)ejabberd在最近的版本中已經(jīng)集成了xmlrpc模塊,通過(guò)該模塊可直接訪(fǎng)問(wèn)4560端口使用ejabberd的一些內(nèi)部命令。官網(wǎng)介紹地址:https://www.ejabberd.im/ejabberd_xmlrpc
            修改ejabberd.yml配置文件:

            listen:
              -
                port: 4560
                ip: "::"
                module: ejabberd_xmlrpc
                access_commands:
                  xmlrpc_access:
                    commands: all
                    options: []

            ..

            commands_admin_access: xmlrpc_access

            ..

            access_rules:
              xmlrpc_access:
                - allow: xmlrpc_acl

            ..

            api_permissions:
              "console commands":
                from:
                  - ejabberd_ctl
                who: all
                what: "*"
              "admin access":
                who:
                  - access:
                      - allow:
                        - acl: loopback
                        - acl: all
                  - oauth:
                    - scope: "ejabberd:admin"
                    - access:
                      - allow:
                        - acl: loopback
                        - acl: all

            重啟后 telnet HOST地址 4560 看能否接通,即說(shuō)明xmlrpc已經(jīng)可以用了:
            關(guān)于php端的代碼在介紹地址中已有提及,以下是php通過(guò)ejabberdctl注冊(cè)一個(gè)用戶(hù)的demo的代碼:
            $params=array('user'=>'someUser','host'=>'ejabberdHost','password'=>'somPassword');
            $request = xmlrpc_encode_request('register', $params, (array('encoding' => 'utf-8')));

            $context = stream_context_create(array('http' => array(
                'method' => "POST",
                'header' => "User-Agent: XMLRPC::Client mod_xmlrpc\r\n" .
                "Content-Type: text/xml\r\n" .
                "Content-Length: ".strlen($request),
                'content' => $request
                )));

            $file = file_get_contents("http://127.0.0.1:4560", false$context);

            $response = xmlrpc_decode($file);

            if (xmlrpc_is_fault($response)) {
                trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
            else {
                print_r($response);
            }
            打印后即生成注冊(cè)成功的結(jié)果
            Have a nice try! :)

            Linux安裝php-xmlrpc擴(kuò)展:
            cd php-5.4.16/ext/xmlrpc
            /usr/local/php/bin/phpize
            ./configure --with-php-config=/usr/local/php/bin/php-config --with-xmlrpc=shared --with-libxmlrpc=/usr/local
            make
            make install

            添加到php.ini擴(kuò)展即可

            更多參考:
            https://github.com/processone/ejabberd/issues/1231
            https://github.com/processone/ejabberd/issues/1749
            https://github.com/processone/ejabberd/issues/1568
            https://bugs.php.net/bug.php?id=19124
            https://www.ejabberd.im/ejabberd_xmlrpc/
            https://blog.csdn.net/kenkao/article/details/53333595
            https://blog.csdn.net/u012930316/article/details/55251903

            https://www.cnblogs.com/--00/p/erlang_into_style.html
            posted on 2019-02-12 09:34 思月行云 閱讀(945) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Erlang
            午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久精品成人免费国产片小草| 国产精品一区二区久久| 久久久久久久尹人综合网亚洲| 久久国产午夜精品一区二区三区| 免费精品久久天干天干| 久久国产精品77777| 国产精品熟女福利久久AV| 久久妇女高潮几次MBA| 亚洲国产精品婷婷久久| 国产美女亚洲精品久久久综合| 伊人久久大香线焦综合四虎| 精品久久人人爽天天玩人人妻| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 99久久国产免费福利| 性欧美大战久久久久久久久 | 久久精品国产一区二区电影| 久久午夜伦鲁片免费无码| 久久久久久亚洲精品不卡 | 久久精品?ⅴ无码中文字幕| 久久99国产综合精品| 国产精品久久久久久久久久影院 | 亚洲综合精品香蕉久久网97| 亚洲中文字幕久久精品无码APP | 狠狠88综合久久久久综合网| 无码八A片人妻少妇久久| 久久久99精品成人片中文字幕| 99久久精品国产一区二区| 精品久久久久久久久午夜福利| 亚洲国产精品成人久久| 一本色道久久综合亚洲精品| 久久久久久久久久久| 中文字幕无码久久人妻| 亚洲国产日韩欧美久久| 人妻精品久久久久中文字幕| 久久婷婷五月综合97色直播| 久久亚洲2019中文字幕| 久久人人爽人人爽人人片AV麻豆| 日本欧美国产精品第一页久久| 亚洲精品无码久久久久AV麻豆| 中文精品99久久国产 |