My Computer · 2025/08/04 0

苹果cms 短剧视频分类ID 点击量去重插件

现在短剧横行,动辄几十集上百集,会导致播放量失真,剧集类排行始终被短剧霸榜。为了解决这个问题制作了vodhits 插件:

只针对指定分类:例如“短剧”类别下,不论同一个访客看多少集,只在首次访问时给该视频 +1 次点击;
保留其他分类原有逻辑:非目标分类的视频仍然每次访问都累加点击;
支持详情页 & 播放页:确保无论用户是在详情页还是播放页,都只计一次。

功能概述

  • 多分类支持:在插件配置里填入一个或多个分类 ID(英文逗号分隔),插件会自动只对这些分类生效。
  • 开关控制:插件自带开关,随时可在后台启用或关闭功能。
  • 零侵入核心:无需改动核心控制器,只需将插件放到 addons/vodhits,后台安装并配置即可。

核心实现原理

  1. 钩子触发
    采用 view_filter 行为钩子,在视频控制器(Vod)的 showplay 方法渲染后执行。
  2. Session 去重
    通过 PHP session 记录用户已访问过的 vod_id 列表:
    • 首次访问:系统会先执行一次原生自增(setInc('vod_hits')),插件检测到该 ID 不在 Session 中,于是将其加入 Session;
    • 后续访问:再触发同样的自增后,插件马上执行 setDec('vod_hits')(及日/周/月 点击),把多余的 +1 回滚,保证总量仅 +1。
  3. 多分类判断
    插件读取后台配置的分类 ID 数组,只对这些分类下的视频应用上述逻辑,其它分类不做任何干预。

安装与配置

  1. 目录结构
    addons/
    └─ vodhits/
    ├─ info.ini # 插件基础信息
    ├─ config.php # 后台配置项:status + typeids
    └─ Vodhits.php # 插件核心逻辑
  2. 后台安装
    • 上传 addons/vodhits 到项目根目录。
    • 进入 苹果CMS 后台 → 应用 → 应用市场→ 安装 “访客唯一点击”。
  3. 填写配置
    • 插件开关:开启后生效;关闭则恢复系统原有点击逻辑。
    • 分类ID:在“分类ID”输入框里填入要限制的类型,比如 3,5,8

使用效果与测试

  1. 首次访问:详情页或播放页访问后,数据库中的 vod_hits 由 0 变 1;
  2. 重复刷新:同一个访客在同一浏览器里多次访问,同一 vod_id 的点击量始终保持 1;
  3. 不同分类:未在配置里指定的分类,访问几次点击量都会正常累加;
  4. 不同访客:换设备或清除 Cookie 后再次访问,同一视频点击量可继续 +1。

源码下载:

另外,后台把采集参数中随机点击量范围设为 0,只是屏蔽了随机生成;如果采集的上游数据里带了点击量,就还会写进去;如果上游没带,就为 0。要彻底禁用“采集原始数据”自带的点击量,可以在代码里把赋值部分全部改成 0

打开application/common/model/Collect.php 搜索找到 if($config['hits_start']>0 && $config['hits_end']>0)
共5处,:

                //if($config['hits_start']>0 && $config['hits_end']>0) {
                //    $v['vod_hits'] = rand($config['hits_start'], $config['hits_end']);
                //    $v['vod_hits_day'] = rand($config['hits_start'], $config['hits_end']);
                //    $v['vod_hits_week'] = rand($config['hits_start'], $config['hits_end']);
                //    $v['vod_hits_month'] = rand($config['hits_start'], $config['hits_end']);
                //}
                //强制将采集入库的 vod_hits(含日/周/月)全部设为0
                $v['vod_hits']       = 0;
                $v['vod_hits_day']   = 0;
                $v['vod_hits_week']  = 0;
                $v['vod_hits_month'] = 0;