Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
comet:chat-with-authorization [2017/07/16 16:56]
levhav
comet:chat-with-authorization [2019/12/18 01:58] (текущий)
Строка 1: Строка 1:
 <​rst>​RU::​12-Примеры::​Как сделать чат</​rst>​ <​rst>​RU::​12-Примеры::​Как сделать чат</​rst>​
 +<​rst>​Header:​ Как сделать чат с авторизацией</​rst>​
  
 ====== Как сделать чат ====== ====== Как сделать чат ======
-В данной статье рассмотрим как сделать чат с авторизацией на php с использованием комет сервера. Наш php chat будет работать по технологии websocket. Для связи php с websocket сервером надо использовать php comet api.+В данной статье рассмотримкак сделать чат с авторизацией на php с использованием комет сервера. Наш php chat будет работать по технологии websocket. Для связи php с websocket сервером надо использовать php comet api.
  
 Первый пример это html скрипт чата для сайта, он будет работать без регистрации пользователей и легко вставится в любую html страницу. Мы его рассмотрим первым по тому что это наиболее простой пример чата использующего комет сервер,​ а затем на его основе напишем чат для сайта на php с авторизацией пользователей в чате и уведомлениями о входе и выходе пользователей. Первый пример это html скрипт чата для сайта, он будет работать без регистрации пользователей и легко вставится в любую html страницу. Мы его рассмотрим первым по тому что это наиболее простой пример чата использующего комет сервер,​ а затем на его основе напишем чат для сайта на php с авторизацией пользователей в чате и уведомлениями о входе и выходе пользователей.
  
-<​note>​В данной статье рассматривается вопрос создания чата где все пользователи общаются в одной общей комнате. Если вам нужен чат для личного общения пользователей между собой (общение в диалогах один на один) то вам больше подойдёт [[comet:​star-comet-chat|чат плагин личной переписки между пользователями]]</​note>​+<​note>​В данной статье рассматривается вопрос создания чатагде все пользователи общаются в одной общей комнате. Если вам нужен чат для личного общения пользователей между собой (общение в диалогах один на один)то вам больше подойдёт [[comet:​star-comet-chat|чат плагин личной переписки между пользователями]]</​note>​
 ====== Пример создания простейшего чата на php ====== ====== Пример создания простейшего чата на php ======
  
 Первое в чём следует разобраться что такое каналы (pipe) в комет сервере. Канал это именованный поток сообщений,​ в который можно самому отправлять сообщения и можно подписаться на те сообщения которые туда отправляются кем то другим. Первое в чём следует разобраться что такое каналы (pipe) в комет сервере. Канал это именованный поток сообщений,​ в который можно самому отправлять сообщения и можно подписаться на те сообщения которые туда отправляются кем то другим.
  
-Если рассматривать наиболее простой скрипт чата для сайта то нам понадобится всего один канал. Все участники подписываются на сообщения из этого канала,​ а для добавления сообщения в чат просто отправляем сообщение в канал.+Если рассматривать наиболее простой скрипт чата для сайтато нам понадобится всего один канал. Все участники подписываются на сообщения из этого канала,​ а для добавления сообщения в чат просто отправляем сообщение в канал.
  
 Вот принцип работы простого чата для сайта Вот принцип работы простого чата для сайта
Строка 19: Строка 20:
 **Примечание:​** В примерах будет использована библиотека JQuery. **Примечание:​** В примерах будет использована библиотека JQuery.
  
-Сначала разберём как работает простой скрипт онлайн чата. Приведу сразу весь код а потом разберём его подробно. +Сначала разберём как работает простой скрипт онлайн чата. Приведу сразу весь кода потом разберём его подробно. 
-Первое что надо отметить это то что в данном чате люди общаются используя только лишь комет сервер. Это имеет ряд недостатков делающий из чата скорее прощёную учебную модель.+Первое что надо отметить это то что в данном чате люди общаютсяиспользуя только лишь комет сервер. Это имеет ряд недостатковделающий из чата скорее прощёную учебную модель.
  
 Недостатки:​ Недостатки:​
Строка 44: Строка 45:
     ​     ​
     <​script>​     <​script>​
 +         // вырезает html теги
 +         ​function strip(html)
 +         {
 +             var tmp = document.createElement("​DIV"​);​
 +             ​tmp.innerHTML = html;
 +             ​return tmp.textContent || tmp.innerText || "";​
 +         }
 +
          // Отправляет сообщение в чат          // Отправляет сообщение в чат
          ​function web_send_msg()          ​function web_send_msg()
