Skip to content

给论坛/社区加属地标签和同城板块

现在做社区类产品,"属地"几乎是标配了:帖子下面一行小字"来自广东",既能增加真实感,又能减少地域喷子。再进一步,还能做"同城板块",把本地用户聚在一起。

这篇讲讲怎么从零给论坛/社区加属地标签和同城功能。还是用 IP9 免费接口。

第一部分:属地标签

核心思路:发帖时查一次,存下来

跟社交平台IP属地一个道理——发帖那一刻查归属地存库,展示时直接读,别实时查

python
def on_post(user_id, ip):
    r = requests.get(f"https://ip9.com.cn/get?ip={ip}", timeout=3)
    d = r.json()
    loc = None
    if d.get("ret") == 200:
        info = d["data"]
        if info.get("country") == "中国" and info.get("prov"):
            loc = info["prov"]           # 国内显示省份
        else:
            loc = info.get("country")    # 海外显示国家
    save_post(user_id, location=loc, ...)

展示

模板里在作者信息下面渲染一行:

html
<span class="post-loc">来自 {{ post.location || '未知' }}</span>

注意点

  • 老帖子:功能上线时,老帖子的 location 是空的,显示"未知"就好,别全量回填(容易把接口打挂);
  • 缓存:用户一天发很多帖,同一IP别每次都查,按用户/按IP缓存(参考"高并发缓存"那篇);
  • IPv6:手机用户很多IPv6,接口必须支持,否则一大片"未知"。

第二部分:同城板块

属地标签是"显示",同城板块是"聚合"。把同城的用户和帖子聚到一起,社区活跃度能上一截。

设计思路

给帖子加两个可检索的字段:

  • prov(省份)
  • city(城市)

发帖时和 location 一起存。然后同城板块就是一次简单的查询:

sql
SELECT * FROM posts
WHERE city = '北京'
ORDER BY created_at DESC
LIMIT 50;

城市怎么判定

python
def get_city(info):
    if not info:
        return None, None
    if info.get("country") != "中国":
        return info.get("country"), None   # 海外按国家
    return info.get("prov"), info.get("city")

直辖市要小心:北京、上海、重庆、天津,它们的 provcity 都是自己,逻辑上要兼容(直接都用就行)。

同城页面的入口

  • 帖子页:在属地标签上做个链接,点进去就是"北京同城";
  • 导航:如果用户量集中,可以加"同城"频道。

第三部分:别忘了这几个细节

1. 隐私与克制

属地只展示到省份级就好,别展示到区县、别显示用户精确位置。给用户一个"隐藏属地"的开关,是加分项。合规上,收集IP要告知用户。

2. 移动网络的地域飘移

手机用户的IP归属地可能不准(省级出口问题),导致属地偶尔显示成省会。这在社区场景可接受(本来就只显示省),但如果被用户质疑,可以用IPv6二次查询提升准确率。

3. 防止"属地改来改去"被利用

有些人挂代理想"换个属地"发帖。这种用 ip_type 做辅助:如果是IDC机房IP,至少别显示成普通家庭用户。不过别过度,社区场景简单处理即可。

效果

我帮一个地方论坛加过属地+同城。上线后几个直观变化:

  • 帖子里"来自XX"让内容真实感强了不少,地域互喷明显少了(大家知道你在本地);
  • 同城板块上线第一周,本地帖子互动率比其他板块高一截;
  • 运营做线下活动,直接在同城板块发,转化特别好。

最后

属地标签 + 同城板块,是社区产品的"低成本高回报"功能。技术上都不难,难点在细节(缓存、隐私、兼容、容忍度)做好。照上面一步步来,周末就能上线。

接口文档:https://www.ip9.com.cn