Facebook是美国社交媒体,总部位于美国加州,成立初期原名为“the face book”,灵感来自美国高中给学生提供的包含照片和联系数据的通讯录(花名册)的昵称,目前尚无官方中文译名,较为广泛的是脸书这个叫法。

玩过Facebook的人应该知道其有一个“限制朋友列表可见”的功能,但通过“共同朋友”,某些条件下可绕过这种限制。本文将提供一种方法、一个工具,将该过程自动化,以找到隐藏朋友数量;使用该工具构建所发现朋友之间关系的网络图,将其友谊呈现出来;用Gephi工具绘制图形,提出一种方法识别图形中的子社群;最后将该过程应用于一个实际的示例场景:检索Mark Zuckerberg的一些隐藏朋友、在图表上进行绘制、识别子社群并以浏览器格式导出最终图形。

1、重建隐藏好友列表

Facebook用户可决定是否要个人资料页面展示好友、哪些人可见。其设置页面中还会显示如下警告:

Facebook隐私设置页面

这是由于Facebook还提供了“共同好友”的功能:展示两个帐户好友的共同点,但前提是其中至少有一个人的朋友列表对当前用户可见。尽管Facebook对用户隐私的关注度持续增温,但通过URL https://www.facebook.com/browse/mutual_friends/?uid= ID1&node= ID2还是可以做到,其中ID1 和ID2 是两个Facebook账号的数字ID。

注意:从不同位置或帐户调用相同功能的Facebook返回结果可能会产生不同结果。还好有共同友功能,让重建目标用户的大部分好友列表成为可能:一个能看到目标好友列表、与目标用户至少有一名共同好友的用户(称为枢轴)即可。从目标的共同好友开始,迭代使用用共同朋友功能,用每个步骤中找到的新朋友作为另一次迭代的输入,直至达到该功能的固定点(即没再找到新朋友)为止。

为展示这种方法的潜力,使用一个简单的Python 工具,让其自动执行上述过程。但在此要温馨提示一下:Facebook 服务条款禁止未经许可进行抓取。所以在未经适当授权的情况下,还是别用该工具了吧。

虽然如此,还是要介绍一下这个工具。工具名为ffff,可自行在Github上下载,这是用Python 3编写的工具,使用的是selenium库和Mozilla geckodriver来打开浏览器并递归访问共同朋友页面。这样做的同时,其会跟踪所找到的好友、以构建网络图(见下文)。为不被Facebook检测为抓到现形,其会在每个请求之间以随机秒数暂停一次。当然也可以减少间隔,但要冒着被平台屏蔽的风险。该过程结束时,其会生成一个csv文件,里面包含所找到的好友列表和一个包含相关图表的gexf文件。

2、建立好友网络图

在将共同好友功能迭代应用到所有目标用户的好友时,还可跟踪目标朋友之间的关系:如发现目标用户T和枢轴用户P之间有共同好友C,则不仅能知道C是目标用户的朋友,还能知道P和C也是朋友。迭代该过程中,可构建出一个在此过程中找到的Facebook好友关系的网络图:节点是用户,边缘是现有的好友关系。ffff工具能可将权重按所观察到关系的次数比例分配给边缘(选项-w)(但在这个场景中意义不大),一个社群中,用户的公共好友列表越多,被观察到的频率也越高。

有了图表,我们就可以在上面运行各种算法、尝试识别网络内的现有社群,可能有助于识别同事、家人、最亲密好友等。

3、实际案例:小扎的好友社群

举个例子,我们将尝试获取马克·扎克伯格的部分Facebook朋友。可用公共朋友列表构建用户关系图:这种情况下无需透视用户; 只需使用其Facebook ID作为目标和支点。

4、找到目标的Facebook ID

我们要知道小扎的Facebook ID。找到Facebook帐户的数字ID的几种方法,可以在谷歌上搜索,也可以自动执行:在浏览器中打开小扎的Facebook个人资料页面,检查HTML源代码(Ctrl + U)。在代码中搜索(Ctrl + F)fb:// profile / ; 应该有两个匹配,后面是两个相同的整数值。小扎的ID号为4,正常用户的数字会有很多。

从源代码中查找Facebook ID

5、寻找支点用户

需要找到至少一个有公共好友列表的帐户(或你所在帐户可见的朋友列表)及至少要有一个与目标共同的好友。通常一个好的办法是查看与目标进行交互的用户,如通过评论或回应了其内容。另外为找到最多的朋友数,支点用户分散在不同社群会更好(如:工作同事、家庭成员、体育好友等)。总之,越多越好。