Строка 55: Строка 64:
                            
              // Добавление отправленного сообщения к списку сообщений.              // Добавление отправленного сообщения к списку сообщений.
-             ​$("#​WebChatFormForm"​).append("<​p><​b>"​+name+":​ </​b>"​+text+"</​p>"​);​+             ​$("#​WebChatFormForm"​).append("<​p><​b>"​+strip(name)+": </​b>"​+text+"</​p>"​);​
                            
              // Отправка сообщения в канал чата              // Отправка сообщения в канал чата
Строка 72: Строка 81:
                 console.log(msg)                 console.log(msg)
                  // Добавление полученного сообщения к списку сообщений.                  // Добавление полученного сообщения к списку сообщений.
-                 ​$("#​WebChatFormForm"​).append("<​p><​b>"​+msg.data.name+":​ </​b>"​+msg.data.text+"</​p>"​); +                 ​$("#​WebChatFormForm"​).append("<​p><​b>"​+strip(msg.data.name)+": </​b>"​+msg.data.text+"</​p>"​);​
-             }); +
-          +
-             // Подписываемся на канал в который и будут отправляться уведомления о доставке отправленных сообщений. +
-             ​CometServer().subscription("#​web_chat_pipe",​ function(p) +
-             { +
-                console.log(p) +
-                 ​$("#​answer_div"​).html("​Сообщение доставлено "​+p.data.number_messages+"​ получателям. "​+p.data.error);+
              });              });
          });          });
Строка 95: Строка 97:
 Функция web_send_msg отправляет сообщение в чат. Функция web_send_msg отправляет сообщение в чат.
 <code JavaScript>​ <code JavaScript>​
 +     // вырезает html теги
 +     ​function strip(html)
 +     {
 +         var tmp = document.createElement("​DIV"​);​
 +         ​tmp.innerHTML = html;
 +         ​return tmp.textContent || tmp.innerText || "";​
 +     }
 +
      ​function web_send_msg()      ​function web_send_msg()
      {      {
Строка 105: Строка 115:
                    
          // Добавление отправленного сообщения в свой список сообщений.          // Добавление отправленного сообщения в свой список сообщений.
-         ​$("#​WebChatFormForm"​).append("​>p<>b<"​+name+": ​>/b<"​+text+"​>/p<");+         ​$("#​WebChatFormForm"​).append("​<p><b>"+strip(name)+": ​</b>"+strip(text)+"</p>");
                    
          // Отправка сообщения в канал чата.          // Отправка сообщения в канал чата.
Строка 111: Строка 121:
      }      }
 </​code>​ </​code>​
-Здесь можно уточнить что строка:​ $("#​WebChatFormForm"​).append("<​p><​b>"​+name+":​ </​b>"​+text+"</​p>"​);​ добавляет напечатанное сообщение в нашу чат ленту, так чтоб потом было удобно перечитывать сообщения.+Здесь можно уточнить что строка:​ $("#​WebChatFormForm"​).append("<​p><​b>"​+strip(name)+": </​b>"​+strip(text)+"</​p>"​);​ добавляет напечатанное сообщение в нашу чат ленту, так чтоб потом было удобно перечитывать сообщения.
  
 А вот вызов CometServer().web_pipe_send("​web_chat_pipe",​ {"​text":​text,​ "​name":​name});​ производит непосредственно отправку нашего сообщения всем остальным участникам онлайн чата. Первый аргумент это имя канала в который мы отправим сообщение. Второй аргумент это само сообщение,​ содержащие имя отправителя и текст сообщения. А вот вызов CometServer().web_pipe_send("​web_chat_pipe",​ {"​text":​text,​ "​name":​name});​ производит непосредственно отправку нашего сообщения всем остальным участникам онлайн чата. Первый аргумент это имя канала в который мы отправим сообщение. Второй аргумент это само сообщение,​ содержащие имя отправителя и текст сообщения.
