- 📊 记录每篇文章的详细访问信息
- 🌍 自动获取访客IP归属地信息
- 📈 显示最近一个月访问量排行榜
- 📅 提供每日访问趋势图表
- 📆 月度访问统计和历史数据保存
- 👥 统计独立访客数量
- 🔍 详细的访问记录查看
- 📋 文章访问记录详情查看功能
- 🌐 IP访问统计和地域分布分析
- 🔎 IP访问详情查看,支持查看每个IP的完整访问历史
- 🤖 智能识别搜索引擎爬虫访问
- 🛡️ 访问频率限制和防刷量保护
- 📊 访问来源统计和分析(搜索引擎、社交媒体、外部链接等)
- 💾 本地IP归属地数据库,减少外部API依赖
- ⚡ IP 归属地由服务端后台进程/定时任务回填,不阻塞页面加载
- 🔄 多IP查询接口支持(IP138需token、ip-api.com免费)
- ⚙️ 灵活的配置选项
- 🗂️ 完善的数据管理和清理功能
插件会为每次访问记录以下信息:
- 文章ID (cid)
- 访问时间戳 (visit_time)
- 访客IP地址 (ip)
- IP归属地 (location)
- 用户代理字符串 (user_agent)
- 自动记录文章访问信息
- 防止同一IP短时间内重复统计
- 排除管理员访问
- 近期总访问量
- 近期独立访客数
- 今日访问量
- 搜索引擎爬虫访问统计
- 访问趋势图
- 月度访问统计: 显示最近24个月的访问趋势折线图,包含总访问量和独立访客数
- 显示最近一个月访问量前N的文章
- 提供文章标题、访问次数、链接
- 支持直接跳转到文章编辑页面
- 文章访问记录: 每篇文章都可查看详细的访问记录,包括访问时间、IP地址、User Agent、归属地等信息
- 单篇文章的详细访问记录
- 按日期和IP的访问统计
- 访客地理位置分布
- 访问最多的IP地址排行榜(前20名)
- IP访问次数和占比统计
- IP访问详情查看: 点击IP地址可查看该IP的详细访问记录,包括访问的文章、时间、User Agent等信息
- 地域分布统计: 自动统计访客来源地区,显示前10个访问量最高的地区
- IP访问排行: 展示访问次数最多的前20个IP地址,包含归属地信息
- 访问占比分析: 计算每个IP的访问占比,便于识别异常访问
- IP访问详情: 为每个IP提供"查看详情"功能,可查看该IP访问的所有文章记录
- 详细访问信息: 包含访问时间、文章标题、User Agent、归属地等完整信息
- 智能爬虫识别: 自动识别主流搜索引擎爬虫(Google、百度、Bing等)
- 爬虫访问统计: 单独统计爬虫访问次数,与正常用户访问区分
- 支持爬虫类型: Googlebot、Baiduspider、Bingbot、Slurp、DuckDuckBot、YandexBot等30+种爬虫
- IP归属地查询: 启用/禁用IP地理位置查询
- IP138 API Token: IP138接口的访问令牌,留空将使用默认token
- 本地IP数据库: 启用/禁用本地IP归属地数据库,优先从本地查询以提高性能
- IP归属地缓存天数: 本地IP归属地数据的缓存天数
- 自动清理IP数据: 启用/禁用自动清理过期的IP归属地数据
- 异步IP查询: 首次访问未知IP时,插件由服务端后台进程/定时任务回填归属地,不阻塞页面加载
- 访问频率限制: 启用/禁用高频访问拦截功能,防止恶意刷量
- 限流窗口时间: 统计访问频率的时间窗口(秒)
- 限流阈值: 在窗口时间内允许的最大访问次数
- 热门文章数量: 设置显示的热门文章数量
- 重复访问间隔: 防止刷量的时间间隔设置
- 自动清理过期记录: 启用/禁用自动清理功能
- 记录保留天数: 设置访问记录的保留天数
- 启用缓存: 启用/禁用热门文章列表缓存功能
- 缓存更新间隔: 设置缓存文件的更新间隔时间(秒)
- 缓存文件位置: 设置缓存文件的存放路径
- 访问来源统计: 启用/禁用访问来源统计功能
参见 https://h89.cn/ 右侧"近期热门"
- 将当前项目所有文件放文件夹RecentViewsCounter,上传到typecho的
usr/plugins/目录 - 在后台插件管理中激活插件RecentViewsCounter
- 在管理菜单中点击"近期统计"查看数据
- 根据需要调整插件配置
- 查看IP统计、地域分布、爬虫访问等详细数据
- 查看文章访问记录: 在"近期热门文章"列表中点击"访问记录"查看单篇文章的详细访问信息
- 查看IP访问详情: 在"访问最多的IP地址"列表中点击"查看详情"查看该IP的完整访问历史
- 使用数据管理功能清理过期记录和缓存
如果您想在主题的侧边栏中显示近期热门文章,可以在主题的 sidebar.php 文件中添加以下代码:
<?php
// 近期热门功能 -https://github.com/chenjim/RecentViewsCounter
if (class_exists('RecentViewsCounter_Plugin')) {
echo RecentViewsCounter_Plugin::renderRecentHotArticles(8, $this, '近期热门', '暂无近期热门文章');
}
?>效果参见 https://h89.cn/
插件已通过 Widget_Archive::footer 钩子自动注入前端 JS(assets/visit-records.js),主题无需额外引入。只需在模板中添加链接即可:
<a href="javascript:void(0)"
onclick="showVisitRecords(<?php echo $this->cid; ?>, '<?php echo htmlspecialchars(addslashes($this->title)); ?>')"
style="color: #467b96; text-decoration: none;"
title="查看该文章的访问记录">查看记录</a>通常在 post.php、archive.php、index.php 等文章列表模板中添加。
class_exists('RecentViewsCounter_Plugin'): 检查插件是否已激活getTopArticlesThisMonth(8): 获取近期访问量前8的文章,可根据需要调整数量Typecho_Db::get(): 获取数据库连接,用于查询文章完整信息Typecho_Router::url(): 生成正确的文章链接htmlspecialchars(): 防止XSS攻击,安全显示文章标题
您可以通过CSS自定义热门文章列表的样式:
.widget-list li {
margin: 5px 0;
line-height: 1.6;
}
.widget-list a {
text-decoration: none;
color: #333;
}
.widget-list a:hover {
color: #0066cc;
}RecentViewsCounter_Plugin::getMonthlyViews($cid);RecentViewsCounter_Plugin::getTopArticlesThisMonth($limit);RecentViewsCounter_Plugin::getTopArticlesWithFullInfo($limit, $widget);RecentViewsCounter_Plugin::renderRecentHotArticles($limit, $widget, $title, $emptyText);RecentViewsCounter_Plugin::getRefererStats($days);// IP 定位类库(lib/IpLookup.php)
RecentViewsCounter_IpLookup::getIpLocation($ip);RecentViewsCounter_IpLookup::updateIpLocationAsync($ip);RecentViewsCounter_IpLookup::getIpLocationFromIp138($ip);RecentViewsCounter_Plugin::getDatabaseStats();RecentViewsCounter_Plugin::getMonthlyStats($months);RecentViewsCounter_Plugin::updateMonthlyStats();RecentViewsCounter_Plugin::manualCleanOldRecords($days);插件会自动创建以下数据表:
- 访问记录表
typecho_views_records - 月度统计表
typecho_monthly_stats - IP归属地本地数据库表
typecho_ip_location
- 插件会自动清理超过指定天数的访问记录
- 清理操作随机触发(约1%概率),避免影响性能
- 可在插件配置中设置保留天数和开启/关闭自动清理
- 在管理界面的"数据库统计"部分可手动清理过期记录
- 支持自定义清理天数
- 提供数据库统计信息,包括总记录数、最近30天记录数等
- 插件支持XML文件缓存,大幅提升热门文章列表的查询性能
- 缓存文件按设定的时间间隔自动更新
- 首次访问或缓存过期时会自动从数据库查询并生成新缓存
- 在管理界面的"缓存信息"部分可查看缓存状态
- 支持手动清理缓存文件,强制重新生成
- 缓存文件存储为XML格式,便于调试和维护
- 启用缓存后,热门文章列表查询速度提升显著
- 建议设置合理的缓存间隔(如1小时),平衡性能和数据实时性
- 缓存文件较小,对服务器存储空间影响微乎其微
IP 归属地由 cron-update-ip-locations.php 回填,绕过广告拦截器屏蔽,无需浏览器端追踪像素。
cron-update-ip-locations.php— 每次批量处理 30 个未查询 IP(2s 间隔避免 API 限频),在真实访问时自动触发- 查询成功 → 写入
typecho_ip_location缓存表 + 回填typecho_views_records.location - 查询失败 → 标记
Unknown,不再重复轮询
- 异步IP查询: 未知IP由
cron-update-ip-locations.php自动回填归属地,首次访问可能显示为空,后续访问显示正确归属地信息 - 插件会自动清理过期记录,无需手动维护
- 插件会自动排除管理员的访问记录
- 清理操作不可恢复,请谨慎操作
- 缓存文件存放目录需要有写入权限
- 缓存功能可根据需要启用或禁用
- 插件兼容MySQL严格模式(sql_mode=only_full_group_by)
- 数据库查询已优化,支持高并发访问场景
- 访问频率限制功能可能影响正常用户访问,请合理设置阈值
- 本地IP数据库会占用一定存储空间,可根据需要启用自动清理
- 访问来源统计依赖HTTP Referer头,某些情况下可能不准确
- IP查询接口: 插件优先使用IP138接口,备用ip-api.com接口,确保查询成功率
- 性能优化: IP 归属地查询在后台进程/定时任务中完成,页面响应不受影响
- 版本: 1.1.0
- 兼容: Typecho 1.0+
- 作者: chenjim
- 插件地址: https://github.com/chenjim/RecentViewsCounter
- 🛡️ AJAX 端点 Referer 校验覆盖所有 POST 操作,防止外部直接调用获取数据
- 📦 前端访问记录 JS 独立为 assets/visit-records.js,panel.js 复用统一定义
- 🧹 从主题 footer.php 移除 ~160 行内联 JS,换主题无需同步迁移
- 🛡️ IP黑名单功能完善:SQLite唯一索引、filter_var校验、403/429状态码修复
- 🎨 黑名单管理合并到统计面板(标签切换),删除独立 BlacklistPanel.php
- 🔍 IP详情弹窗新增「加入黑名单」按钮
- 📦 JS独立提取到 assets/panel.js(Panel.php 代码量减少 43%)
- ♻️ IP定位方法提取到 lib/IpLookup.php(Plugin.php 代码量减少 25%)
- ⚡ 改由服务端后台进程/定时任务回填 IP 归属地,移除阻塞式 shutdown 调用
- 🔧 ip-api.com 改用 HTTP(免费版不支持 HTTPS)
- 📝 插件配置说明和 README 同步更新
升级提示:升级到 v1.1.0 后,请在后台 停用并重新启用 插件,否则新增的后台 IP 归属地回填和统计面板路由不会生效。
- 🎉 初始版本发布
- 📊 完整的访问统计功能
- 🌍 IP归属地自动查询和本地数据库支持
- 📈 热门文章排行榜和近期热门功能
- 📅 访问趋势图表和每日统计
- 📆 月度访问统计功能和历史数据保存
- 👥 独立访客数量统计
- 🔍 详细的访问记录查看功能
- 📋 文章访问记录详情查看
- 🌐 IP访问统计和地域分布分析
- 🔎 IP访问详情查看,支持查看每个IP的完整访问历史
- 🤖 智能识别搜索引擎爬虫访问(支持30+种爬虫)
- 📈 月度访问趋势折线图显示(最近24个月)
- 🗂️ 完善的数据管理和清理功能
- ⚡ 缓存机制支持,提升查询性能
- ⚙️ 灵活的配置选项和主题集成支持
- 🔧 优化数据库查询性能和界面体验
- 🛡️ MySQL严格模式兼容性支持
- 📝 完善的API接口和文档说明
- 🎨 一键调用接口,简化主题集成











