一天早上,我醒来,发现电报实现了一项名为“附近的人”的新功能。如果您选择在Telegram上公开分享您的位置,那么您会在列表中显示与您亲近的用户。不仅如此,他们还会看到您距离仪表多远。但是,您无需共享自己的位置即可查看周围人的位置。这些是确定此功能的准确性的完美前提,更重要的是,该功能是否可用于确定附近的Telegram用户的住所。
如果您从未听说过此功能,并且突然想永久删除您的电报帐户,请让我强调一个非常重要的事情:“附近的人”已加入。默认情况下,没人能看到您在Telegram上的距离。您只有按“使自己可见”按钮才能进入其他人的列表。如果您选择尝试一下,请记住在完成后将其禁用。
分享您的位置后,附近的所有Telegram用户都可以查看您的个人资料。如果在您的隐私设置中明确指定,则这可能包括用户句柄,您的名字和姓氏,您的电话号码,您的个人简介以及所有个人资料图片。人们会确切地看到您有多远。陌生人可能会发短信并给您打电话。还值得注意的是,“附近的人”可让您看到附近的公共团体。同样,任何用户都可以阅读所有消息,查看所有共享媒体和链接以及查看所有组成员,而无需实际加入该组。只有积极参与才需要加入。
除非您有非常充分的理由,否则不要在Telegram上公开露面。请注意,您最终将向周围的人公开大量的个人数据。我认为将要阅读本文的大多数人在某种程度上都知道隐私,并且我只能呼吁人们理性思考以谨慎对待此功能。人们要安全在那里!
引入“附近的人”功能后,已经有许多不同的技术机构发出警告。艾哈迈德的笔记是最早向公众和Telegram的漏洞赏金计划报告其影响的笔记之一。 Telegram随后回应说,该功能正在按预期工作,并且用户必须明确同意与周围的其他人共享其位置。这样看来,这项功能很可能会保留。
您是否同意“附近的人”功能的工作方式取决于您。我将在本文结尾分享我的个人想法。无论如何,在深入研究书呆子之前,我想快速切线。如开头所述,我偶然发现了此功能,发现自己想知道它是如何工作的。我告诉我的室友那件事,当时他住在另一个城市。几分钟后,我在附近的人列表的顶部找到了一个新条目:我的室友。
他在手机上欺骗了GPS位置,使自己离我6米远。然后,他分享了用于伪造自己位置的应用的屏幕截图,实际上,他将自己放在了我的卧室里。这意味着不仅为每个用户显示的距离非常准确,而且还非常频繁地更新。我在这里使用“ was”一词是因为Telegram决定从那以后不显示100米以下的任何距离。但是,我们很快就会发现,这只是沧海一粟,而且由于这种变化而造成的精度损失很容易恢复。
与大多数核心组件一样,Telegram的Android Messenger是开源的。这意味着每个人都可以浏览源代码,对其进行复制,对其进行编辑,并使用所需的任何功能创建自己的Telegram应用程序版本。在Android中,用户界面和功能被组织成所谓的活动。因此,“附近的人”功能可在PeopleNearbyActivity中找到。
请求附近用户列表的代码位于sendRequest函数中。每当活动导航到该应用程序且每当该应用程序接收到位置更新时,都会调用该名称。位置更新之间的时间间隔最终由操作系统决定,但是Telegram Android应用程序请求尽快接收更新。
/ *此代码可以在LocationController类中找到。在这里,只要用户移动至少1米或0毫秒后,该应用就会请求接收位置更新。因此,基本上,这是在大声地叫我给我更新。请参阅:https://developer.android.com/reference/android/location/LocationManager#requestLocationUpdates(java.lang.String,%20long,%20float,%20android.location.LocationListener)* / locationManager。 requestLocationUpdates(LocationManager。GPS_PROVIDER,1,0,gpsLocationListener);
调用sendRequest时,该应用将使用最近知道的设备位置,并将其发送到Telegram的服务器。作为回报,该应用会接收附近实体的列表。除了其唯一的电报ID外,这些实体还包含其与提交的坐标的距离(以米为单位)以及到期时间戳记。根据我的发现,公开共享位置的用户会将其过期时间戳记设置为最大有符号整数值0x7fffffff,从技术上讲,它们“永不”过期。
然后,该应用会遍历所有接收到的实体,并将它们放入附近的用户或组的列表中。由于我只对前者感兴趣,因此我可以在将用户添加到各自的列表之前或之后添加我的代码。幸运的是,Telegram源代码包含一个名为FileLog的类,该类将调试信息打印到系统日志以及位于设备外部存储器上的文件日志(如果有)中。因此,我要做的就是在每次位置更新时将用户实体信息转储到文件日志中。
TLRPC。用户user = getMessagesController()。 getUser(peerLocated。peer。user_id); FileLog。 d(String。format(Locale。ENGLISH," peer update [distance =%d,id =%d,displayName = \"%s \&#34 ;, expires =%d]&#34 ;,peerLocated。distance,//以米为单位的距离peerLocated。peer。user_id,//电报ID UserObject。getUserName(user),//显示的名称peerLocated。expires)); //过期时间戳
此外,我使用Android Location API提供的所有功能记录了触发附近用户请求的位置。然后,只需按照Telegram Android应用程序存储库中的说明进行操作,即可将自定义Telegram版本安装到我的Android设备上。然后,我编写了一个简短的Python脚本,将累积的数据输入到SQLite数据库中,以便稍后对其进行一些查询。
因此,现在我们可以将“附近的人”提供的所有数据馈入数据库。我们如何找到我们地区的热门电报用户?假设我们生活在一个完美的世界中,没有任何测量上的误差。我们还假设地球是一个平面(除非您是地球平坦的人,在这种情况下,您不需要进行任何其他的心理体操)。如果我们要查找一个特定用户的坐标,则需要查看每个记录位置的坐标距离。
给定一组已知点到特定点的已知距离,求解点的坐标的过程称为三边测量。在每个记录的位置,我们可以想象一个圆,其半径为到未知点的距离。理想情况下,所有圆都将在恰好相交的一个点处相交。但是,要找到具体的解决方案,我们在平面上至少需要三个点才能解决此问题。
但是我们生活在一个完美的世界中。地球不是平坦的(真是令人震惊!),GPS坐标总是有某种误差。这意味着我们自己和其他用户位置不能准确。圆实际上是椭圆形,曾经映射到地球表面,即使有,也不会在一个位置相交。我们更有可能到达许多已知椭圆重叠的区域,而不是地球表面上的确定点。最重要的是,我们无法确定Telegram实际上为我们提供了准确的测量结果。
幸运的是,这一切都没什么大不了的。让我们回想一下位置,将其作为平面上的点。如果我们对未知点可能在哪里进行了有根据的猜测,那么它与已知点的距离将与我们记录的距离有所不同。这是我们可以计算出的错误,突然之间,在平面上查找点的坐标的任务变成了优化问题。我们正在尝试找到一个点,以使计算出的距离误差最小。
这种优化方法使均方误差最小。对此方法的解释不计其数,我将不讨论其工作方式或原因。相反,我建议您阅读Alan Zucconi的这篇文章,他以三边测量的例子(您猜对了)解释了数学及其在Python中的实现。相反,在研究可视化所有收集的数据的有趣部分之前,我想谈谈我遇到的另一个问题。
我一开始说电报不会显示100米以下的距离。如果有人在您的100米半径范围内,则Telegram只会报告他们与您相距100米,无论他们离您有多近。这不仅出现在前端,而且出现在后端。返回附近用户列表时,Telegram的服务器不会在100米以下。这是一个问题,因为如果有人站在我旁边,如果我认为Telegram报告的距离是理所当然的,我将不得不面对一个非常重大的错误。
从现在开始,我将呼叫记录距离我不到100米的用户的位置简称为“ 100s”。这些100具有在地理位置上靠近用户的属性,但是由于Telegram施加了较低的上限,因此没有使用相关的距离。因此,我选择不使用这些100来进行位置估计,而是对均方误差优化进行初步猜测。如果特定用户没有100,则只需选择报告的距离最小的位置作为起点。
到目前为止,这已经足够了。如果您对确切的实现感到好奇,可以随时检查该项目的存储库。现在是时候进入这个旅程中最激动人心的部分了。
我花了很多时间来创建基于浏览器的界面来浏览收集的数据。 Telegram应用收到位置更新的所有位置都绘制在交互式地图上。右上角的小控制面板允许选择单个用户,调整用于估计用户实际位置的参数以及渲染选项,因为在浏览器中绘制地图并非十分便宜。以下屏幕截图显示了正在使用的用户界面,以及我在星期日下午散步时累积的数据集。请注意,所有用户句柄均被涂黑。
每个位置标记下方都有一个红色圆圈。其半径等于相应记录的水平精度。在整个数据集中,我发现水平精度平均约为12.8米。在45分钟的步行路程中,我设法从205个不同的位置获取数据,平均两次位置更新之间的间隔约为13.3秒。请记住,每当我的位置发生明显变化时,附近最多会有100位用户-如此短的步行路程就会获得大量数据。
当查询不同的用户时,有趣的部分(当然是稍微令人恐惧的部分)开始了。如上一节中的插图所示,半径等于到选定用户的距离的圆被绘制到地图上。这是为了使用户对用户可能位于的位置有一个大概的感觉。如果在100米或更短的距离内有记录用户的任何位置,则相应的标记会被涂成红色。用光彩的金色标记显示计算出的位置估计值。单击时,它将显示确切的纬度和经度。
我发现金色标记总是落在附近有门牌号的某些建筑物或财产上。几乎没有例外,据报道用户离我一公里或十公里似乎并不重要。即使我只沿着街道和人行道行走,上述优化方法仍可精确定位某人的日常生活。
您可能已经在上面的屏幕截图中注意到了橙色标记。这些标记旨在将基本方向归因于距离很远的用户。位置在内部按距离升序排列。此列表中的前几个位置(包括100个位置)在地图上以橙色显示了其相应的标记。在以下屏幕截图中,您会发现橙色标记指向南方。金色标记验证了这一点。
尚无任何数字可知,很明显,只要观察圆圈重叠的位置,就可以非常紧密地缩小用户位置的范围,远低于Telegram施加的100米障碍。将其与估计的位置结合起来,您便可以轻松地开始。剩下要做的就是去那里,检查邮箱及其对应的铭牌,看是否有一个与您选择的Telegram用户手柄匹配。
现在看起来还不错,但是它真的有效吗?提供的信息足以找到合理位置的用户位置吗?我找了室友帮我弄清楚这个。
我室友的工作是再次欺骗他的GPS位置并公开露面。然后,我又去散步,导入了数据,让我的计算机处理了这些数字,并估算了他的下落。然后,我们将我的猜测与他的真实位置进行了比较。我所走的路径与上面的屏幕截图所示的路径相似,不同之处在于我有意专注于尝试尽可能靠近他的虚假位置。在下图中,黄色标记表示基于我收集的数据的估计位置。蓝色标记是我室友的实际位置。
天气不太好,我没能进入他的100米半径范围内。无论如何,我最终仅用标准参数离开了16.3米。通过将GPS定位的最高精确度降低到15米,我可以将最终结果再减少一米。这之所以可能,是因为与周日下午的数据集相比,我记录的GPS坐标要准确得多。
您可能会持怀疑态度,并认为这只是一个幸运的打击,因此我不会怪您。在收集的所有数据集中,我挑选了三个听起来像是真实人的名字,这意味着没有缩写词或明显的昵称。我为这些人做了一些其他的位置估计,然后再走一遍,检查是否可以找到上面有他们名字的门铃。
我只能对一位确实将姓氏作为Telegram用户句柄的用户执行此操作。他们的估计位置最终距离不到十米。我什至没有检查其他两个人的任何现实生活参考,即使在检查了他们假定的邻居中的每所房子之后也是如此。这可能意味着他们的用户句柄确实是虚构的,尽管听起来好像是真实的。
无论如何,很难与我不认识的人一起验证这种方法的正确性。我可以解释地图上的圆圈重叠的位置,然后判断黄色标记是否可能是合理的猜测。与我的室友一起,我实际上可以验证并测量自己离我有多近。在花了很多时间使用“附近的人”功能后,我得出的结论是,Telegram提供的有关附近用户的数据足以显着减少一个人可以位于的区域。
我在一个人烟稀少且电报活跃用户不多的城镇收集数据。我附近的用户列表可以完全管理。因此,我无法预测这种方法在人口密度高的大城镇中的效果如何。我认为在繁忙的城市中GPS结果可能不太准确,但结果可能会有所不同,但是由于撰写本文时的世界状况,我无法真正进行测试。
我保证我会对Telegram的“附近的人”功能发表自己的看法。一方面,我认为Telegram关于用户必须同意才能共享位置的观点是完全正确的。但是,我认为对于以关心用户为荣的应用程序来说,这是非常必要的功能。隐私。您可能会认为是用户出了错,因为他们愿意发布自己的位置,但我认为这根本不符合Telegram的理念。
最让我困扰的是,一个人可以毫不费力地被动窥探附近的用户,而无需共享自己的位置。坏演员只能使用任何伪造的GPS应用程序来找出人们在世界各地的住所。他们可以使用我在这篇文章中描述的完全相同的方法来规避100米的限制并获得一些非常接近的估计。而且,如果他们在技术上有所精通,则可以修改“附近人员”功能,以完全不依赖设备的位置-GPS直接对文字源进行了欺骗。
但是,由于我在一开始已经说过该功能可能不会被删除,因此,我想提供一个潜在的解决方案。不用以米为单位显示距离,Telegram可以通过使用诸如“近”,“远”或“非常远”之类的模糊术语而受益。这些术语的使用不应取决于固定的距离,而应取决于环境因素。如果我们使用固定值来确定邻近度,那么在人口稠密区域中的“闭合”比在乡村小镇中的“闭合”意义要小得多。
当然,Telegram可能会选择在他们显示的距离上增加一些噪音,或者如果人们的距离彼此接近,则将他们分组在一起。我怀疑Telegram开发人员可能已经实现了类似的功能。我在数据集中发现了一些案例,其中Telegram报告多个人与我的距离完全相同。但话又说回来,这里有消除或减少噪音的数学方法。我相信,只有在Telegram选择不公开任何长度单位的距离时,才能正确解决此问题。
我只能鼓励您看一下本文附带的源代码,以便您自己尝试一下。我很高兴通过邮件或Twitter收到您对这项工作的发现和想法的反馈。我试图使它尽可能地易于访问,但是您仍然需要一些技术知识才能使其工作。在您仍然可以的时候,在您的附近闲逛,让我们开心一下,让Telegram会改变这个非常破旧的功能。