Строка 130: Строка 140:
      {      {
          // Добавление полученного сообщения к списку сообщений.          // Добавление полученного сообщения к списку сообщений.
-         ​$("#​WebChatFormForm"​).append("<​p><​b>"​+msg.data.name+":​ </​b>"​+msg.data.text+"</​p>"​); +         ​$("#​WebChatFormForm"​).append("<​p><​b>"​+strip(msg.data.name)+": </​b>"​+strip(msg.data.text)+"</​p>"​);​
-     }); +
-  +
-     // Подписываемся на канал в который и будут отправляться уведомления о доставке отправленных сообщений. +
-     ​CometServer().subscription("#​web_chat_pipe",​ function(p) +
-     { +
-         ​$("#​answer_div"​).html("​Сообщение доставлено "​+p.number_messages+"​ получателям. "​+p.error);+
      });      });
  });  });
Строка 143: Строка 147:
 Здесь вызов <code JavaScript>​CometServer().start({dev_id:​1})</​code>​ выполняет подключение к комет серверу. В качестве dev_id надо передавать свой публичный ключ разработчика. Здесь вызов <code JavaScript>​CometServer().start({dev_id:​1})</​code>​ выполняет подключение к комет серверу. В качестве dev_id надо передавать свой публичный ключ разработчика.
  
-Следующий код назначает функцию обработчик которая будет вызываться каждый раз когда в канал web_chat_pipe будет приходить сообщение. Первый аргумент это имя канала,​ а второй это функция обработчик.+Следующий код назначает функцию обработчиккоторая будет вызываться каждый разкогда в канал web_chat_pipe будет приходить сообщение. Первый аргумент ​– это имя канала,​ а второй ​– это функция обработчик.
  
 <code JavaScript>​ <code JavaScript>​
Строка 149: Строка 153:
  {  {
      // Добавление полученного сообщения к списку сообщений.      // Добавление полученного сообщения к списку сообщений.
-     ​$("#​WebChatFormForm"​).append("<​p><​b>"​+msg.data.name+":​ </​b>"​+msg.data.text+"</​p>"​);​+     ​$("#​WebChatFormForm"​).append("<​p><​b>"​+strip(msg.data.name)+": </​b>"​+strip(msg.data.text)+"</​p>"​);​
  });  });
 </​code>​ </​code>​
Строка 177: Строка 181:
  });  });
 </​code>​ </​code>​
-Здесь первый аргумент это строка в которой первый символ # и за ним имя канала отчёт о доставки сообщения в который мы ждём. В прицепе нет необходимости в обработке отчёта о доставке. Из него мы можем узнать ​сколько людей получили наше сообщение и не возникало ли каких либо ошибок.+Здесь первый аргумент это строка в которой первый символ # и за ним имя канала отчёт о доставки сообщения в который мы ждём. В прицепе нет необходимости в обработке отчёта о доставке. Из него мы можем узнать не возникало ли каких либо ошибок.
  
  
Строка 183: Строка 187:
  
 ===== Как сделать чат с авторизацией ===== ===== Как сделать чат с авторизацией =====
