【PowerShell】Facebook の”友達リクエスト”一覧を取得する

たったいま、Tech Party のセッションが終わりました。いろんな意味で終わりましたorz

【IPv6コミュニティ勉強会のご案内】 2011年10月15日  マイクロソフト品川オフィス にて 詳細は 「IPv6勉強会」オフィシャルページ

さて、先日以下の投稿をしました。

【PowerShell】(更新)PowerShell から Facebook にアクセスしてみる ~ Facebook PowerShell Module

これをさらに使いこんでみよう!ということで、今回は自分への「友達リクエスト」を取得してみます。

「友達リクエスト」を PowerShell で取得するには、PowerShell に対して「友達リクエストにアクセス」ための特権(Permissions)が必要です。Facebook では何をするにも情報にアクセスするための特権が必要で、事前にアプリケーションに与えておく必要があります。各特権の識別子は、Facebook の SDK で厳密に決められています。

https://developers.facebook.com/docs/reference/api/permissions/

「友達のリクエストにアクセスする特権」は「read_requests」です。

先日ご紹介した Facebook PowerShell Module は規定では友達リクエストにアクセスすることができません。理由はもちろん、「read_requests」を与えていないからです。

そこで、Facebook PowerShell Module に read_requests 特権を与えてみます。

%UserProfile%\Documents\WindowsPowerShell\Modules\Facebook 配下の「Facebook.ps1」をメモ帳で開いて、以下を追記しましょう。

・ ・ [string[]]$global:FB_DefaultExtendedPermissions = @( "user_about_me", "friends_about_me", "user_events", "friends_events", "user_groups", ・ ・ "user_education_history", "user_likes", "read_requests" ←これを追記する ) ・ ・

追記したら保存して、PowerSell ISE を起動し、facebook module を読み込みましょう。

PS C:\> Import-Module facebook

さらに、Facebook へのコネクションを張ります。

PS C:\> New-FBConnection

ログオンしていなければ、以下のようにログオン画面が表示されます。

image

ログオンが完了すると、ユーザー情報にアクセスするための特権の承認画面が表示されます。

既に、過去に Facebook PowerShell Module を使用したことがあれば、以下のように追加した特権だけを承認する画面が表示されるはずです。

image

「許可する」をクリックすれば、Facebook PowerShell Module に友達リクエストにアクセスするための特権が与えらえます。

ここまでは OK でしょうか。

さっそく友達リクエストを取得してみましょう。

以下のスクリプトを実行してみてください(汚いスクリプトですみません)。

$query = "SELECT uid_from FROM friend_request WHERE uid_to=me()" $Requests = $(Get-FBConnection).query( $query ) $Requests = $Requests.ToString() $Requests = $Requests.Replace("[","") $Requests = $Requests.Replace("{","") $Requests = $Requests.Replace("}","") $Requests = $Requests.Replace("]","") $Requests = $Requests.Split(",") Foreach ($e in $Requests) {     $uid_from = (($e.Split(":"))[1]).Replace("""","")     $query = "select name from user where uid = '$uid_from'"     $(Get-FBConnection).query( $query )     }

リクエストがあれば、以下のような結果が戻ってくるはずです。
※ご協力いただいた皆様、感謝です!心より感謝しつつ承認しちゃいました。

Key                                      Value                                  ---                                        ----- name                                    Yoshiko Honma                          name                                    Maki  Tokutake                         name                                    Ichiro Ota                             name                                    Tomoyuki Hirase                        name                                    Kishima Masakazu

上記のスクリプトについて簡単に解説しておきましょう。

1行目はクエリーを作成している文字列です。SELECT  ~ で始まっている通り、クエリーであることがわかります。これは、Facebook の情報にアクセスするためのクエリーで、Facebook Query Language(FQL)と呼ばれています。

Facebook Query Language (FQL) - Facebook Developers

考え方は、SQL とほぼ同じです。今回は、friend_request テーブルから uid_to が me の条件に合致するレコードを取得しています。

uid_to とはリクエストの送信先であり、値には当然「私自身」を指定します。「私自身」は「me」と表現することができます。

2行目ではクエリーを実行しています。Get-FBConnection コマンドレットで現在ログオンしているユーザーのセッションを取得し、それに対して Query メソッドを実行することでクエリーを実行できます。

以下は、$(Get-FBConnection) のメンバーを取得したものです。Query 以外にも、Get や Put などのメソッドが提供されていることがわかります。

PS C:\> $(Get-FBConnection) |get-member

TypeName: Facebook.FacebookClient

Name MemberType Definition ---- ---------- ---------- DeleteCompleted Event System.EventHandler`1[Facebook.FacebookApiEventAr... GetCompleted Event System.EventHandler`1[Facebook.FacebookApiEventAr... PostCompleted Event System.EventHandler`1[Facebook.FacebookApiEventAr... Batch Method System.Object Batch(Params Facebook.FacebookBatch... BatchAsync Method System.Void BatchAsync(Facebook.FacebookBatchPara... Delete Method System.Object Delete(string path), System.Object ... DeleteAsync Method System.Void DeleteAsync(string path), System.Void... Equals Method bool Equals(System.Object obj) Get Method System.Object Get(string path), System.Object Get... GetAsync Method System.Void GetAsync(string path), System.Void Ge... GetHashCode Method int GetHashCode() GetType Method type GetType() Post Method System.Object Post(string path, System.Collection... PostAsync Method System.Void PostAsync(string path, System.Collect... Query Method System.Object Query(string fql), System.Object Qu... QueryAsync Method System.Void QueryAsync(string fql), System.Void Q... ToString Method string ToString() AccessToken Property System.String AccessToken {get;set;} UseFacebookBeta Property System.Boolean UseFacebookBeta {get;set;} 

メソッドには Query だけでなく、Put も用意されているので、Feed に投稿したりメッセージを送ったり...なんてことも可能です。

下から3行目をご覧ください。ここにもクエリーが書かれています。

これは、friend_request テーブルには name が格納されていないので、取得してきた uid を使って user テーブルを検索しています。

ただ、残念ながら 友達リクエストを自動承認する方法がどうしてもみつからず...ある事例では JavaScript で「承認する」ボタンを押す..なんてものがあったりしましたが...。

...なのできちんと友達かどうかを吟味し、問題ないことを確認してから手動で「承認」する必要があります。

Facebook は今後企業のシステムの一部と化する可能性があります。そんなとき、IT Pro はこうしたコマンドレットを駆使して Facebook の情報を収集したり、逆にFacebookに投稿したりといったテクニックが求められるでしょう。