使用数据存储在 App Engine 上实现"Find Friends by phone number"功能



我的消息应用程序的核心功能之一是允许用户根据自己的电话号码找到同样使用该服务的朋友。像Whatsapp和Snapchat这样的应用程序也有同样的机制。

我正在努力寻找一个能返回大量结果的解决方案。我想知道大多数其他应用程序是如何实现这一广泛实现的功能的。

我目前的实现是有User模型和PhoneUser模型。PhoneUser型号是在用户的电话号码上键入的,该号码已转换为标准E164格式。它有一个KeyProperty将其链接到相应的用户。

class PhoneUser(ndb.Model):
    # id is the phone number in E164 format
    user = ndb.KeyProperty(kind='User', required=True)

当用户注册该服务并允许访问他们的电话联系人时,该应用程序可以从用户的电话簿中获取大量电话号码。1000个数字并非不可能。我将所有这些数字转换为标准化的E164格式,然后为每个数字构建密钥(即ndb.Key("电话用户",PHONE_NUMBER))。有了PhoneUser键的列表,我可以使用ndb.get_multi(list_of_PhoneUser_keys)。这样可以避免查询1000个号码。

理论上,这在假设用户正确输入带有国家代码的电话号码,以便python电话号码库能够解析的情况下运行良好

然而,很多时候情况并非如此,但这种方法需要这样做,因为通过键获取实体需要精确匹配。

这只是我想到的一种方法,它也有缺点。这似乎是应用程序中非常常见的功能,我想知道是否有更好的方法。

在任何情况下,您都需要将电话号码规范化为通用格式(E164)。我们使用libphonenumber,它运行得很好。你可以查看python端口。

我们用搜索用户的国家代码替换朋友电话号码中丢失的国家代码。理由:如果用户没有为其联系人输入国家代码,那么他们可能来自同一个国家。

提示:当你想要实现反向搜索时,事情会变得有趣——通知现有用户他们的一个朋友出现在网络中。

正确的方法是不依赖用户放置城市/县代码和/或前缀。我不知道有谁会用国家代码保存自己的号码,除非他们经常出差。您需要解析并更正这些数字。您可以使用当前地理位置来尝试添加丢失的城市/国家代码,也可以删除不需要的前缀。可能涉及到对目标国家受众的一些研究。

最新更新