{"id":28154981,"url":"https://github.com/gmega/callblocker","last_synced_at":"2025-05-15T06:15:37.153Z","repository":{"id":41780170,"uuid":"192578902","full_name":"gmega/callblocker","owner":"gmega","description":"Um bloqueador de chamadas amigável para telefones fixos que roda no Raspberry Pi.","archived":false,"fork":false,"pushed_at":"2023-01-01T09:05:06.000Z","size":3770,"stargazers_count":5,"open_issues_count":14,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2023-08-13T01:10:34.259Z","etag":null,"topics":["callblocker","landline","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gmega.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-06-18T16:46:37.000Z","updated_at":"2023-08-13T01:10:34.260Z","dependencies_parsed_at":"2023-01-31T21:30:50.976Z","dependency_job_id":null,"html_url":"https://github.com/gmega/callblocker","commit_stats":null,"previous_names":[],"tags_count":2,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gmega%2Fcallblocker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gmega%2Fcallblocker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gmega%2Fcallblocker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gmega%2Fcallblocker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gmega","download_url":"https://codeload.github.com/gmega/callblocker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254283213,"owners_count":22045145,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["callblocker","landline","raspberry-pi"],"created_at":"2025-05-15T06:15:18.998Z","updated_at":"2025-05-15T06:15:37.121Z","avatar_url":"https://github.com/gmega.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"callblocker [![Build Status](https://api.travis-ci.com/gmega/callblocker.svg?branch=master)](https://app.travis-ci.com/github/gmega/callblocker) [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)\n===========\nUm bloqueador de chamadas moderno e amigável para telefones fixos.\n\nIntrodução\n==========\n\nO problema das chamadas indesejadas é uma questão mundial e no Brasil isso não é diferente. Um [relatório da First Orion](\nhttps://firstorion.com/nearly-50-of-u-s-mobile-traffic-will-be-scam-calls-by-2019/) estima que, em 2019, quase _metade_\ndas chamadas telefônicas recebidas nos Estados Unidos serão chamadas indesejadas (de telemarketing ou golpistas). Enquanto os \n _smartphones_ modernos nos dão instrumentos para ao menos bloquear chamadas de números que já se demonstraram indesejáveis, \n os telefones fixos ficaram presos no passado: a maior parte dos aparelhos sequer suporta o bloqueio de chamadas e, dentre os \n que suportam, interfaces arcaicas e dados que morrem junto com o aparelho são a norma. \n\nEste projeto tenta corrigir esse problema disponibilizando um bloqueador de chamadas moderno para telefones fixos. Por \n\"moderno\" se entende: _i)_ dotado de uma interface gráfica amigável (veja [screenshots](#screenshots)); _ii)_ passível \nde backup e exportação de dados e; _iii)_ interligado com facilidades como o \n[Google Contacts](https://contacts.google.com) e bases de telefones suspeitos como o \n[Quem Perturba](https://quemperturba.inerciasensorial.com.br/).\n\nPara rodar o bloqueador de chamadas, você vai precisar de um pouco de [hardware](#hardware). Mas calma: como este projeto \nfoi feito no Brasil, ele usa hardware disponível no mercado brasileiro. Você vai precisar também [instalar](#instalação) e \n[configurar](#configuração) o bloqueador.\n\nSe quiser entender quais as limitações atuais, vá para [Limitações](#limitações). Finalmente, se quiser só ver alguns \nscreenshots, vá para [screenshots](#screenshots). \n\nHardware\n========\nPara rodar o bloqueador, você vai precisar de:\n\n* **Um computador de pequeno porte, como um [Raspberry Pi](https://www.raspberrypi.org/).** Eu tinha \n  um [Pi 3 B+](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/) \n  sobrando aqui em casa, então foi esse que eu usei. O projeto provavelmente roda em versões mais antigas (e baratas) \n  do Raspberry, mas eu não tenho como testar. \n  \n* **Um Modem USB que suporte identificação de chamadas (caller ID).** Qualquer modem baseado no chipset Conexant CX93010 deve funcionar. \n  Isso inclui boa parte dos modems USB mais baratos disponíveis no [Mercado Livre](https://www.mercadolivre.com.br/)\n  e que dizem suportar identificação de chamadas. Infelizmente, os vendedores desse tipo \n  de produto (barato, chinês e sem marca) tipicamente não sabem responder qual o chipset do modem, então o jeito é \n  comprar e ver o que aparece. Adaptar o bloqueador a outros modems é simples mas, de novo, eu não tenho outros modelos \n  para poder testar.\n    \n* **Um conversor de DTMF para FSK (talvez).** Também disponível no Mercado Livre a preços que vão de 30 a 150 reais.\n  Eu tenho uma linha fixa tradicional da [Vivo](https://www.vivo.com.br) (i.e., não é aquela linha que brota do Vivo \n  fibra) e, nessas linhas, a Vivo utiliza modulação DTMF para a identificação de chamadas. A \n  [Wikipedia](https://en.wikipedia.org/wiki/Caller_ID) no entanto aponta que outras operadoras **no Brasil** \n  podem usar outros padrões (FSK e V23 FSK), então o conversor pode não ser necessário no seu caso.\n  \nDepois de montado, o hardware do meu bloqueador ficou com essa cara aqui:\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=\"729\" hspace=\"10px\" src=\"https://gmega.github.io/callblocker/img/hardware_assembly.jpg\"\u003e\n\u003c/div\u003e\n\n  \nInstalação\n==========\n\nUma vez montado o hardware e carregado o sistema operacional do Raspberry Pi (eu estou usando o \n[Raspbian Buster](https://www.raspberrypi.org/downloads/raspbian/)), o jeito mais simples de instalar o bloqueador \né utilizando o [Docker](https://www.docker.com/). Instalar o Docker no Raspbian é fácil e existem inúmeros artigos na \nInternet descrevendo o procedimento; por exemplo, [este artigo em português](https://www.filipeflop.com/blog/containers-docker-com-raspberry-pi/).\n\nVocê vai precisar também do [docker-compose](https://docs.docker.com/compose/). A forma mais fácil que conheço de instalá-lo no \n Raspbian é usando o [pip](https://en.wikipedia.org/wiki/Pip_%28package_manager%29). Para isso, basta executar, num terminal:\n\n```sh\n\u003e sudo pip install docker-compose\n```\n\nVocê então vai ter que compilar a imagem do bloqueador com o Docker. Para tanto, basta baixar a versão mais atual\ndo bloqueador:\n\n```sh\n\u003e wget -O master.tar.gz https://github.com/gmega/callblocker/tarball/master\n```\n\ne extraí-la com:\n\n```sh\n\u003e tar xzvf master.tar.gz\n```\n\nIsso vai criar um novo diretório contendo o código do bloqueador. Você deve então entrar nesse diretório\ne rodar o _build_ do Docker:\n\n```sh\n\u003e docker build -t callblocker:latest --build-arg RPI_BUILD=1 .\n```\n\nse esse comando terminar sem erros, a sua instalação deu certo.\n\nConfiguração\n============\nPara configurar o bloqueador no Raspbian você vai precisar saber:\n\n* **Qual o [arquivo de dispositivo ](https://pt.wikipedia.org/wiki/Arquivo_de_dispositivo) (device file) do seu modem.** Normalmente `/dev/ttyACM0`.\n* **Quais os endereços IP, ou qual o record DNS do seu Raspberry na rede.** Isso é usado para configurar a lista de \n  endereços que o backend do bloqueador (baseado no Django) aceita e evitar ataques de \n  [CSRF](https://en.wikipedia.org/wiki/Cross-site_request_forgery). A melhor forma de evitar chatice com isso numa rede \n  local é fixar o endereço do Raspberry no DHCP do seu roteador, ou usar um DNS \n  dinâmico gratuito tipo o [Duck DNS](https://www.duckdns.org/). Aqui em casa usamos o Duck DNS.\n\nCom essa lista na mão, para iniciar o bloqueador basta rodar, a partir da raíz do diretório criado durante a \n[instalação](#Instalação):\n\n```sh\n\u003e HOST_MODEM_DEVICE='/dev/ttyACM0' \\\nHOST_API_ADDRESSES='192.167.1.163,cblocker.duckdns.org' \\\ndocker-compose up\n``` \n\nonde:\n* `HOST_MODEM_DEVICE` é o arquivo de dispositivo do seu modem;\n* `HOST_API_ADDRESSES` é a lista de endereços e/ou nomes DNS, separados por vírgula, \n  em que o seu bloqueador deve funcionar. No meu caso, eu acesso o bloqueador de dois endereços:\n  * `192.167.1.163`;\n  * `cblocker.duckdns.org`. \n  \n  então, a minha é `HOST_API_ADDRESSES='192.167.1.163,cblocker.duckdns.org'`.\n  \nSe tudo der certo, basta abrir um browser no celular ou Desktop e apontá-lo a:\n \n ```http://[endereço]:5000/```\n \n que você deverá ver uma tela como esta:\n \n \n \u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/gmega/callblocker/gh-pages/img/no_calls.png\"\u003e\n \u003c/div\u003e\n \n\n_Voilà!_ O bloqueador de chamadas está rodando! Mas isso não quer dizer, claro, que ele esteja funcionando. :-) A melhor\nforma de se assegurar que o bloqueador está de fato funcionando, por hora, é fazer uma ligação para o próprio número. Se\ntudo estiver funcionando, ela deve aparecer no lugar do aviso de que não há chamadas para mostrar.\n\nNote que o Docker vai se encarregar de inicializar o bloqueador novamente toda vez que o Raspberry Pi for reiniciado, \nentão você não precisa se preocupar com criar scripts de inicialização (se é que estava preocupado ;-)).\n\nLimitações\n==========\n\nAs limitações se dividem em duas categorias:\n\n1. **limitações tecnológicas.** Estas são as limitações inerentes à abordagem utilizada e são, portanto, permanentes.\n2. **Limitações da implementação.** Estas são limitações da implementação atual e provavelmente serão resolvidas num \n     futuro próximo.\n     \nLimitações Tecnológicas\n-----------------------\nO bloqueio é feito com base na informação de identificação de chamadas e nas possibilidades oferecidas\npor um modem comum. Isso traz duas limitações:\n\n1. se a pessoa que chama souber como [manipular a informação de identificação de chamada](https://en.wikipedia.org/wiki/Caller_ID_spoofing)\n   (o que, infelizmente, não é tão difícil quanto parece), ela pode inventar um número qualquer e furar a sua lista de \n   bloqueio. Pior ainda, ela pode te levar a bloquear números que não são dela. Note que, embora importante, essa limitação é \n   comum à maior parte dos bloqueadores modernos, inclusive os presentes nos smartphones.\n   \n2. As operadoras tipicamente transmitem a informação de identificação de chamada após o primeiro toque. Isso quer dizer\n   que o telefone sempre toca uma vez, mesmo para números bloqueados. Para evitar que isso aconteça, seria necessário suprimir o \n   primeiro toque de todas as chamadas. Isso, infelizmente, não é possível com um modem comum.\n   \nLimitações de Implementação\n-----------------------\nNa versão atual, ainda faltam:\n\n1. **Autenticação.** Qualquer usuário ligado à sua rede local tem acesso irrestrito ao bloqueador de chamadas. Isso deve\n   mudar em breve numa versão futura.\n   \n2. **HTTPS.** A comunicação é atualmente feita por HTTP, o que quer dizer que o tráfego é visível a observadores na \n   rede. Isso inclui as eventuais senhas e tokens de autenticação que vão existir quando implementarmos (1). Usar HTTPS\n   em redes locais é inerentemente chato por causa da natureza dos certificados SSL. Portanto, mesmo quando isto estiver\n   disponível, vai ser chato de configurar/usar.\n   \n3. **Contatos.** Os contatos estão armazenados num banco de dados local e, atualmente, não existem ferramentas para \n   exportá-los ou integrá-los com uma agenda existente como o [Google Contatos](https://contacts.google.com/) (embora\n   seja possível lê-los do banco, um [PostgreSQL](https://www.postgresql.org)). Isso deve mudar numa versão futura.\n   \n4. **Debugging.** Não existem ferramentas integradas para verificar o funcionamento do modem e do bloqueador de chamadas.\n   Isso torna a configuração e resolução de problemas mais difícil. Isso também deve mudar numa versão futura.\n   \n5. **Busca em bases de dados de telefones.** Existem alguns sites como o \n   [Quem Perturba](https://quemperturba.inerciasensorial.com.br/)\n   que permitem que usuários comentem sobre o comportamento de certos números de telefone. Seria simples (e útil) \n   poder mostrar os comentários associados a um determinado telefone desconhecido. Mais legal ainda seria analisar \n   os comentários e decidir se o telefone deve ser bloqueado ou não usando NLP. Pretendo fazer ambas as coisas em \n   numa versão futura.\n \nScreenshots\n===========\n \nA interface do bloqueador de chamadas é baseada no [Material UI](https://material-ui.com/). Isso faz com \nque ela seja familar por um lado (o _material design_ no qual ela é baseada é utilizada nos aplicativos\ndo Google) e amigável a dispositivos móveis no outro. O último requisito em particular é fundamental já \nque eu basicamente acesso o bloqueador de chamadas pelo smartphone. Alguns screenshots:\n \nCelular\n-------\n\n \u003cdiv align=\"center\"\u003e\n  \n  Chamadas recentes        |  Busca na agenda\n:-------------------------:|:-------------------------:\n\u003cimg width=\"300\" src=\"https://gmega.github.io/callblocker/img/recent_callers.png\"/\u003e    |  \u003cimg width=\"300\" src=\"https://gmega.github.io/callblocker/img/phonebook.png\"/\u003e  \n\n\u003c/div\u003e\n\nDesktop\n-------\n\n \u003cdiv align=\"center\"\u003e\n  \n  Chamadas recentes        |  Busca na agenda\n:-------------------------:|:-------------------------:\n\u003cimg width=\"500\" src=\"https://raw.githubusercontent.com/gmega/callblocker/gh-pages/img/recent_callers_desktop.png\"\u003e|  \u003cimg width=\"500\" src=\"https://gmega.github.io/callblocker/img/phonebook_desktop.png\"\u003e  \n\n\u003c/div\u003e\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgmega%2Fcallblocker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgmega%2Fcallblocker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgmega%2Fcallblocker/lists"}