SQLの窓

2013年07月14日


Formアプリ(C#) でFacebookにログインして60日間のアクセストークンを取得して投稿



JSON の処理は行っていませんが、Json.NET がおすすめです

投稿ボタンとテキストエリアは、コントロールの modifiers を public にしているので Form2 より参照可能です。

Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;

namespace Facebook_POST
{
    public partial class Form1 : Form
    {
        public static string app_id = "App ID";
        public static string app_secret = "App Secret";
        public string url_api = "https://www.facebook.com/dialog/oauth/?redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token&client_id="+app_id+"&scope=user_about_me,user_photos,read_stream,publish_stream";
        public string access_token = null;
        public Form2 login = null;

        public Form1()
        {
            InitializeComponent();
        }

        // ***************************************************************
        // 投稿
        // ***************************************************************
        private void button1_Click(object sender, EventArgs e)
        {
            VS2010_Facebook facebook =
                new VS2010_Facebook(
                    app_id,
                    app_secret,
                    access_token
                );

            // ただ投稿するだけなら twitter.Tweet(this.textBox1.Text);
            facebook.Post(this.textBox1.Text, (object _sender, UploadStringCompletedEventArgs _e) =>
            {
                if (_e.Error == null)
                {
                    // JSON
                    String stringResult = _e.Result;
                    MessageBox.Show(_e.Result);
                }
                else
                {
                    MessageBox.Show("通信エラーが発生しました。\r\n" + _e.Error.Message);
                }

            });

        }

        // ***************************************************************
        // ログインダイアログを開く
        // ***************************************************************
        private void button2_Click(object sender, EventArgs e)
        {
            login = new Form2();
            login.ShowDialog(this);
        }
    }
}



ログインは、WebBrowser コントロールで行います。上の画像では、フォームを親コンテナとしてドッキングしています。実際には、ログイン済みなのかまたは、アクセストークンを保存して使う等の実装が必要ですが、ここでは必ずログインし、ログインが成功する事を前提として、Form1 から投稿を行うようになっています。

Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Net;

namespace Facebook_POST
{
    public partial class Form2 : Form
    {
        // 親フォーム参照用の変数
        private Form1 owner = null;

        public Form2()
        {
            InitializeComponent();
        }

        // ***************************************************************
        // 初期処理
        // ***************************************************************
        private void Form2_Load(object sender, EventArgs e)
        {
            // 初期処理として、親フォーム参照用の変数をセット
            owner = this.Owner as Form1;
            // ログイン用のページを表示
            this.webBrowser1.Navigate(new Uri(owner.url_api));
        }

        // ***************************************************************
        // 2時間有効なアクセストークンを取得
        // ***************************************************************
        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            string url = e.Url.ToString();
            if (url.IndexOf("access_token") != -1)
            {
                Debug.WriteLine(url);
                string target_line = url.Substring(url.IndexOf("access_token"));
                string[] separators = new string[1];
                separators[0] = "&";
                string[] part_string = target_line.Split(separators, System.StringSplitOptions.RemoveEmptyEntries);

                Dictionary<string, string> dic = new Dictionary<string, string>();
                separators[0] = "=";
                string[] part_values = null;
                part_values = part_string[0].Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
                dic.Add(part_values[0], part_values[1]);
                part_values = part_string[1].Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
                dic.Add(part_values[0], part_values[1]);

                // 60日間有効なアクセストークンを取得する為の処理
                WebClient webClient = new WebClient();

                webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(get_Token60);
                // 60日間有効なアクセストークンを取得する API
                url = String.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2}",
                    Form1.app_id,
                    Form1.app_secret,
                    dic["access_token"]);

                // 呼び出し
                webClient.DownloadStringAsync(new Uri(url));
            }

        }

        // ***************************************************************
        // 60日間有効なアクセストークンを取得
        // ***************************************************************
        private void get_Token60(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                    Debug.WriteLine(e.Error.Message);
            }
            else
            {
                string new_token_line = e.Result;
                Debug.WriteLine(new_token_line);

                string[] separators = new string[1];
                separators[0] = "&";
                string[] part_string = new_token_line.Split(separators, System.StringSplitOptions.RemoveEmptyEntries);

                Dictionary<string, string> dic = new Dictionary<string, string>();
                separators[0] = "=";
                string[] part_values = null;
                part_values = part_string[0].Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
                dic.Add(part_values[0], part_values[1]);
                part_values = part_string[1].Split(separators, System.StringSplitOptions.RemoveEmptyEntries);
                dic.Add(part_values[0], part_values[1]);

                Debug.WriteLine(dic["access_token"]);

                owner.access_token = dic["access_token"];

                WebClient webClient = new WebClient();

                webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(get_UserInfo);
                string url = String.Format("https://graph.facebook.com/me?access_token={0}",
                    dic["access_token"]);

                webClient.DownloadStringAsync(new Uri(url));
            }
        }

        // ***************************************************************
        // ユーザ情報を取得
        // ( 投稿するだけなら必要ありません )
        // ***************************************************************
        private void get_UserInfo(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                    Debug.WriteLine(e.Error.Message);
            }
            else
            {
                Debug.WriteLine(e.Result);

                // 全ての処理が終わったのでメインページへ戻る
                // ( コントロールの modifiers を public にしているので参照可能 )
                owner.button1.Enabled = true;
                owner.textBox1.Enabled = true;

                // ダイアログを閉じる
                this.Close();
            }
        }

    }
}


VS2010_Facebook.cs

このクラスは実際には、POST しているだけです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace Facebook_POST
{
    class VS2010_Facebook
    {
        private string _app_key;
        private string _app_secret;
        private string _token;

        private string _tweet_api = "https://graph.facebook.com/me/feed";

        public VS2010_Facebook(
            string app_key,
            string app_secret,
            string token
            ) {
                _app_key = app_key;
                _app_secret = app_secret;
                _token = token;
        }

        public void Post(string text,UploadStringCompletedEventHandler newEvent=null)
        {

            WebClient wc = new WebClient();

            if (newEvent != null)
            {
                wc.UploadStringCompleted += newEvent;
            }

            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            // 投稿
            wc.UploadStringAsync(new Uri(_tweet_api), 
                "POST", 
                "message=" + Uri.EscapeDataString(text) + "&access_token=" + _token ); 

        }
    }
}





【VS(C#)の最新記事】
posted by lightbox at 2013-07-14 00:12 | VS(C#) | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり