This blogpost is in French, as it explains how to block spam calls for Free Mobile customers.
Le spam téléphonique fait partie de ces petites chose irritantes du quotidien dont on se passerait bien et qui continuent d'exister au mépris du bon sens. En attendant que la pratique soit rendue illégale et punie par une marche forcée sur de tout petits Lego, il est possible, via l'interface web de Free, de bloquer les plages de numéros utilisés par ces pénibles pour nous pourrir ledit quotidien.
L'ARCEP, louée soit-elle, publie une page détaillant le plan de numérotation téléphonique français, qui raconte en gros que "les prefixes 0162, 0163, 0270, 0271, 0377, 0378, 0424, 0425, 0568, 0569, 0948, 0949, 09475, 09476, 09477, 09478 et 09479 sont utilisés pour le démarchage".
Malheureusement, il reste des petits plaisantins qui utilisent d'autres numéros pour chagriner le quidam, souvent d'opérateurs qu'on pourrait charitablement qualifier de "peu regardant". Une solution tout à fait valide serait d'utiliser saracroche, une chouette application iOS/Android open-source qui permet de non seulement de bloquer les indésirables, mais également de collectivement constituer une base de données les recensant. Un petit passage par la documentation nous informe qu' "environ 15 millions de numéros sont bloqués, dont 12,5 millions correspondent aux préfixes réservés au démarchage téléphonique, communiqués par l'ARCEP". Plutôt que d'installer une nième application, on va utiliser son API pour aller récupérer quelques préfixes en plus de ceux de l'ARCEP. Comme la liste est conséquente, on va dégrossir par taille de plage :
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("######"))' | wc -l
12
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("#####"))' | wc -l
20
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("####"))' | wc -l
253
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("###"))' | wc -l
1541
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("###"))' | wc -l
1541
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("##"))' | wc -l
1541
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern | contains("#"))' | wc -l
1541
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators | jq -c '.patterns[] | select(.pattern)' | wc -l
1541
$
Je suis parti sur du #####, soit 100.000 numéros par blocage, en me réservant
évidement la possibilité de descendre plus bas si cela s'avère nécessaire.
Suivez votre cœur et prenez la granularité que vous voulez.
Un petit coup de jq/sed/tr d'une rare élégance pour mettre tout ça en
forme:
$ curl --silent https://saracroche.org/api/v1/lists/french-list-arcep-operators \
| jq -c '.patterns[] | select(.pattern | contains("#####")) | .pattern ' \
| sed 's/^"33/"0/ ; s/#//g ; s/"$/*",/' \
| tr '\n' ' '
"0162*", "0163*", "0270*", "0271*", "0377*", "0378*", "0424*", "0425*", "0568*", "0569*", "0948*", "0949*" "09475*", "09476*", "09477*", "09478*", "09479*", "07568*", "07569*", "07809*",
$
Pour bloquer tout ce joli monde, il suffit de se rendre sur
https://mobile.free.fr/account/mes-services/filtres, et de coller le bout de
JavaScript suivant dans la console du navigateur, en prenant évidement soin de
replacer la ligne // Les patterns vont ici par les patterns précédemment
générés.
(async function () {
var phonePatterns = [
// Les patterns vont ici
];
var saveUrl = '/account/mes-services/filtres?action=save';
var existing = document.querySelectorAll('.f-rules__item--msisdn');
var hasRule = p => [...existing].some(el => el.innerHTML.includes(p));
for (const pattern of phonePatterns) {
if (hasRule(pattern)) {
console.log('Règle déjà présente: ', pattern);
continue;
}
const body = new URLSearchParams({
'rule-id': '',
direction: '2',
pattern: pattern,
description: 'Spam',
'full-day': '1',
'full-week': '1',
media: '1',
action: '2'
});
const res = await fetch(saveUrl, {
method: 'POST',
headers: { 'Content-type': 'application/x-www-form-urlencoded' },
body
});
console[res.ok ? 'log' : 'error']((res.ok ? '[OK]' : '[KO]'), pattern);
}
console.log('Toutes les règles ont été parcourues');
})();