ffff项目的存储库中有一个名为“fint.py”的辅助脚本,可以自动查找与给定目标配置文件进行交互的用户,其工作方式与ffff相同。

    1pythonfint.py-fufbuser@mediaservice.net -fp fbpassword -d geckodriver.exe -t 4 -ls 10 -lp 10 -lc 5 -lr 5

    以上命令最多爬取目标用户4 (- t)的100条评论(-lc)、最多1000个回应(-lr),最多10个故事(-ls)和10张照片(-lp)),输出是名为4-pivots.txt的文件,包含了一个Facebook ID列表,可以作为ffff(选项-P)的输入。

    使用fint.py找到潜在支点——与小扎互动的用户

    由于目标是公众人物,将所有好友都找一遍也没啥太大意义,因而一个支点好友即可:一篇文章列出了一些其已知的好友,在该名单上,Brian Chesky目前有公共好友列表,可作为支点用户。

    需要找到其Facebook ID、访问Brian Chesky的好友列表页面,我们会看到URL显示如下:

    https://www.facebook.com/brianchesky/friends?

      lst= 100028395012070% 3A 558259929%3A1557309584&source_ref = pb_friends_t

      URL包含了一个参数“lst”,其包含由字符%3A分隔的三段不同的整数值(其是字符“:”的URL编码)。第二段整数是用户ID,本例中为558259929,可以访问https://www.facebook.com/558259929仔细检查ID,并注意它重定向到https://www.facebook.COM / brianchesky

      在URL中查找Facebook ID

      6、用ffff.py找到隐藏好友

      以下部分中显示示例工具在Windows上的虚拟环境中运行。下载geckodriver.exe,并将其放在与python脚本相同的目录中。需要一个有效的Facebook帐户进行抓取。最好是创建一个帐户。在示例中,我们将该帐户的电子邮件地址为“fbuser@mediaservice.net”,密码为“fbpassword”。

      现在万事俱备,测试账户的全部信息如下:

      • Facebook帐户邮箱(选项-fu):fbuser@mediaservice.net

      • Facebook帐户密码(选项-fp):fbpassword

      • 目标帐户ID(选项-t):4

      • 支点帐户ID(选项-p):558259929

      如您已使用fint.py检索可能的枢轴列表,则可以使用选项-P将列表作为输入。

      选项-q用于隐藏浏览器窗口。

        1pythonffff.py-fufbuser@mediaservice.net -fp fbpassword -d geckodriver.exe -t 4 -p 558259929 -q

        要查看所有可用选项,运行python ffff.py -h

        启动程序

        可能该程序会在一段时间后遇到问题,如超时,可用Ctrl+ C中断程序、保存所有结果、恢复的会话文件:

          1pythonffff.py-fufbuser@mediaservice.net -fp fbpassword --resume session-4-2019050812320

          超时后恢复会话

          程序终止后,所有好友都会在屏幕上打印,创建了三个不同的文件(用户ID和日期时间将更改):

          • 4-friends.csv

          • 4-friends.gexf

          • session-4-20190508130137

          CSV文件里是所找到的好友列表,有ID、姓名、资料URL等。.gexf文件里有准备在Gephi中打开的图形再现(稍后将详细介绍)。最后如找到任何新的数据透视表用户,会话文件可用于稍后恢复程序运行。

          程序终止

          7、绘制社群图

          使用Gephi软件绘制小扎的好友图,可能某种方式也可反映其网络中存在的子社群结构。

          首先用Gephi打开.gexf文件。起初看上去一片凌乱:

          初始图

          使用一些布局算法有助于更深入地了解社群图。可以从“概览”选项卡的左下窗口中选择布局。每个布局都有不同参数。运行OpenOrd,再运行ForceAtlas 2.对于后者,我将“Scaling”值设置为10,结果不是很好看。

          运行ForceAtlas2后的图形

          现在尝试使用“Modularity”类将节点划分到不同的社群,可通过屏幕右侧的“statistics”区进行计算。这里可以为“resolution”参数提供一个值:值越小、分区越多(即更多社群)。

          模块化分区节点,分辨率为0.6

          现在可以为每个模块类别分配不同的颜色。在左上角的“外观”选项卡中,选择“节点”>“分区”,并选择“模块类别”作为属性。单击“Palette ...”可配置要使用的颜色;单击“应用”所有节点将根据其模块类别进行着色。如对找到的社群不够满意,可返回模块计算并选择不同的参数;对图表感到满意,就转到顶部菜单中的“预览”选项卡,然后配置最终的图形显示方式、以希望的格式导出。

          小扎的部分好友关系

          如果想要交互式图表,可以探索其他插件(如Sigma Exporter)、以不同的格式导出图形。

          8、结论

          说了这么多,希望你先有个Facebook账号。

          声明:本文来自MottoIN,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。