Skip to content

考勤打卡怎么防止代打卡?用IP归属地校验打卡位置

做行政或者给公司做考勤系统的朋友都清楚一个头疼事:员工在家睡懒觉,手机上装个"虚拟定位"App,就能在钉钉、企业微信里假装自己在公司打卡。上人脸识别?成本高、员工抵触大。其实对很多公司来说,用 IP 归属地做一道位置校验,就能挡住九成以上的代打卡。

一、思路:打卡时校验 IP 归属地

原理很简单:员工在 App 里打卡时,请求会经过公司网络出口或者员工自己的网络。后端拿到打卡请求的 IP,调归属地接口查一下它在哪个城市,跟公司所在城市比对,不一致就标记异常。

  • 公司办公地在杭州,打卡 IP 归属地显示"浙江 杭州"→ 正常
  • 归属地显示"江苏 南京"甚至"广东 深圳"→ 大概率有问题,转人工复核

IP 归属地是城市级的(IP9 中国城市准确率 99.2%),判断"人在哪个城市"足够了;它定位不到街道,也不需要定位到街道——考勤校验本来就是个粗粒度过滤。

二、代码实现(Python)

python
import requests

ALLOWED_CITIES = {'杭州市', '绍兴市'}  # 公司办公城市白名单

def check_clockin(ip):
    # 查指定 IP 的归属地
    r = requests.get(f'https://ip9.com.cn/get?ip={ip}', timeout=3)
    data = r.json()
    if data.get('ret') != 200:
        return {'allow': False, 'reason': '归属地查询失败,请稍后重试'}

    city = data.get('city', '')
    prov = data.get('prov', '')
    if city in ALLOWED_CITIES:
        return {'allow': True, 'location': f'{prov} {city}'}
    # 不在白名单:打卡记为异常,转人工复核
    return {'allow': False, 'location': f'{prov} {city}',
            'reason': f'打卡位置异常({prov} {city}),请联系行政复核'}

员工端拿到结果:正常就直接打卡成功;异常就弹提示,让员工联系行政说明情况。注意别一刀切拒绝——销售出差、分公司员工都是合法场景,异常状态 + 人工复核比硬拦截更实用。

三、进阶:识别虚拟定位软件常用的机房 IP

市面上虚拟定位工具大多走代理或云服务器转发,而这些机器的 IP 归属地有个共同特征:属于 IDC 机房(阿里云、腾讯云、各类小机房),而不是家庭宽带。IP9 的 VIP 版提供 ip_type 字段(ISP=家庭宽带 / BUS=企业 / IDC=机房),可以辅助判断:

python
# VIP 版返回的 ip_type,识别机房 IP
ip_type = data.get('ip_type', '')  # ISP / BUS / IDC
if ip_type == 'IDC':
    score += 1  # 机房 IP,代打卡嫌疑 +1

再配合"一周内归属地频繁跳变"的规则(今天杭州、明天广州、后天又杭州),基本能把脚本挂机、代打卡的行为筛出来。注意 ip_type 是 VIP 版字段,免费版没有;另外员工居家办公用 VPN 连公司也会显示公司城市,规则要留人工复核口子。

四、边界情况要处理好

  1. 手机基站 IP 会漂移:4G/5G 用户跨市出差,归属地可能显示邻市,白名单要包含周边城市或留容错;
  2. IPv6 别漏:现在不少手机网络已经走 IPv6,接口要支持 IPv6 查询(IP9 的 /get 接口 IPv4、IPv6 都支持);
  3. 权限合规:考勤 IP 属于员工个人信息,用之前跟员工沟通清楚,别悄悄采集。

总结

考勤防代打卡,不用上昂贵的人脸设备,后端加一次 IP 归属地校验就能过滤掉大部分问题:查 IP → 对城市白名单 → 异常转人工。接口用 https://ip9.com.cn/get?ip=xxx 即可,免费版 60 次/分钟/IP,公司几百号人打卡完全够用;要识别机房 IP 再加 VIP 版的 ip_type 字段。官网:https://www.ip9.com.cn