TwitterとFacebookへの同時投稿を行う(後編)

2013年4月3日(水)
薬師寺 国安

空白のページの作成(FacebookInfoPage.xaml)

VS2012のメニューから「プロジェクト(P)/新しい項目の追加(W)」と選択して「Windows ストア」の「空白のページ」を選択します。「名前(N)」には、FacebookInfoPage.xamlと指定します。[追加(A)]ボタンをクリックします(図6参照)。

コントロールの配置

FacebookInfoPage.xamlのデザイン画面上に、ツールボックスからデザイン画面上に、TextBlockコントロールを1個配置します。書き出されるXAMLコード、レイアウトは省略します。

モジュールの作成

全てのプロジェクト内で共通して使用する変数を、手っ取り早くモジュール内で宣言しておきます。
VS2012メニューの「プロジェクト(P)/モジュールの追加(M)」と選択し、表示される画面から「モジュール」を選択します。「名前(N)」はデフォルトのModule1.vbのままです。[追加(A)]ボタンをクリックします(図8)。

図8:モジュールを追加する(クリックで拡大)

表示されるモジュールのエディター内にリスト2のPublic変数の宣言を行います。

リスト2 (Module1.vb)

1Option Strict On

Facebookの使用を可能にするクラスの含まれるFacebook名前空間をインポートします。

1Imports Facebook
2Module Module1

文字列型のaccessTokenとFacebookClientクラス型のPublic変数を宣言しておきます。FacebookClientクラスは、Facebookプラットフォームへのアクセスを提供するクラスです。これらの変数はどのプロジェクトからも参照可能になります。

1  Public accessToken As String
2  Public myFB As New FacebookClient
3End Module

次にソリューションエクスプローラー内のFacebookLoginPage.xamlを展開して表示される、FacebookLoginPage.xaml.vbをダブルクリックしてリスト3のコードを記述します。

ロジックコードを記述する

リスト3 (FacebookLoginPage.xaml.vb)

Facebookを使用するのに必要なFacebook名前空間をインポートします。

1Imports Facebook

動的言語ランタイムをサポートするクラスとインターフェイスが用意されている、System.Dynamic名前空間を読み込みます。実行時にメンバを動的に追加および削除できるオブジェクトであるExpandObjectクラスを使用するため、この名前空間のインポートが必要です。

1Imports System.Dynamic
2 
3Public NotInheritable Class FacebookLoginPage
4  Inherits Page

定数メンバ変数ExtendedPermissionsにFacebookのパーミッションを指定しておきます。Facebookのパーミッションについては、下記のページを参照してください。
→ Facebook開発者向けドキュメントの日本語訳とTips

1ConstExtendedPermissions As String = "user_about_me,publish_stream,offline_access,user_photos,read_stream"

定数メンバ変数AppIDに取得したApp IDを指定しておきます。

1ConstAppID As String = "取得したApp ID"

定数メンバ変数AppSecretに取得したApp Secretを指定しておきます。

1ConstAppSecret As String = "取得したApp Secret"

文字列型のメンバ変数myTextを宣言します。

1Dim myText As String

ページがアクティブになった時の処理

MainPage.xamlの[投稿]ボタンクリックで送られた、「投稿内容」をe.Parameterで受け取り、メンバ変数myTextに格納しておきます。

1Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs)
2  myText = CStr(e.Parameter)
3End Sub

WebViewコントロールが読み込まれた時の処理

GetFacebookLoginUrl関数にAppIDと、メンバ変数で指定したパーミッションを指定して、Uri型のオブジェクトloginUrlに格納します。
WebViewのNavigateメソッドにloginUrlを指定します。これで、初めてFacebookにアクセスする場合は、認証の画面が表示されます。

1Private Sub WebView1_Loaded(sender As Object, e As RoutedEventArgs) Handles WebView1.Loaded
2  Dim loginUrlAs Uri= GetFacebookLoginUrl(AppID, ExtendedPermissions)
3  WebView1.Navigate(loginUrl)
4End Sub

Facebookにログインする関数

実行時にメンバを動的に追加および削除できるオブジェクトであるExpandObjectクラスのインスタンス、parametersオブジェクトを作成します。

client_id、redirect_uri、response_type、displayに各値を指定します。

メンバ変数extendedPermissionsが、Nullまたは空、または空白文字だけで構成されていない場合は、scopeにメンバ変数extendedPermissionsの値を指定します。

parametersを引数に、FacebookのOAuthログインurlを取得し、戻り値とします。

01Private Function GetFacebookLoginUrl(AppID As String, extendedPermissions As String) As Uri
02  Dim parameters As Object
03  parameters = New ExpandoObject()
04  parameters.client_id = AppID
05  parameters.redirect_uri = "https://www.facebook.com/connect/login_success.html"
06  parameters.response_type = "token"
07  parameters.display = "popup"
08 
09  If Not String.IsNullOrWhiteSpace(extendedPermissions) Then
10    parameters.scope = extendedPermissions
11  End If
12  Return myFB.GetLoginUrl(parameters)
13End Function

ナビゲーションが完了して、コンテンツがWebViewコントロールに読み込まれた時の処理

Facebook の認証結果を表すFacebookOAuthResultクラス用オブジェクト変数oauthResultを宣言します。

認証が成功した場合は、FacebookClientをAppIDとAppSecretキーで初期化します。
アクセストークンを取得して、モジュールで宣言しているPublic変数accessTokenに格納します。
accessTokenを引数にLoginSucceded関数を実行します。

01Private Sub WebView1_LoadCompleted(sender As Object, e As Navigation.NavigationEventArgs) Handles WebView1.LoadCompleted
02  Dim oauthResult As FacebookOAuthResult = Nothing
03  If Not myFB.TryParseOAuthCallbackUrl(e.Uri, oauthResult) Then
04    Return
05  End If
06 
07  If oauthResult.IsSuccess = True Then
08    myFB = New FacebookClient() With {.AppId = AppID, .AppSecret = AppSecret}
09    accessToken = oauthResult.AccessToken
10    LoginSucceded(accessToken)
11  Else
12    Exit Sub
13  End If
14End Sub

ログインが成功した場合の関数

実行時にメンバを動的に追加および削除できるオブジェクトであるExpandObjectクラスのインスタンス、parametersオブジェクトを作成します。
GetTaskAsyncメソッドのパスに”me”、パラメーターにparameters変数の値を指定して、Facebookサーバーに非同期のGETリクエストを送信します。

access_tokenにモジュールで宣言しているPublic変数accessTokenの値を指定し、WebViewコントロールを非表示にし、FrameのNavigateメソッドで、投稿内容を引数にFacebookInfoPageに遷移します。

非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。

01access_tokenにPublic変数のaccessTokenの値を指定します。fieldsに”id”と指定します。
02  Private Async Sub LoginSucceded(accessToken As String)
03    Dim parameters As Object
04    parameters = New ExpandoObject()
05    parameters.access_token = accessToken
06    parameters.fields = "id"
07    Dim result = Await myFB.GetTaskAsync("me", parameters)
08    parameters.access_token = accessToken
09    WebView1.Visibility = Windows.UI.Xaml.Visibility.Collapsed
10    myFrame.Navigate(GetType(FacebookInfoPage), myText)
11  End Sub
12End Class
薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています