V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
estk
V2EX  ›  程序员

App 端判断是否是大陆用户的最简洁方式,无需 IP 库

  •  
  •   estk · 74 天前 · 11370 次点击
    这是一个创建于 74 天前的主题,其中的信息可能已经有所发展或是发生改变。

    React Native 为例:

    useEffect(()=>{
      let mainLand = true
      axios(
        'http://google.com',
        {method: 'head', timeout: 10_000}
      ).then(({status})=>{
        if (200===status) {
          mainLand = false
        }
      }).catch(()=>{})
    }, [])
    
    92 条回复    2022-11-22 07:32:34 +08:00
    dcty
        1
    dcty  
       74 天前 via Android   ❤️ 1
    😬 虽然,但是,算了,就酱。
    tanranran
        2
    tanranran  
       74 天前
    延迟有点高
    likunyan
        3
    likunyan  
       74 天前
    不错,客户刚进来的时候就开启尝试
    ilstr
        4
    ilstr  
       74 天前
    这难道不是在对 GFW 做攻击?
    0o0O0o0O0o
        5
    0o0O0o0O0o  
       74 天前 via iPhone
    老梗但并不过时
    shawndev
        6
    shawndev  
       74 天前
    不够快也不够准,所以为什么不用 locale 判断
    ragnaroks
        7
    ragnaroks  
       74 天前   ❤️ 27
    Jooooooooo
        8
    Jooooooooo  
       74 天前
    这其实是没想清楚你要这个判断来干嘛

    很显然 大陆用户(先不说这个定义是什么) 和 访问 google.com 会在一定时间内超时 是两回事

    回到原始的需求, 判断 大陆用户 来做什么呢?
    dcsuibian
        9
    dcsuibian  
       74 天前
    const res=window.confirm('将地区设为中国大陆?')
    agagega
        10
    agagega  
       74 天前
    你先得定义一下大陆用户是什么意思。不过我倒是合理怀疑国产软件会通过给这些域名发请求来判断当前用户是不是在代理状态
    totoro52
        11
    totoro52  
       74 天前
    你这如果挂了 VPN 就能绕过了,一般都会绕过大陆 IP , 更好的方案是搞一个被墙的 IP , 直接 ping 一下即可,也不需要走 http 太慢了
    MrKrabs
        12
    MrKrabs  
       74 天前
    你这会不会害人啊
    Alexf4
        13
    Alexf4  
       74 天前
    @ragnaroks +1 ,实用
    hash
        14
    hash  
       74 天前   ❤️ 25
    典型的外包项目能蒙混过关的错误答案
    Pastsong
        15
    Pastsong  
       74 天前 via Android
    那你至少要等个连接超时的时间吧
    zhangshine
        16
    zhangshine  
       74 天前
    10_000 第一次知道还有这种写法
    janus77
        17
    janus77  
       74 天前
    小项目还真能用,不过也就是能用罢了
    arischow
        18
    arischow  
       74 天前 via iPhone
    😅
    shawndev
        19
    shawndev  
       74 天前
    Hosts 就可以
    xingstar
        20
    xingstar  
       74 天前
    这个方法挺骚操作的啊,涨知识了😂
    lambdaq
        21
    lambdaq  
       74 天前
    你这访问的是 http ?

    我直接 hosts 改得飞起。
    YY
        22
    YY  
       74 天前
    dns 劫持呢
    wellerman
        23
    wellerman  
       74 天前
    哈哈哈 可以,又不是不能用。
    qingmuhy0
        24
    qingmuhy0  
       74 天前 via iPhone   ❤️ 3
    把网址换成 lun 子是不是正确率更高,这样子伊朗什么的也不会获得中国国籍。
    spicy777
        25
    spicy777  
       74 天前
    <a href="javascript:alert('清除成功');">清除缓存</a>
    yaott2020
        26
    yaott2020  
       74 天前 via Android   ❤️ 14
    @ragnaroks 用 cf 国内站更好: https://cf-ns.com/cdn-cgi/trace
    LZSZ
        27
    LZSZ  
       74 天前
    时区 运营商
    lang1pal
        28
    lang1pal  
       74 天前
    有墙的好像不仅仅只有大陆
    makelove
        29
    makelove  
       74 天前
    既然是这种方法,那 ping 政 x 府网站延迟低这个方法比这个快速一点
    docx
        30
    docx  
       74 天前 via iPhone   ❤️ 2
    @ragnaroks @yaott2020 这样本质上还是用了 cf 的 geoip 库
    blankmiss
        31
    blankmiss  
       74 天前
    确实直接取时区 会不会更好一点
    chinalawme
        32
    chinalawme  
       74 天前
    成功访问 http://google.com 会返回 301 ,跳转到 HTTPS 地址,怎么是 200 呢?
    yusteven
        33
    yusteven  
       74 天前 via iPhone
    经典,但是有效
    fisherwei
        34
    fisherwei  
       74 天前
    @chinalawme 我也想说这个问题
    wonderfulcxm
        35
    wonderfulcxm  
       74 天前 via iPhone
    哈哈,这个思路可以
    estk
        36
    estk  
    OP
       74 天前 via Android
    @chinalawme #32
    实践中真是 200 ,我估计 axios 自动跳转,直到最后一层不用跳才停
    estk
        37
    estk  
    OP
       74 天前 via Android
    @chinalawme #32
    不过你提醒我了,这样跳效率更差
    estk
        38
    estk  
    OP
       74 天前 via Android
    @Pastsong #15
    所以 mainLand 变量默认 true ,超时说明他就是打不开谷歌
    yaott2020
        39
    yaott2020  
       74 天前 via Android
    @docx 这是站点直接返回的客户端地址,和 geoip 无关
    yaott2020
        40
    yaott2020  
       74 天前 via Android   ❤️ 1
    @docx 如果说是 loc 的话,确实。你可以用 ip 字段自己请求其他的 geoip api
    estk
        41
    estk  
    OP
       74 天前 via Android
    @lang1pal #28
    那种地区在我看来也是“大陆”
    jinliming2
        42
    jinliming2  
       74 天前 via iPhone
    @zhangshine #16 这是 ES2021 的新语法糖 Numeric Separators ,Chrome 75 开始支持
    WinkeyLin
        43
    WinkeyLin  
       74 天前   ❤️ 1
    慕名而来,都能上 V2EX 了为什么会想出这种方法
    Keanuo
        44
    Keanuo  
       74 天前
    有用,且幽默
    cvbnt
        45
    cvbnt  
       74 天前 via Android
    我怀疑你想 ddos gfw ,但我没有证据
    aladdinding
        46
    aladdinding  
       74 天前
    http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 看 IP 就行

    根据这个生一个排序好的 IP 地址,直接二分查找就行 log(n)
    mofe
        47
    mofe  
       74 天前 via iPhone   ❤️ 5
    发现这俩一起用甚至能检测是否用了代理……
    https://www.cloudflare.com/cdn-cgi/trace
    https://cf-ns.com/cdn-cgi/trace
    用了代理返回结果不一样……
    alexmy
        48
    alexmy  
       74 天前
    盲目猜测,应该是产品不对大陆开放吧?比如 小说 app?
    teenight
        50
    teenight  
       74 天前 via iPhone
    能用,有效,赞一个
    bs10081
        51
    bs10081  
       74 天前
    remember5
        52
    remember5  
       74 天前
    @mofe #47 一样,两次访问检测的 ip 不一样
    VYSE
        53
    VYSE  
       74 天前 via Android
    @estk 关了 follow redirect ,这样就多跳了个 http
    Terminl
        54
    Terminl  
       74 天前
    离谱
    natsukage
        55
    natsukage  
       74 天前 via iPhone   ❤️ 1
    什么主播女孩重度依赖(汗)
    xinge666
        56
    xinge666  
       73 天前 via iPhone
    实用性不高 像我这种 24 小时开着分流代理的 就没用了
    baobao1270
        57
    baobao1270  
       73 天前   ❤️ 1
    @shawndev 因为用 locale 不优雅。

    很多程序员都假设“世界上只有一个时区”、“世界上只有两种 locale”,导致了很多 bug
    WildCat
        58
    WildCat  
       73 天前
    @Jooooooooo 网络安全法,个人信息保护法。
    sunorg
        59
    sunorg  
       73 天前 via Android
    estk
        60
    estk  
    OP
       73 天前 via Android
    @xinge666 #56
    这类用户在我看来就不是“大陆用户”
    KuroNekoFan
        61
    KuroNekoFan  
       73 天前
    这种伪代码至少 5 年前就见过
    S179276SP
        62
    S179276SP  
       73 天前
    @lang1pal 屏蔽谷歌搜索的还真就只有大陆,土库曼斯坦都能打开
    wobuhuicode
        63
    wobuhuicode  
       73 天前
    几年前的代码就用这个判断了。后来嫌这个判断需要等待太久。
    就把 APP 分成了两个,google play 上一个,国内上一个。进入 App ,0 延迟判断。
    huangqihong
        64
    huangqihong  
       73 天前
    tiktok 我安装后,即使挂了火箭,还是不行,非要下了 sim 卡才行,平板就好多了
    hervey0424
        65
    hervey0424  
       73 天前
    完了, 我不是大陆用户了
    TWorldIsNButThis
        66
    TWorldIsNButThis  
       73 天前 via iPhone
    @zhangshine 看过不少国外的示例代码里这么写 比较符合英语的习惯
    codehz
        67
    codehz  
       73 天前   ❤️ 2
    最简单的方法就是判断 sim 卡地区呀,没 sim 卡就当作模拟器,模拟 sim 卡地区可麻烦了,至少能挡掉一大堆人
    xiaojun1994
        68
    xiaojun1994  
       73 天前
    我要是开了 vpn 呢
    foursking
        69
    foursking  
       73 天前
    你觉得自己很幽默吗
    estk
        70
    estk  
    OP
       73 天前 via Android
    @xiaojun1994 #68
    这种情况你打开淘宝也是海外版界面
    xuelu520
        71
    xuelu520  
       73 天前
    请求超时时间太长了,直接解析 DNS 吧,速度快很多。
    Jooooooooo
        72
    Jooooooooo  
       73 天前
    @WildCat 那用梯子的用户岂不是被漏过去了. 违法了呀.
    starXx
        73
    starXx  
       73 天前
    公司是可以申请外网访问的,ip 还是正常的省份;算了,还是一楼说得对
    estk
        74
    estk  
    OP
       73 天前
    @Jooooooooo #72
    能出墙的用户我们一般都不当做“大陆用户”
    S179276SP
        75
    S179276SP  
       73 天前
    @starXx 你访问外网的 IP ,还是在 CNNIC 下的大陆 IP 地址么?
    www.v2ex.com/t/836788
    sherlockwhite
        76
    sherlockwhite  
       73 天前   ❤️ 1
    其实就是有能力访问谷歌的认作自由世界的用户,不能访问谷歌的就不是我们用户
    sherlockwhite
        77
    sherlockwhite  
       73 天前
    你们会默认走系统代理嘛,
    shawndev
        78
    shawndev  
       73 天前
    @baobao1270 难道能不能访问谷歌作为单一维度就准确且优雅了?笑话。
    AlphaTauriHonda
        79
    AlphaTauriHonda  
       73 天前 via iPhone
    @S179276SP 🧱内的 IP 不过🧱有挺多的。我发过不少。
    再发一些,大部分地理位置都在🧱内。
    113.21.238.1 116.214.132.1 211.147.79.1 103.204.72.1 222.126.128.1 220.231.32.1 218.96.64.1 43.225.84.1 103.98.125.1 118.26.96.1 103.98.248.1 211.151.207.1 43.254.64.1 43.229.142.1 123.49.242.1
    Jooooooooo
        80
    Jooooooooo  
       73 天前
    @estk 和法务确认过说这么做合规吗?
    AlphaTauriHonda
        81
    AlphaTauriHonda  
       73 天前 via iPhone
    上面这些 IP 属于大陆,Cloudflare 的 loc 也应该是 cn ,不过这些 IP 能访问 Google ,而且它们连接墙内墙外都不会过墙。
    所以用这些 IP 上网的人属于大陆用户吗?
    x1aoYao
        82
    x1aoYao  
       73 天前
    @aladdinding 嗯。我用 rust 写过一个根据这 5 大 RIR 公开数据,解析成一个区间树(底层就是 B-Tree),用来查找 IP 对应的国家 /地区代码
    https://github.com/bnyu/ip2c
    lisxour
        83
    lisxour  
       73 天前
    @mofe 不一样只是因为你只代理了非大陆网站。。。
    gujuji
        84
    gujuji  
       73 天前 via iPhone
    @zhangshine 这个是啥意思啊,没看懂 10-1000
    zhangtest
        85
    zhangtest  
       73 天前
    写代码也得符合特色国情,这种方式是中国人特权,应该推广开来,让其他国家羡慕一下。
    zhangshine
        86
    zhangshine  
       73 天前
    @gujuji 看 #42 , 新的语法糖,增加可读性
    Radom
        87
    Radom  
       73 天前
    这个确实很牛。
    gujuji
        88
    gujuji  
       73 天前 via iPhone
    @zhangshine 想起来了,想起来了哈哈哈,
    CaptainD
        89
    CaptainD  
       73 天前
    我不能访问 Google = 我在大陆
    allenzhangSB
        90
    allenzhangSB  
       73 天前
    我为什么要点进这个帖子
    muhuan
        91
    muhuan  
       73 天前
    curl -L ip.tool.lu
    yanheqi
        92
    yanheqi  
       72 天前 via iPhone
    这和 clash for Windows 检测网络联通性的测速网址有什么区别呢? https://ybfl.xyz/202.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   327 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 122ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.