-В предыдущем примере скрипта мини чата каждый может представится любым именем,​ в большинстве случаев на практике ​это не так. По этому рассмотрим как сделать чат с авторизацией. Для этого придётся часть кода чата написать на php.+В предыдущем примере скрипта мини чата каждый может представится любым именем,​ в большинстве случаев на практике ​вам понадобятся функции администрирования для чата чтоб были возможности встроить блокировку пользователей нарушающих правила или отправляющих спам. По этому рассмотримкак сделать чат с авторизацией. Для этого придётся часть кода чата написать на php.
  
 Здесь рабочее [[https://​comet-server.ru/​doc/​example/​5/​|online демо чата с авторизацией]]. ​ Здесь рабочее [[https://​comet-server.ru/​doc/​example/​5/​|online демо чата с авторизацией]]. ​
Строка 191: Строка 195:
   * В момент авторизации отправляется ключ авторизации в комет сервер и пользователю на страницу.   * В момент авторизации отправляется ключ авторизации в комет сервер и пользователю на страницу.
   * Пользователь соединяется с комет сервером по webSocets и передаёт ему свой ключ и id.   * Пользователь соединяется с комет сервером по webSocets и передаёт ему свой ключ и id.
-  * Комет сервер сверяет полученные от пользователя данные с тем что прислал php и если всё верно то авторизация считается пройденной. +  * Комет сервер сверяет полученные от пользователя данные с темчто прислал php иесли всё верното авторизация считается пройденной. 
-  * После авторизации обмен ведётся как и в первом примере чата, но теперь к сообщениям от пользователя комет сервер добавляет id пользователя. +  * После авторизации обмен ведётсякак и в первом примере чата, но теперь к сообщениям от пользователя комет сервер добавляет id пользователя. 
-Всё. Таким образом пользователь не может подделать данные и выбрать чужое имя в чате так как для этого надо знать чужой пароль.+Всё. Таким образомпользователь не может подделать данные и выбрать чужое имя в чатетак как для этого надо знать чужой пароль.
  
 === Код примера чата на php === === Код примера чата на php ===
Строка 201: Строка 205:
 <?php <?php
  
- // Список пользователей,​ вместо базы используется массив чтоб не усложнять пример+ // Список пользователей,​ вместо базы используется массивчтобы не усложнять пример
 $users = Array( $users = Array(
     "​victor"​=>​ Array("​pass"​ => "​qwerty",​ "​id"​ => 1, "​name"​ => "​Виктор"​),​     "​victor"​=>​ Array("​pass"​ => "​qwerty",​ "​id"​ => 1, "​name"​ => "​Виктор"​),​
Строка 256: Строка 260:
     }     }
     ​     ​
-    // Оповещаем всех что залогинился человек и теперь онлайн в чате+    // Оповещаем всехчто залогинился человек и теперь онлайн в чате
     mysqli_query($comet,​ "​INSERT INTO pipes_messages (name, event, message)VALUES('​loginPipe',​ '​userLogin',​ '"​.mysqli_real_escape_string($comet,​json_encode(Array( "​name"​ => $users[$_GET["​login"​]]["​name"​])))."'​)"​); ​   ​     mysqli_query($comet,​ "​INSERT INTO pipes_messages (name, event, message)VALUES('​loginPipe',​ '​userLogin',​ '"​.mysqli_real_escape_string($comet,​json_encode(Array( "​name"​ => $users[$_GET["​login"​]]["​name"​])))."'​)"​); ​   ​
     ​     ​
Строка 322: Строка 326:
     var myName = "<?​php echo $_SESSION["​userName"​];​ ?>";​     var myName = "<?​php echo $_SESSION["​userName"​];​ ?>";​
     ​     ​
 +     // вырезает html теги
 +     ​function strip(html)
 +     {
 +         var tmp = document.createElement("​DIV"​);​
 +         ​tmp.innerHTML = html;
 +         ​return tmp.textContent || tmp.innerText || "";​
 +     }
 +
     // Отправляет сообщение в чат     // Отправляет сообщение в чат
     function web_send_msg()     function web_send_msg()
Строка 332: Строка 344:
  
         // Добавление отправленного сообщения к списку сообщений.         // Добавление отправленного сообщения к списку сообщений.
-        $("#​WebChatFormForm"​).append("<​p><​b>"​+myName+":​ </​b>"​+text+"</​p>"​);​+        $("#​WebChatFormForm"​).append("<​p><​b>"​+strip(myName)+": </​b>"​+strip(text)+"</​p>"​);​
  
         // Отправка сообщения в канал чата         // Отправка сообщения в канал чата
Строка 357: Строка 369:
            }            }
             // Добавление полученного сообщения к списку сообщений.             // Добавление полученного сообщения к списку сообщений.
-            $("#​WebChatFormForm"​).append("<​p><​b>"​+name+":​ </​b>"​+msg.data.text+"</​p>"​);​+            $("#​WebChatFormForm"​).append("<​p><​b>"​+strip(name)+": </​b>"​+strip(msg.data.text)+"</​p>"​);​
         });         });
  
Строка 364: Строка 376:
         {         {
             // Добавление уведомления в ленту сообщений             // Добавление уведомления в ленту сообщений
-            $("#​WebChatFormForm"​).append("<​p>​Пользователь <​b>"​+msg.data.name+"</​b>​ вошол в чат.</​p>"​);​+            $("#​WebChatFormForm"​).append("<​p>​Пользователь <​b>"​+strip(msg.data.name)+"</​b>​ вошол в чат.</​p>"​);​
         });         });
  
Строка 371: Строка 383:
         {         {
             // Добавление уведомления в ленту сообщений             // Добавление уведомления в ленту сообщений
-            $("#​WebChatFormForm"​).append("<​p>​Пользователь <​i>"​+msg.data.name+"</​i>​ покинул в чат.</​p>"​);​+            $("#​WebChatFormForm"​).append("<​p>​Пользователь <​i>"​+strip(msg.data.name)+"</​i>​ покинул в чат.</​p>"​);​
         });            ​         });            ​
         ​         ​
Строка 387: Строка 399:
 Теперь рассмотрим код чата на php подробно:​ Теперь рассмотрим код чата на php подробно:​
  
-Для реализации авторизации в чате на php нам надо иметь базу пользователей,​ и какой то backend для работы с этой базой. Так как это учебный пример,​ и цель примера научить работе с комет сервером,​ то мы вместо хранения логинов и паролей пользователей чата в базе данных mysql зададим массив в котором жёстко пропишем имена и пароли для 5 тестовых пользователей php чата.+Для реализации авторизации в чате на php нам надо иметь базу пользователей,​ и какой-то backend для работы с этой базой. Так как это учебный пример,​ и цель примера научить работе с комет сервером,​ то мы вместо хранения логинов и паролей пользователей чата в базе данных mysql зададим массив в котором жёстко пропишем имена и пароли для 5 тестовых пользователей php чата.
  
 <code php> <code php>
Строка 424: Строка 436:
 } }
 </​code>​ </​code>​
-Когда человек нажимает на ссылку выхода из чата мы уничтожаем сессию и отправляем всем остальным участникам сообщение об этом. Здесь loginPipe это имя канала,​ а userExit это имя события в канале. Для удобства можно через один канал отправлять события с разными именами.+Когда человек нажимает на ссылку выхода из чатамы уничтожаем сессию и отправляем всем остальным участникам сообщение об этом. Здесь loginPipe это имя канала,​ а userExit это имя события в канале. Для удобства можно через один канал отправлять события с разными именами.
  
-<note important>​Следует обратить внимание что канал для уведомлений о попадании в чат называется loginPipe, то есть не содержит префикса "​web_"​ а это означает что в него можно отправить сообщение только через CometQL при наличии секретного ключа разработчика.</​note>​+<note important>​Следует обратить внимание что канал для уведомлений о попадании в чат называется loginPipe, то есть не содержит префикса "​web_"​ а это означаетчто в него можно отправить сообщение только через CometQL при наличии секретного ключа разработчика.</​note>​
  
 === Авторизация пользователей в чате === === Авторизация пользователей в чате ===
Строка 495: Строка 507:
 { {
     // Добавление уведомления в ленту сообщений     // Добавление уведомления в ленту сообщений
-    $("#​WebChatFormForm"​).append("<​p>​Пользователь <​b>"​+msg.data.name+"</​b>​ вошёл в чат.</​p>"​);​+    $("#​WebChatFormForm"​).append("<​p>​Пользователь <​b>"​+strip(msg.data.name)+"</​b>​ вошёл в чат.</​p>"​);​
 }); });
  
Строка 502: Строка 514:
 { {
     // Добавление уведомления в ленту сообщений     // Добавление уведомления в ленту сообщений
-    $("#​WebChatFormForm"​).append("<​p>​Пользователь <​i>"​+msg.data.name+"</​i>​ покинул в чат.</​p>"​);​+    $("#​WebChatFormForm"​).append("<​p>​Пользователь <​i>"​+strip(msg.data.name)+"</​i>​ покинул в чат.</​p>"​);​
 }); });
 </​code>​ </​code>​
Строка 509: Строка 521:
 ===== Сохранение сообщений в бд ===== ===== Сохранение сообщений в бд =====
  
-Если вам надо сохранять сообщения в бд или дополнительно их фильтровать или как то дополнять данными. То вот есть ещё пример чата https://​github.com/​CppComet/​php-chat-example похожий на примеры этой статьи но в нём отправка сообщений идёт не через вызов функции web_pipe_send,​ а через ajax запрос к php скрипту который уже направляет сообщение в комет сервер. Если использовать его то можно вставить свою произвольную обработку сообщений,​ в том числе и их сохранение в файле https://​github.com/​CppComet/​php-chat-example/​blob/​master/​chat.php+Если вам надо сохранять сообщения в бд или дополнительно их фильтровать или как-то дополнять данными. То вот есть ещё пример чата https://​github.com/​CppComet/​php-chat-example похожий на примеры этой статьино в нём отправка сообщений идёт не через вызов функции web_pipe_send,​ а через ajax запрос к php скриптукоторый уже направляет сообщение в комет сервер. Если использовать егото можно вставить свою произвольную обработку сообщений,​ в том числе и их сохранение в файле https://​github.com/​CppComet/​php-chat-example/​blob/​master/​chat.php