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.
(async function () {
var phonePatterns = [
"0162*", "0163*", "0270*", "0271*", "0377*", "0378*", "0424*", "0425*",
"0568*", "0569*", "0948*", "0949*" "09475*", "09476*", "09477*",
"09478*", "09479*", "07568*", "07569*", "07809*"
];
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');
})();