Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.07.2020, 13:44
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

PUSH-уведомления НА сервер. Это возможно?
Многие знают, что такое PUSH-уведомления в интернет-браузере. Работу обеспечивает Гугловский механизм Firebase Cloud Messaging. А можно ли сделать PUSH-уведомления не в браузер, а на сервер? Речь, конечно, не о "всплывающих окошках" на сервере, а о неком программном триггере, который должен реагировать на PUSH и запускать какой-то PHP-скрипт.
Другими словами, есть мой сервер, который должен оповещать другие (чужие) сервера. Как это реализовать?

Создавать на чужих серверах web-хуки или делать циклический HTTP-опрос с чужих серверов на мой сервер - плохой вариант.
Есть нюансы:
1. Заранее неизвестен список чужих серверов (они должны как и браузер "подписаться" на PUSH)
2. чужой сервер может находиться внутри локальной сети предприятия и недоступен из мира (но может обращаться в мир)

Не смог найти детальное описание, как работает механизм PUSH в клиентской части - в браузере. Можно было бы попробовать написать аналог для сервера...
Ответить с цитированием
  #2 (permalink)  
Старый 15.07.2020, 14:38
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Vlasenko Fedor Посмотреть сообщение
присмотритесь к WebSockets
Да, эта технология уже известна и работает. Пробовал на PHP-библиотеке SWOOLE - как-то громоздко. Потом написал приложение на Node.JS - работает, но раз в 3 месяца подвисает (и требует открытия портов, которые в сети предприятия могут быть закрыты).
В общем, сейчас думаю про PUSH.

P.S. подозреваю, что Firebase Cloud Messaging тоже работает на сокетах, но информация о протоколе и серверах скрыта.
Ответить с цитированием
  #3 (permalink)  
Старый 16.07.2020, 19:06
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Я придумал гениальную схему . Она безумна, но... это работает!
Можно передать PUSH-уведомление с сервера mysite.com на сервер example.com, который находится в интрасети предприятия и доступ из мира к нему закрыт.
Для этого на компьютере администратора сервера запускаем браузер, который подписываем на PUSH-уведомления с сервера mysite,com
Браузер служит посредником. Таким образом, как только сервер mysite,com отправит пуш, так на сервере example.com сработает необходимый PHP-скрипт.
<?php
// receivepush.php
header('Access-Control-Allow-Origin: *'); // указывает браузеру разрешить запросы из любых источников

// здесь выполняется полезная работа (сохранение в базе и т.п.)

echo '{"answer":"processed"}'; // ответ в браузер на пуш
?>

// инициализация Firebase Cloud Messaging client как описано здесь:
// [url]https://firebase.google.com/docs/cloud-messaging/js/client?authuser=0[/url]
// ...
// ...
var messaging = firebase.messaging();


messaging.onMessage(
 function(payload)
 {
 console.log('onMessage:', payload);


// отправка POST-запроса на сервер:
// пример взят отсюда: [url]https://developer.mozilla.org/ru/docs/Web/API/Fetch_API/Using_Fetch#Тело[/url]
const url = 'https://example.com/receivepush.php';

async function postData(url = '', data = {}) 
{
const response = await fetch(url, 
  {
  method: 'POST',
  mode: 'cors',
  cache: 'no-cache',
  credentials: 'same-origin',
  headers: 
    {
    'Content-Type': 'application/x-www-form-urlencoded' // для обычного POST-запроса
    },
    redirect: 'follow',
    referrerPolicy: 'no-referrer',
   body:data
  });
  return await response.json();
}

postData(url, 'cmd=1&mydata=12345')  // какие-то мои данные (они будут получены из пуша)
 .then((data) => 
  {
  console.log('принят ответ');
  console.log(data);
  });

}
);

// если вкладка браузера закрыта, то обработчик пуша должен быть определен в service worker:
messaging.setBackgroundMessageHandler
(
// аналогично messaging.onMessage()
);
Ответить с цитированием
  #4 (permalink)  
Старый 16.07.2020, 19:34
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Сообщение от Маэстро
2. чужой сервер может находиться внутри локальной сети предприятия и недоступен из мира (но может обращаться в мир)
Сообщение от Маэстро
на компьютере администратора сервера
с таким же успехом можно подключиться напрямую к серверу по websocket с компьютера администратора )
Ответить с цитированием
  #5 (permalink)  
Старый 16.07.2020, 19:56
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от SuperZen Посмотреть сообщение
с таким же успехом можно подключиться напрямую к серверу по websocket с компьютера администратора )
Можно. А смысл? Вебсокетный слушатель на сервере - это не совсем тривиальная задача. К тому же придется открывать нестандартные порты. И про какой Вы говорите сервер: mysite.com или example.com? Если про mysite.com, то его еще и предстоит хорошо защищать от атак по вебсокету. А так Гугл шлет пуши на компьютер и это не нервирует mysite.com; а example.com в локальной сети работает по обычному https на 80-м порту.
И ещё: вкладка в браузере рано или поздно "заснет" (будет выгружена из памяти). Это значит вебсокетное соединение перестанет работать. Пуши при этом сработают.

Последний раз редактировалось Маэстро, 16.07.2020 в 19:58.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баги Opera пишем сюда devote Оффтопик 101 08.08.2013 05:56
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Возможно ли это? white.bear Я не знаю javascript 1 05.01.2011 12:53
Ajax-форма в UI.Dialog возможно ли это??? xela1980 jQuery 0 28.12.2009 23:16
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39