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#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート