REST Api跟踪唯一页面视图

时间:2018-04-24 07:10:39

标签: php rest api google-analytics redis

我正在使用Api平台为我的网站开发一个PHP REST api,用户可以发布'评论'(类似于文章)。我想跟踪这篇文章的独特页面浏览量,以便我可以在以后查看最常见的评论并显示它们。

我已经在线阅读了很多解决方案,我已经实施了两个解决方案:Google Analytics跟踪和Redis +浏览器指纹识别。

首先,Google Analytics跟踪效果非常好,我使用'ga:uniquePageviews'属性,并在页面路径中使用过滤器来获取使用Google PHP Api的唯一网页浏览量。此方法的唯一问题是某些用户使用广告拦截器并阻止Google Analytics,因此不会为这些人记录任何网页浏览量。

我还使用Redis +浏览器指纹识别(使用fingerprintjs2)为匿名用户实现了视图跟踪,并使用用户ID登录用户。因此,对于登录用户,如果他们在过去30分钟内未访问过该页面,则会添加一个新的唯一视图。这看起来效果很好。 问题出在匿名用户身上。目前,在网站方面,我使用fingerprintjs2库生成浏览器指纹,然后将其传递到标头中的REST api,如果该指纹在过去30分钟内未访问该页面,则会添加新的唯一视图。但是因为我的REST api将会公开(我计划将来也可能制作一个移动应用程序),任何人都可以在指纹头中放入任何想要的东西,只需不断更改它,就会记录一个新的独特视图,我不知道如何解决这个问题。只允许来自我的网站域的CORS修复此问题吗?但那么移动应用程序呢?

现在我倾向于认为使用谷歌分析是最好的方式,尽管广告拦截,但Redis方法对我来说似乎很酷,我也想让它工作。

以下是我目前用于Redis的代码示例:

public function addAndGetReviewViews(Request $request, $id)
{
    $viewsKey = 'pageviews-review-' . $id;
    $setKey = 'uniqueviews-review-' . $id;

    $user = $this->getUser();

    if ($user) {
        $userId = $user->getId();
    } else if ($request->headers->has('X-Anonymous-Fingerprint')) {
        $userId = base64_encode(
            substr($request->headers->get('X-Anonymous-Fingerprint'), 0, 32)
        );
    } else {
        // Only add views if user is logged in or has anonymous fingerprint
        return $this->redis->get($viewsKey) ?: 0;
    }

    $setExists = $this->redis->exists($setKey);

    if (!$this->redis->sismember($setKey, $userId)) {
        $this->redis->sadd($setKey, $userId);
        $this->redis->incr($viewsKey);
    }

    if (!$setExists) {
        $this->redis->expire($setKey, 1800);
    }

    return $this->redis->get($viewsKey);
}

0 个答案:

没有答案