Показать сообщение отдельно
  #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()
);
Ответить с цитированием