我最近一直在使用 mechanize 在网络上爬行并做一些事情。我决定写一些算法来以图形方式显示我朋友之间的联系。每个朋友都将是图中的一个节点,如果一个节点是另一个节点的朋友,那么他们之间就会有一条边。本质上只是facebook的共同朋友功能,但我希望它在一个节点表示的图形中,就像一个大蜘蛛网;networkx 库和 matplotlib 可以实现这一点。无论如何,我有一个庞大的字典列表,其中包含我每个朋友的姓名和 ID,如下所示:
friends = [
{
"name": "friendA",
"ID": "99999999999"
},
{
"name": friendB",
"ID": "66666666666"
}
]
所以我一直在使用 mechanize 的浏览器进入图形搜索页面并执行我需要的操作:
import mechanize
import cookielib
cj = cookielibLWPCookieJar()
br = mechanize.Browser()
br.set_cookiejar(cj)
br.addheaders = [('User-Agent', 'Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
br.set_other_stuff(True)
# this will bring me to the Graph API, after I've logged in and stuff of course
# but for simplicity, we'll just assume I've already done that.
br.open("https://developers.facebook.com/tools/explorer/")
在我访问 Graph API 并获得访问令牌之后,我可以执行以下操作。
# find our forms that we need to fill in with necessary information to get mutual friends
for form in br.forms():
print form
1)
<GET https://developers.facebook.com/search application/x-www-form-urlencoded
<HiddenControl(path=) (readonly)>
<TextControl(selection=Search Facebook Developers)>
<SubmitButtonControl(<None>=) (readonly)>>
2)
<POST https://www.facebook.com/logout.php application/x-www-form-urlencoded
<HiddenControl(fb_dtsg=AQAudA2Y) (readonly)>
<HiddenControl(ref=ds) (readonly)>
<HiddenControl(h=AfeHIBr1AyKI-60f) (readonly)>
<SubmitControl(<None>=Log Out) (readonly)>>
3)
<GET https://developers.facebook.com/tools/explorer/ application/x-www-form-urlencoded
<TextControl(access_token=Paste in an existing Access Token or click 'Get Access Token' to generate one)>
<IgnoreControl(<None>=<None>)>
<SubmitControl(<None>=Debug) (readonly)>>
4)
<GET https://developers.facebook.com/tools/explorer/ application/x-www-form-urlencoded
<SelectControl(method=[, *GET, POST, DELETE])>
<TextControl(path=)>
<SubmitControl(<None>=Submit) (readonly)>>
5)
<GET https://developers.facebook.com/tools/explorer/ application/x-www-form-urlencoded
<HiddenControl(<None>=) (readonly)>
<TextareaControl(<None>=Input FQL query, <Tab> to autocomplete)>
<SubmitControl(<None>=Submit) (readonly)>>
如您所见,有五种表格,其中只有两种我们需要填充信息。我们需要将访问令牌传递给索引 2 处的表单 3,我们需要将查询传递给索引 3 处的表单 4。我刚刚生成了一个访问令牌以在另一个浏览器中使用并复制它进入带有变量的python。如果您不熟悉 mechanize,我可以使用br.select_form()选择表单
# select form 3 at index 2 to give access token
br.select_form(nr=2)
# to make sure all we need is writable
br.set_all_readonly(False)
access_token_var = 'AAACEdEose0cBAJ1FwFMNE7eLe4CZBPrz3q1AuKEZBsGKuwosCh8sPpHFLkOz2fZBmCV5uohZBI4SOTvUH4ilQEiPJE5KmEF73EdfzCP26jz7RFc9Kguu'
br['access_token'] = access_token_var
# now select the form to give it a path with what we need, which is form 4 at index 3
br.select_form(nr=3)
br["path"] = "/my_user_id/mutualfriends/friends_user_id"
br.submit()
现在,除了查看 JSON 之外,一切正常,表单选择、填充,甚至提交。当我尝试解析生成的 JSON 响应时,它在浏览器中作为 JSON 库完全可见,在 html 响应中找不到它。包含它的元素是隐藏的。在浏览器中我得到这个:
{
"data": [
{
"name": "some person",
"ID": "3214564851"
}
....
....
....
....
]
}
我只想从我给 Graph API 的路径中获得与共同朋友的 JSON 响应。考虑到这些数据是 API 的全部目的,让这些数据易于解析似乎是他们的首要任务。我目前无法通过 Graph API 迭代生成这些路径响应,而是单独传递路径并彻底复制和粘贴;我不会满足于此。我确定有一种方法可以做到这一点,我只是还没有找到它,非常感谢您的帮助!
编辑:
回答
不久之后我找到了答案......
我一直在寻找并最终找到的 API 是:
https://graph.facebook.com/me/mutualfriends/friend_id?access_token=accessToken
谢谢。