Bloquear anuncios de Youtube en Pi-hole

Si estas usando Pihole 5.0, debes usar la version 3.0 del script, mas info aquí: Youtube Ads Blocker 3.0 para Pihole 5.0

Imagen 1. Pi-Hole y Raspberry Pi

Ya llevo más de un mes usando la Raspberry Pi con Pi-hole, y la verdad que no puedo estar más contento, Pihole ha estado funcionando sin parar desde entonces, y al igual que mi Raspberry no ha tenido ningún problema. El único inconveniente que me he encontrado a día de hoy han sido los anuncio de YouTube, los cuales han sido prácticamente imposibles de bloquear del todo. Hace poco he hecho una pequeña investigación de los subdominios que genera Google para los anuncios de YouTube, y estos tienen el siguiente formato:

r1---sn-4g57kn7d.googlevideo.com

Leyendo varios foros he visto que hay algunas personas que han generado listas publicas con estos cientos de estos subdominios, sin embargo, en mi caso, esas listas no me han servido de nada ya que desde el apartado “Query log” de Pi-Hole pude ver que los subdominios consultados con los anuncios eran muy diferentes de los que estaban en estas listas. 

Por lo tanto decidí  buscar a nivel de linea de comandos todos los subdominios de googlevideo.com que tuviesen un parecido con los que aparecían en esas listas. Con la siguiente secuencia de comandos pude sacarlos:

cat /var/log/pihole.log | egrep "r([0-9]{1,2}).*\.googlevideo\.com" | awk '{print $8}' | sort | uniq

El fichero pihole.log contiene todas las consultas DNS realizadas, si creamos una expresión regular como la que va después del pipe conseguimos obtener todos los subdominios consultados via DNS. Teniendo la salida del comando anterior lo podemos redirigir al fichero /etc/pihole/blacklist.txt, todos los cambios realizados en este fichero tienen efecto inmediato y pueden visualizarse acto seguido en el apartado:

Imagen 2. Pi-Hole: Blacklist

Con ello concluimos que si cargamos un video en YouTube, vemos un anuncio, y acto seguido sacamos el subdominio desde el cual se esta cargando dicho anuncio y lo metemos en la blacklist, dejaremos de ver cualquier anuncio que se nos sirva desde el susodicho subdominio.

SCRIPT EN BASH

Con esa idea de funcionamiento creé un script en bash para bloquear los anuncios de YouTube, el funcionamiento es el siguiente:

  • El script se puede instalar como servicio con la opción: install.
  • Durante la instalación el script copia todos los logs de Pi-Hole ubicados en /var/log y los lleva a /tmp
  • Allí los descomprime y con la expresión regular anterior, saca todos los subdominios de googlevideo.com que alguna vez hayas consultado. 
  • Todos los subdominios los añade al fichero /etc/pihole/blacklist.txt
  • Si tras la instalación ejecutamos: systemctl start ytadsblocker el script empezará a trabajar como un servicio y cada 4 minutos comprobará el fichero /var/log/pihole.log en busca de subdominios de googlevideo.com y si encuentra uno nuevo lo añadirá al fichero blacklist.txt
  • En el fichero /var/log/ytadsblocker.log se guardarán todos los subdominios nuevos que se añadan.

Desde que tengo el script funcionando no he tenido ningún problema y tengo menos anuncios en todos los dispositivos móviles de mi red. Si tuviese algún problema con ello, ya volveré por aquí para actualizar la entrada.

Por si interesa, el código fuente del script lo puedes encontrar en mi GitHub,  o por si quieres añadir algo que se me haya pasado. 

INSTALACIÓN DEL SCRIPT

La instalación es realmente sencilla, para descargar el script ejecutamos:

git clone https://github.com/deividgdt/ytadsblocker.git

A continuación accedemos a la carpeta ytadsblocker y le damos permisos de ejecución al script:

cd ytadsblocker
chmod a+x ytadsblocker.sh

Lanzamos el script con el parametro ‘install’ :

./ytadsblocker.sh install

Con esto ya tendriamos el servicio creado, por lo que solo deberiamos arrancarlo:

systemctl start ytadsblocker

¡Si te he ayudado y estas agradecido siempre puedes invitarme a un café!

