【问题标题】:How to allow user to copy my email address but not crawlers?如何允许用户复制我的电子邮件地址而不是爬虫?
【发布时间】:2020-09-15 03:07:30
【问题描述】:

我遇到了一些爬虫从我的网站爬取电子邮件地址并发送垃圾邮件的问题。

有没有办法让普通用户复制邮件而不是爬虫(在html源代码中检测不到xxx@xxx.com格式)?

我尝试了以下解决方案,但在复制电子邮件地址时它们都不起作用:

解决方案 1

尝试复制这个不会复制@.com

.name::after {
  content: '@';
}

.mail::after {
  content: '.com';
}
<span class="name">foo</span><span class="mail">gmail</span>

解决方案 2

尝试复制这会使 foo@gmail.com 反转。

.mail {
  display: inline-flex;
  flex-direction: row-reverse;
}
<div class="mail">
  <span>@gmail.com</span>
  <span>foo</span>
</div>

【问题讨论】:

  • 要不要做个底稿?
  • 我是这么想的,但我需要根据设计显示电子邮件地址列表。只是想找出是否有解决方法来避免使用 javascript 并生成电子邮件图像,这有点愚蠢:/

标签: html css web-crawler


【解决方案1】:

您可以尝试在电子邮件之间添加 HTML 注释。

<div class="mail">
  <span>foo<!--not an email-->@gmail.com</span>
</div>

但是,正如 OP 所述,爬虫可以轻松过滤 HMTL cmets。如果您也通过压缩器运行原始代码,则可以过滤掉 cmets。

您也可以尝试使用 Javascript 将您的电子邮件注入 DOM。

<div id="mail"></div>
<script>
  document.querySelector("#mail").innerText = ["foo", "gmail.com"].join("@")
</script>

这使得不运行 Javascript 的爬虫无法查看您的电子邮件。不过,为了使其对您的用户更有用,您还可以实现 copy-on-click

<input type="text" readonly id="mail">
<script>
  let email = ["foo", "gmail.com"].join("@")
  let element = document.querySelector("#mail")
  element.value = email
  element.addEventListener('click', e => {
    element.select()
    element.setSelectionRange(0, 99999)
    document.execCommand("copy")
  })
</script>
<style>
   #mail{
     appearance: none; 
     border: 0; 
     outline: 0;
     font-family: inherit;
     font-size: inherit;
   }
</style>

输入的样式可以像普通的行内块文本一样。您可以添加复制后出现的瞬时工具提示。

【讨论】:

  • 谢谢!第一个解决方案可能会起作用,但某些爬虫可能会过滤掉 cmets,也许像 &lt;span&gt;foo&lt;span style="display: none;"&gt;hello&lt;/span&gt;@gmail.com&lt;/span&gt; 这样的东西可能会起作用!
  • 对,我想提一下。除非指定不这样做,否则 Minify 工具也会删除 cmets。将添加注释。
【解决方案2】:

您可以强制用户单击按钮让 JavaScript 为他们复制电子邮件。

document.querySelector('button').onclick = () => {

  const span = document.querySelector('span');
  const before = window.getComputedStyle(span, ':before').getPropertyValue('content').replace(/"/g, '');
  const after = window.getComputedStyle(span, ':after').getPropertyValue('content').replace(/"/g, '');

  const input = document.createElement('input');
  document.body.append(input);
  input.value = before + after;
  input.select();
  input.setSelectionRange(0, 99999);
  document.execCommand('copy');
  input.remove();
}
span:before {
  content: 'foo';
}

span:after {
  content: '@bar.com';
}
&lt;span&gt;&lt;/span&gt;&lt;button&gt;Copy!&lt;/button&gt;

【讨论】:

  • 这基本上就是 Craigslist 为保护用户电话号码所做的工作。好策略。
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多