+1 SpaceFox. La protection contre les robots ne devrait pas se faire au détriment de l’usabilité ou de l’accessibilité.
La solution utilisée par la solution de protection des mails de Cloudflare est d’encoder le mail et de le décoder en JS, en proposant éventuellement un lien alternatif pour le trouver si le JS est désactivé (si on veut supporter la navigation sans JS).
La majorité des bots de scrapping ne font pas tourner JavaScript (car ça coûte bien plus cher : récupérer juste un fichier texte vs faire tourner tout un navigateur). À défaut, on peut bloquer plus ou moins efficacement les bots (par UA, bloc d’IP, …).
Cette méthode a également l’avantage de ne pas poser de problème d’accessibilité, vu que les visiteurices (avec JS) voient un lien mailto:
normal.
Le code source ressemble à cela :
<a href="/cdn-cgi/l/email-protection#ee868b828281ae828783859b8f9ac08d8183">
<span class="__cf_email__" data-cfemail="83ebe6efefecc3efeaeee8f6e2f7ade0ecee">
[email protected]
</span>
</a>
<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
Leur script de décodage ressemble à cela — en gros c’est juste une série de chiffres XOR.
function read_hex_nun_in_hash(hash_string, offset) {
let hash = hash_string.substr(offset, 2)
return parseInt(hash, 16)
}
function decode_email(href, hash_index) {
let decoded_email = ''
const key = read_hex_nun_in_hash(href, hash_index)
for (let i = hash_index + 2; i < href.length; i += 2) {
const decoded_char = read_hex_nun_in_hash(href, i) ^ key
decoded_email += String.fromCharCode(decoded_char)
}
try {
decoded_email = decodeURIComponent(escape(decoded_email))
} catch (err) {
console.error(err)
}
return decoded_email
}
On peut l’essayer sur l’exemple ci-dessus avec :
decode_email("/cdn-cgi/l/email-protection#ee868b828281ae828783859b8f9ac08d8183", "/cdn-cgi/l/email-protection#".length)
C’est pour l’idée, hein, brut de décoffrage. À adapter à ton usage, le cas échéant.