58 comentarios sobre “Bloquear anuncios de Youtube en Pi-hole

  1. Hola de nuevo Deivid, creo que lo he resuelto, no se si de la manera más elegante pero funciona:
    He modificado en tu script en la linea 94, la de la sentencia del INSERT y la he dejado así:
    sqlite3 “${GRAVITYDB}” “””INSERT or IGNORE INTO domainlist (type, domain, comment) VALUES (1, ‘${DOMAIN}’, ‘Blacklisted by ytadsblocker’);””” 2>> $YTADSBLOCKER_LOG
    Parece que ahora ya ha metido la lista d edominios bien
    Mil gracias 😉

    1. Gracias Juanmi. Si, es una buena solución, lo que pasa es que no he sido capaz de reproducir ese fallo para poder evitarlo. Le daré una vuelta más.

      Gracias por tu solución, si tienes Github, puedes crear un pull request para modificar el script.

      Un saludo,

    2. Buenas, Juanmi,

      Acabo de publicar una nueva versión del script para poder ejecutarlo en un entorno Docker y he aprovechado para añadir tu correción.

      Gracias.

      Un saludo,

  2. Gracias Deivid!!! Muy buen curro 😉
    Me da un error en el log como al compi Trasgu82:
    Error: UNIQUE constraint failed: domainlist_by_group.domainlist_id, domainlist_by_group.group_id
    La versión que tengo del script es la 3.3 y de Pihole la 5.1.2
    Gracias de nuevo 😉

  3. Buenas, excelente trabajo Deivid! No obstante de unos días a esta parte estoy observando un error en el log cuando intenta actualizar las direcciones. Por lo visto no detecta una dirección duplicada y la intenta insertar igualmente:
    [2020-08-03 12:23:19] Youtube Ads Blocker Started
    [2020-08-03 12:23:19] Checking /var/log/pihole.log…
    [2020-08-03 12:23:20] New subdomain to add: r1.sn-4g5ednld.googlevideo.com
    […]
    [2020-08-03 12:23:24] New subdomain to add: r6.sn-h5q7dnld.googlevideo.com
    [2020-08-03 12:23:24] Updating database…
    Error: UNIQUE constraint failed: domainlist_by_group.domainlist_id, domainlist_by_group.group_id
    Alguna solución? Muchas gracias!

      1. Muchísimas gracias Deivid, cualquier cosa que pueda aportarte para facilitarte la búsqueda sólo tienes que decirlo…

        Como info adicional te indico que una vez que salta el error el servicio deja de funcionar. Tras reiniciar la raspberry el servicio se inicia con normalidad, ejecuta el script, vuelve a aparecer el error y nuevamente se queda el servicio en fallo.

        Saludos,

      2. Buenas Trasgu82,

        Me podrías indicar que grupos tienes creados en pihole? Miralo en Group Management > Groups.

        Un saludo,

  4. Hola,
    te cuento mi pequeña historia, tengo instalado pihole 4.4 sobre un docker, que está funcionando sobre un libreelec, lo que me está complicando la instalación de tu script (que me parece impresionante). Me podrías dar alguna pista, he intentado modificar el script para que se adapte, pero no lo he conseguido.
    Gracias de antemano y muy buen trabajo.

  5. Realmente Funciona, es SIN DUDA una de las mejores soluciones que he investigado y encontrado en la red.
    En termino generales, veras una vez un anuncio en un vídeo de youtube, luego de 4 min se guarda el dominio y creo que se carga automáticamente en Blacklist.

  6. Hola Deivid,

    He comenzado a disfrutar de los resultados de tu Script y por lo que veo me quita bastantes anuncios, sobretodo mi hijo te lo agradece cuando mira sus dibujos.

    Un trabajo genial, ojalá supiera programar yo esos scripts.

    P.D: Usando ‘systemctl enable ytadsblocker’ se iniciaria el servicio en cada arranque de sesión.

    Muchas gracias.

    1. Muchisimas gracias piro25 por tu comentario!

      Por cierto, el script ya lleva una orden interna que se encarga de activar el servicio para que se ejecute en el arranque del sistema. 🙂

      1. Es una RaspBerry pi de primera generación, la versión de raspbian buster lite “febrary 2020” Kernel Version: 4.19.
        al iniciar la isntalacion aparece lo siguiente:
        [i] Youtube Ads Blocker: INSTALLING…
        [i] if you move the scrip to a different place, please run it again with the option ‘instal’
        [i] You can check the logs in: /var/logytadsblocker.log
        [i] All the subdomains will be added to: /etc/pihole/blacklist.txt
        [i] Every 240s it reads: /var/log/pihole.log

        [i] Installing the service…touch: cannot touch ‘ytadsblocker.service’: permission denied

        he leido en comentarios anteriores que el usuario no tiene privilegios suficientes, sin embargo el usuario que estoy usando es el “superusuario”……
        ya he reinstalado el raspbian y el pihole nuevamente y creado nuevos usuarios….
        seguro hay algo que no estoy haciendo bien!!!! 😦

      2. Hola F-lira, esto es por que estas ejecutando el script, probablemente con el usuario pi; ejecuta el script con sudo, o conectate con el usuario root y realiza la instalación.

      3. He reinstalado todo de cero, y ahora todo ok!!, gracias, solo que me he percatado que en la app de youtube o en la smart-tv no los elimina, supongo que segun transcurra el tiempo detectara los subdominios para añadirlos a la lista!
        GRACIAS POR TODO un saludo….

      4. Hola,

        Como ya comenté, es realmente complicado eliminar todos los subdominios, tampoco se puede bloquear en la totalidad, ya que si no Youtube como tal deja de funcionar, por lo que es realmente complicado.

  7. Hola. Una pregunta. Al instalar el script me da fallo. Me sale esto:

    __ ______ __ __________ ______ ______ ___ ____ _____
    \ \/ / __ \/ / / /_ __/ / / / __ )/ ____/ / | / __ \/ ___/
    \ / / / / / / / / / / / / / __ / __/ / /| | / / / /\__ \
    / / /_/ / /_/ / / / / /_/ / /_/ / /___ / ___ |/ /_/ /___/ /
    /_/\____/\____/ ____ \______________________ |_/_____//____/
    / __ )/ / / __ \/ ____/ //_// ____/ __ \
    / __ / / / / / / / / ,< / __/ / /_/ /
    / /_/ / /___/ /_/ / /___/ /| |/ /___/ _, _/
    /_____/_____/\____/\____/_/ |_/_____/_/ |_| v2.3 by @deividgdt

    [i] Youtube Ads Blocker: INSTALLING…
    [i] If you move the script to a different place, please run it again with the option 'install'
    [i] You can check the logs in: /var/log/ytadsblocker.log
    [i] All the subdomains will be added to: /etc/pihole/blacklist.txt
    [i] Every 240s it reads: /var/log/pihole.log

    [i] Installing the service…touch: cannot touch 'ytadsblocker.service': Permission denied
    Alguien sabe que puede ser el fallo?

    1. Hola Manuel, estas instalando el el script como superusuario (root)? lo más probable es que sea por que estes con usuario sin privilegios suficientes.

  8. Excelente script!!!

    Aunque llega un momento en que simplemente no me permite la reproducción; por lo que pude identificar sucede con las URL con la siguiente estructura: r3.sn-0opoxu-j0oe.googlevideo.com por lo que habria que hacer una prueba para ver si es posible excluirlas de las URL: r3.sn-hp57kn67.googlevideo.com
    Lo anterior lo menciono porque sacando esas direcciones de la lista negra la reproducción funciona sin problemas.

  9. muchas gracias Deivid,

    he metido esta nueva version y de momento me esta funcionando, la publicidad que se ve ahora en youtube son unos banners en el mismo video, eso se ve si reproduces con un ordenador, por lo demas bien. otra cosa la lista negra esa tiene alguna limitación?

      1. gracias Deivid,

        una cosa como sabre cuando saques una nueva version o como se actualiza bajando el archivo? o metiendo un comando?

      2. Hola Alex,

        De momento lo que puedes hacer es revisar los logs. Allí podras ver si hay una versión nueva.

        Me gustaría hacer algo un poco más automatizado, pero aún tengo que sacar tiempo.

  10. Gracias deivid

    a ver no se por que cuando le meto los comandos que me dices ./ytadsblocker.sh uninstall o el de quitarlo, me dice que el directorio no existe.

    para poder hacerlo me tengo que dirigir al directorio donde esta el archivo y asi si me deja tanto desinstalar como instalar, pero nada sigue igual.

    y yo utilizo Raspbian.

    1. Hola Alex,

      Es normal lo que comentas, el comando que te he pasado es para que lo ejecutes donde esta el archivo.

      He estado haciendo un analisis de lo que te ha ocurrido y curiosamente, tu fichero de logs de pihole (/var/log/pihole.log) esta siendo tratado como un fichero binario, y grep no puede leer el contenido del mismo, esto es raro, por que no debería ser así, sin embargo voy a sacar una nueva versión del script que pueda obtener los datos de los logs, aunque el fichero este siendo tratado como binario.

      1. Hola Alex,

        La version 2.3 del script deberia funcionarte correctamente. Como hiciste antes, desde la ubicación del archivo, ejecuta: ./ytadsblocker.sh uninstall y luego ./ytadsblocker.sh install.

        Cualquier duda me comentas,

  11. buenas soy nuevo en esto, lo he instalado (o eso creo) en una raspberry pi b y en principio lo ha instalado bien, mi pregunta es cuando le meto el comando systemctl start ytadsblocker no me sale nada, entonces no se si esta trabajando bien, como lo puedo saber? lo que si me añadió a la lista negra unas palabras conciencia,binario,el,en,fichero,

    1. Hola Alex,

      Puedes ejecutar: systemctl status ytadsblocker, para ver si estar corriendo correctamente. Tambien puedes ver el log del script en /var/log/ytadsblocker.log,

      Si tienes cualquier duda me comentas,

      Un saludo.

      1. esto es lo que me pone cuando ejecuto el comando:
        ytadsblocker.service – Youtube ads blocker service for Pi-hole
        Loaded: loaded (/lib/systemd/system/ytadsblocker.service; enabled; vendor preset: enabled)
        Active: active (running) since Mon 2019-08-05 16:22:14 WEST; 2h 10min ago
        Main PID: 496 (ytadsblocker.sh)
        ~
        ~
        y esto el archivo log:

        [2019-08-05 16:14:35] New subdomain to add: Coincidencia
        [2019-08-05 16:14:35] New subdomain to add: en
        [2019-08-05 16:14:35] New subdomain to add: el
        [2019-08-05 16:14:35] New subdomain to add: fichero
        [2019-08-05 16:14:35] New subdomain to add: binario
        [2019-08-05 16:14:35] New subdomain to add: /var/log/pihole.log
        [2019-08-05 16:18:05] Youtube Ads Blocker Started
        —————

      2. Hola Alex,

        Tras revisar tu comentario he borrado algunas lineas de los logs para no ocupar demasiado en los comentarios.

        Haz lo siguiente:
        -Desintala el servicio ejecutando: ./ytadsblocker.sh uninstall
        -Instalalo nuevamente ejecutando: ./ytadsblocker.sh install

        Si no te funciona, por favor dime que Distribución de Linux estas usando en la Rasp, y modificaré el script para que pueda funcionar sobre ella.

        Gracias por ayudarme a mejorar el script.

  12. Hola de nuevo Deivid!

    Funciona Genial,parece que google tiene dominios infinitos ya que cada dia que miro la blacklist hay mas.

    Mi pregunta es.. ¿Se podría compartir esta black list para que otra gente la pudiera importar?

    Saludos.

    1. Hola Javier,

      Segun lo que pude investigar la última vez, podrias compartir esta lista con alguien de tu propio pais, por que los subdominios se generan, quiero pensar, “aleatoriamente” y dependiendo de cada pais.

      Como habrás podido ver no todos los anuncios son bloqueados por esa misma razón, por que cada vez hay más y más. Esto es algo que Google ha hecho muy bien, por lo que el bloqueo al 100% a través de DNS (pi-hole) parece casi imposible, aunque si que se consigue reducir el numero de anuncios.

      He conseguido modificar la expresión regular de este script y bloquear los anuncios al 100%, pero cuando esto ocurre, el algoritmo de Youtube tiene ciertas comprobaciones que hace que directamente Youtube deje de funcionar.

      Un saludo.

  13. Hola Deivid,

    Me he creado una cuenta de wordpress.

    Te pego aqui lo que me devuelve putty.

    ./ytadsblocker.sh: línea 7: error sintáctico cerca del elemento inesperado `newline’
    ./ytadsblocker.sh: línea 7: `’

    Saludos.

      1. Hola Deivid,

        Este funciona, pero el pi hole en si ha dejado de funcionar una vez aplicado el script.

        Como no se mucho de Linux, reinstalare la Maquina, vuelvo a probar y te cuento.

        Saludos.

    1. Hola Javier,

      ¿Puedes decirme qué versión de Ubuntu estás usando? Si me dices modifico el script para que también se pueda usar en la versión que me digas.

      1. Hola Deivid,

        Muchisimas Gracias, te dejo la version.

        Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-20-generic x86_64)

        Saludos.

      2. Buenas tardes Javier,

        He sacado una nueva version (2.1) del script que podras instalar en Ubuntu.

        Echale un vistazo, con cualquier cosa me comentas.

  14. uh genial, tambien llevo unos dias usandolo, y lo unico q me faltaria para la felicidad completa seria esto, gracias por el aporte y voy a hacer uso del script. Abrazo grande.

Responder a javigm62 Cancelar respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s