私は最近、mechanize を使用して Web をクロールしたり、何かをしたりしています。友達同士のつながりをグラフィカルに表示するアルゴリズムを書きたいと思いました。各友達はグラフ内のノードになり、ノードが別のノードと友達である場合、それらの間にエッジがあります。基本的には 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)>>
ご覧のとおり、5 つのフォームがあり、そのうちの 2 つだけに情報を入力する必要があります。インデックス 2 にあるフォーム 3 にアクセス トークンを渡す必要があり、インデックス 3 にあるフォーム 4 にクエリを渡す必要があります。別のブラウザーで使用するアクセス トークンを生成してコピーしました。変数を使用して python に変換します。機械化に慣れていない場合は、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の全体的な目的であることを考えると、このデータを簡単に解析できるようにすることが彼らの優先事項であるようです。グラフ API を介してこれらのパス レスポンスを繰り返し生成する代わりに、私は現在、パスを個別に渡し、徹底的にコピー アンド ペーストすることで立ち往生しています。私は解決するつもりはありません。これを行うには欠けている方法があると確信しています。まだ見つけていないので、助けていただければ幸いです。
編集:
答え
その後すぐに答えを見つけました....
私が探していて、最終的に見つけた API は次のとおりです。
https://graph.facebook.com/me/mutualfriends/friend_id?access_token=accessToken
ありがとう。