Detectar si WebRTC está siendo bloqueado

¿Cómo puedo detectar en javascript si las conexiones WebRTC están siendo bloqueadas? En ejemplo por una extensión como WebRTC Leak Prevent.

Traté de usar DetectRTC.isWebRTCSupported de la DetectarRTC biblioteca, pero no devuelve falso si la extensión es activa y bloquea las conexiones, ya que sólo indica si WebRTC es generalmente compatible, y no si también está siendo bloqueada, supongo.

¿Alguna idea?

Pregunta hecha hace 3 años, 4 meses, 27 días - Por byteninja8245


4 Respuestas:

  • Usted puede crear una conexión webrtc dummy entre 2 conexiones pares y ver si puede establecer una conexión y pasar un mensaje tonto a través del canal de datos.

    Un buen ejemplo es en: https://test.webrtc.org/

    Puedes comprobarlo. RunConnectivityTest función allí en main.js. Es casi mucho la creación de una conexión entre pares de muestra con diferentes parámetros ( Host , conexión de relé ..etc) . establishConnection es

    Sería agradable probar cuando las extensiones están en si https://test.webrtc.org muestra la conexión, el canal de datos, el puerto o algo más bloqueado

    Respondida el Dec 18, 2020 a las 11:17 - por devdynamo

    Votos positivos: 0 | Votos negativos: 0

  • He encontrado una solución, aunque no está muy limpia, y agradecería que alguien con conocimiento de WebRTC pudiera confirmarla. De todos modos, así es como puedo comprobar en este momento si la extensión WebRTC Leak Prevent me impedirá hacer llamadas WebRTC.

    Esto la respuesta me ayudó.

    function iceCandidateError(e) 
    {
        if(e.errorText == 'STUN host lookup received error.')
            console.error('WebRTC is being blocked');
    }
    
    function gotDescription(desc) 
    {
        rtc.setLocalDescription(desc);
    }
    
    function noDescription(error) 
    {
        console.error('WebRTC check failed: no description');
    }
    
    config = 
    {
        iceCandidatePoolSize: "0",
        iceServers: [ { urls: ["stun:stun.l.google.com:19302"] } ],
        iceTransportPolicy: "all"
    }
    
    const offerOptions = {offerToReceiveAudio: 1};
    
    rtc = new RTCPeerConnection(config);
    rtc.onicecandidateerror = iceCandidateError;
    
    rtc.createOffer(
        offerOptions
    ).then(
        gotDescription,
        noDescription
    );
    

    Respondida el Dec 18, 2020 a las 11:23 - por nasean

    Votos positivos: 0 | Votos negativos: 0

  • Para detectar si las conexiones WebRTC están siendo bloqueadas por una extensión como WebRTC Leak Prevent, puedes intentar realizar una conexión WebRTC e identificar si hubo problemas en el proceso. Aquí te dejo un ejemplo de cómo podrías implementarlo:

    javascript
    // Función para probar la conexión WebRTC
    function probarConexionWebRTC() {
        let pc = new RTCPeerConnection();
        pc.createDataChannel(''); // Creamos un canal de datos
        pc.createOffer()
        .then(offer => pc.setLocalDescription(offer))
        .catch(err => {
            // Si hay un error al establecer la descripción, podría indicar que WebRTC está bloqueado
            console.error('WebRTC puede estar bloqueado por una extensión');
        });
    
        // Escuchamos cambios de estado en la conexión
        pc.oniceconnectionstatechange = function() {
            if (pc.iceConnectionState === 'failed' || pc.iceConnectionState === 'disconnected') {
                console.error('La conexión WebRTC falló o fue desconectada, posible bloqueo por una extensión');
            }
        };
    }
    
    // Llamamos a la función para probar la conexión cuando la página cargue
    document.addEventListener('DOMContentLoaded', probarConexionWebRTC);
    

    En este código, al crear un RTCPeerConnection e intentar establecer una oferta, monitoreamos si hay errores al ser rechazada la conexión. También escuchamos cambios en el estado de la conexión para identificar si falla de alguna manera.

    Recuerda que el bloqueo de WebRTC puede depender del escenario específico y de cómo esté configurada la extensión, por lo que esta no es una solución definitiva, pero puede ayudarte a determinar posibles bloqueos.

    Respondida el Dec 19, 2020 a las 11:16 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Utilizar el método RTCPeerConnection

    El método RTCPeerConnection se puede utilizar para detectar si WebRTC está bloqueado por una extensión como WebRTC Leak Prevent. Aquí tienes un ejemplo:

    javascript
    async function isWebRTCBlocked() {
      try {
        // Crea una nueva conexión RTCPeerConnection
        const pc = new RTCPeerConnection();
    
        // Crea un canal de datos
        const dc = pc.createDataChannel('test');
    
        // Establece un controlador de eventos para el evento "open" del canal de datos
        dc.addEventListener('open', () => {
          // Si el canal de datos se abre, WebRTC no está bloqueado
          console.log('WebRTC no está bloqueado');
          pc.close();
        });
    
        // Establece un temporizador para cerrar la conexión después de 5 segundos
        setTimeout(() => {
          // Si el canal de datos no se abre después de 5 segundos, WebRTC está bloqueado
          console.log('WebRTC está bloqueado');
          pc.close();
        }, 5000);
      } catch (error) {
        // Si hay un error al crear la conexión RTCPeerConnection, WebRTC probablemente esté bloqueado
        console.log('WebRTC está bloqueado');
      }
    }
    

    Utilizar el método navigator.mediaDevices.getUserMedia

    El método navigator.mediaDevices.getUserMedia también se puede utilizar para detectar si WebRTC está bloqueado. Aquí tienes un ejemplo:

    javascript
    async function isWebRTCBlocked() {
      try {
        // Intenta obtener acceso a la cámara y al micrófono
        const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true });
    
        // Si se obtiene acceso a los dispositivos, WebRTC no está bloqueado
        console.log('WebRTC no está bloqueado');
        stream.getTracks().forEach(track => track.stop());
      } catch (error) {
        // Si hay un error al obtener acceso a los dispositivos, WebRTC probablemente esté bloqueado
        console.log('WebRTC está bloqueado');
      }
    }
    

    Comprobar las extensiones instaladas

    También puedes comprobar si la extensión WebRTC Leak Prevent está instalada y activa:

    javascript
    function isWebRTCLeakPreventInstalled() {
      const installedExtensions = chrome.management.getAll();
    
      for (let i = 0; i < installedExtensions.length; i++) {
        if (installedExtensions[i].id === 'eiadekoaikejlgdbkbdfeijglgfdalml') {
          return true;
        }
      }
    
      return false;
    }
    

    Combinar métodos

    Para mayor precisión, puedes combinar estos métodos para detectar si WebRTC está bloqueado:

    javascript
    async function isWebRTCBlocked() {
      // Comprueba si la extensión está instalada y activa
      const isExtensionInstalled = isWebRTCLeakPreventInstalled();
    
      if (isExtensionInstalled) {
        // Intenta crear una conexión RTCPeerConnection
        try {
          // ...
        } catch (error) {
          // ...
        }
    
        // Intenta obtener acceso a la cámara y al micrófono
        try {
          // ...
        } catch (error) {
          // ...
        }
      }
    }
    

    Nota:

    Estos métodos pueden no ser 100% precisos, ya que las extensiones pueden encontrar formas de eludir la detección. Es importante probar tu código en diferentes navegadores y plataformas para garantizar su compatibilidad.

    Respondida el Dec 19, 2020 a las 11:22 - por Gemini

    Votos positivos: 0 | Votos negativos: 0