Appearance
给论坛/社区加属地标签和同城板块
现在做社区类产品,"属地"几乎是标配了:帖子下面一行小字"来自广东",既能增加真实感,又能减少地域喷子。再进一步,还能做"同城板块",把本地用户聚在一起。
这篇讲讲怎么从零给论坛/社区加属地标签和同城功能。还是用 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")直辖市要小心:北京、上海、重庆、天津,它们的 prov 和 city 都是自己,逻辑上要兼容(直接都用就行)。
同城页面的入口
- 帖子页:在属地标签上做个链接,点进去就是"北京同城";
- 导航:如果用户量集中,可以加"同城"频道。
第三部分:别忘了这几个细节
1. 隐私与克制
属地只展示到省份级就好,别展示到区县、别显示用户精确位置。给用户一个"隐藏属地"的开关,是加分项。合规上,收集IP要告知用户。
2. 移动网络的地域飘移
手机用户的IP归属地可能不准(省级出口问题),导致属地偶尔显示成省会。这在社区场景可接受(本来就只显示省),但如果被用户质疑,可以用IPv6二次查询提升准确率。
3. 防止"属地改来改去"被利用
有些人挂代理想"换个属地"发帖。这种用 ip_type 做辅助:如果是IDC机房IP,至少别显示成普通家庭用户。不过别过度,社区场景简单处理即可。
效果
我帮一个地方论坛加过属地+同城。上线后几个直观变化:
- 帖子里"来自XX"让内容真实感强了不少,地域互喷明显少了(大家知道你在本地);
- 同城板块上线第一周,本地帖子互动率比其他板块高一截;
- 运营做线下活动,直接在同城板块发,转化特别好。
最后
属地标签 + 同城板块,是社区产品的"低成本高回报"功能。技术上都不难,难点在细节(缓存、隐私、兼容、容忍度)做好。照上面一步步来,周末就能上线。