1

由于欧盟对广告发布商有特殊的法律。我想为我的用户显示 cookie 同意。但我只是在互联网上找不到任何好的框架来确定用户是否来自欧盟国家。

有什么办法可以做到这一点?

希望能得到一些详细的答案。

谢谢

4

2 回答 2

6

如果我正确理解您的问题,您可以通过确定用户的本地时区轻松做到这一点。有几种方法可以做到这一点。

Moment.js

Moment Timezone具有猜测用户时区的功能。只要您使用的是最新版本,它就非常准确。

例子:

<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>
<script>
  document.getElementById('guess').innerText = moment.tz.guess();
</script>

Moment.js 使用 Intl API,这是一个内置的 JavaScript 国际化 API。它还拥有自己的数据库,用于检查 Intl API 的结果,以提供更准确的信息。它还要求您在其工作之前包含 Moment.js。

Jstz 包

Jstz是一个用于检测时区的简单轻量级包。它还利用了 Intl API,因此您可以对其结果充满信心。要使用该包,您可以按如下方式获取 CDN:

<div id="guess"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
<script>
  document.getElementById('guess').innerText = jstz.determine().name();
</script>

Intl API 本身
您可以直接使用Intl API

Intl 对象是 ECMAScript 国际化 API 的命名空间,它提供语言敏感的字符串比较、数字格式以及日期和时间格式。Intl 对象提供对多个构造函数以及国际化构造函数和其他语言敏感函数共有的功能的访问。

示例用法:

<div id="guess"></div>
<script>
  document.getElementById('guess').innerText = Intl.DateTimeFormat().resolvedOptions().timeZone;
</script>

您可以从这些用于检测时区的库中注意到,它们不需要您进行任何网络调用。这意味着如果您打算只选择用户时区,您可能不需要进行 IP 查找。

然后,您可以将时区与特定的欧盟时区相匹配,并确定您的用户是否来自欧盟内部。

如果要对用户进行实际/准确的精确定位,则必须使用 GeoLocation。这是一个简单的脚本:https ://raw.githubusercontent.com/AdeyinkaAdegbenro/Detect_Location/master/detect_location.js 。

您可能想要检查的其他 API(任何适合您的):

于 2020-09-13T11:14:58.260 回答
1

除了公认的答案之外,我还做了所有艰苦的工作来确定哪些时区受 GDPR 法律的约束。我用的是dayjs包(和momentjs基本一样)。

consentRequired() {
dayjs.extend(timezone);
const tz = dayjs.tz.guess();
switch (tz) {
  case 'Europe/Vienna':
    return true;
  case 'Europe/Brussels':
    return true;
  case 'Europe/Sofia':
    return true;
  case 'Europe/Zagreb':
    return true;
  case 'Asia/Famagusta':
    return true;
  case 'Asia/Nicosia':
    return true;
  case 'Europe/Prague':
    return true;
  case 'Europe/Copenhagen':
    return true;
  case 'Europe/Tallinn':
    return true;
  case 'Europe/Helsinki':
    return true;
  case 'Europe/Paris':
    return true;
  case 'Europe/Berlin':
    return true;
  case 'Europe/Busingen':
    return true;
  case 'Europe/Athens':
    return true;
  case 'Europe/Budapest':
    return true;
  case 'Europe/Dublin':
    return true;
  case 'Europe/Rome':
    return true;
  case 'Europe/Riga':
    return true;
  case 'Europe/Vilnius':
    return true;
  case 'Europe/Luxembourg':
    return true;
  case 'Europe/Malta':
    return true;
  case 'Europe/Amsterdam':
    return true;
  case 'Europe/Warsaw':
    return true;
  case 'Atlantic/Azores':
    return true;
  case 'Atlantic/Madeira':
    return true;
  case 'Europe/Lisbon':
    return true;
  case 'Europe/Bucharest':
    return true;
  case 'Europe/Bratislava':
    return true;
  case 'Europe/Ljubljana':
    return true;
  case 'Africa/Ceuta':
    return true;
  case 'Atlantic/Canary':
    return true;
  case 'Europe/Madrid':
    return true;
  case 'Europe/Stockholm':
    return true;
  default:
    return false;
}

}

于 2021-08-04T15:17:44.563 回答