Twitterのハンドリングを行うクラスです。
(1)MyAuth関数
PINコードを使ってアクセストークンを取得しています。
(2)MyTwitterPost関数
コールされると、authクラス変数の中の文字列をtwitterにpostします。
post失敗した時のエラー処理が甘く、エラーが発生すればプログラムが終了します。
140文字以内かはここで確認しています。
※2012/10/15追記
postする際にしようするURLが古い情報のままだったため、エラーとなる現象が発生していました。
2012/10/12リリースのV1.1.0.0で解消しています。
(3)makeString関数
twitterにpostする文字列を生成しています。
/*
*Twitterハンドリングクラス
*
* ######################################################
* Ver Data Auther Description
* 1.0 12/3/14 ADO131 初版
* 1.1 12/10/12 ADO131 OAuth1.1対応
*
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Net;
using WindowsFormsApplication1;
namespace MyTwitter
{
/// <summary>
///
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
public class MyTwitterProcess
{
//PINコード格納変数
public string mypin;
//Post文字列用変数
private string mypost;
//OAuth用変数
private MyTwitterAuth auth;
//メインフォーム用変数
private MainForm mainform;
//PIN入力受付ダイアログクラス
private MyPINForm subForm;
//twitterアプリ用変数
private string CONSUMER_KEY;
private string CONSUMER_SECRET;
//Post用変数
private Dictionary<string, string> parameters = new Dictionary<string, string>();
/// <summary>
/// コンストラクタ
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
/// <param name="mainform">メインフォームクラス</param>
/// <param name="CONSUMER_KEY">twitter OAuth用キー</param>
/// <param name="CONSUMER_SECRET">twitter OAuth用秘密キー</param>
public MyTwitterProcess(MainForm mainform, string CONSUMER_KEY, string CONSUMER_SECRET)
{
//引数をコピー
this.mainform = mainform;
this.CONSUMER_KEY = CONSUMER_KEY;
this.CONSUMER_SECRET = CONSUMER_SECRET;
//PIN入力受付ダイアログクラス変数準備
subForm = new MyPINForm(this);
//Auth変数生成
auth = new MyTwitterAuth(CONSUMER_KEY, CONSUMER_SECRET);
}
/// <summary>
/// http://msdn.microsoft.com/ja-jp/library/bb383855%28v=vs.90%29.aspx
/// Authを実行する関数
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
public void MyAuth()
{
try
{
// リクエストトークンを取得する
auth.GetRequestToken();
//ブラウザ起動
Process.Start(auth.GetAuthorizeUrl());
//ダイヤログ表示
subForm.ShowDialog();
//入力されていることを確認する
if (mypin.Length != -1)
{
// アクセストークンを取得する
auth.GetAccessToken(mypin);
// アクセストークンを設定に書き込み
mainform.MySetting.saveAfterAuth(auth);
//メッセージ表示
MessageBox.Show("OAuth承認に成功しました");
}
//PINコードが入力されていなかった
else
{
//メッセージ表示
MessageBox.Show("PINコードが入力されませんでした");
}
}
//例外発生
catch (Exception ex)
{
//エラーメッセージ表示
MessageBox.Show(ex.Message);
//プログラム終了
Application.Exit();
}
}
/// <summary>
/// settingファイルからAuth設定情報を読み込む
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
public void readSetting()
{
// 設定ファイルから読み込む
auth = mainform.MySetting.readInitial();
}
/// <summary>
/// 本文文字列だけ設定
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
public void setPostString()
{
//変数クリア
parameters.Clear();
//引数文字列をパラメータに追加("status"は固定)
parameters.Add("status", auth.UrlEncode(mypost));
}
/// <summary>
/// 本文文字列+緯度経度のジオタグを設定
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
/// <param name="flag">ジオタグをつけるかどうか</param>
public void setPostString(bool flag)
{
//引数文字列をパラメータに追加
setPostString();
//ジオタグを付ける
if (flag)
{
//緯度設定
parameters.Add("lat", auth.UrlEncode(mainform.my_MSFSProcess.getLatPosition_Geo()));
//経度設定
parameters.Add("long", auth.UrlEncode(mainform.my_MSFSProcess.getLongPosition_Geo()));
}
}
/// <summary>
/// Postする文字列を生成する関数
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
/// <param name="geoflag">ジオタグをつけるかどうか</param>
/// <param name="Altflg">postする文字列に高度をつけるかどうか</param>
/// <param name="imakoko">今ここ接頭辞文字列</param>
/// <param name="header">postする文字列のヘッダー</param>
/// <param name="footer">postする文字列のフッター</param>
public void makePostString(bool geoflag, bool Altflg, string imakoko, string header, string footer)
{
//場所を取得する
mainform.my_MSFSProcess.getLocations(geoflag);
//入力文字列生成
makeString(imakoko, header, footer, Altflg);
//ポストする内容を生成
setPostString(geoflag);
}
/// <summary>
/// 現在のPost予定文字列の長さを返す関数
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
public int getPostLength()
{
//戻り値用変数
int ret_val;
//文字列がnullの場合
if (mypost == null)
{
//0とする
ret_val = 0;
}
//文字列に文字がある
else
{
//長さをセットする
ret_val = mypost.Length;
}
//戻り値
return ret_val;
}
/// <summary>
/// Twitterにpostする関数
///
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// 1.1 12/10/12 ADO131 OAuth1.1化修正
/// </remarks>
public void MyTwitterPost()
{
//字数チェック
if (mypost.Length <= 140)
{
//ポスト
try
{
//auth.Post("http://twitter.com/statuses/update.xml", parameters);
auth.Post("https://api.twitter.com/1.1/statuses/update.json", parameters);
}
//エラー処理
catch (WebException er)
{
//API制限に当たった場合
if (((HttpWebResponse)er.Response).StatusCode == HttpStatusCode.BadRequest)
{
//メッセージの表示
MessageBox.Show("twitterへのポスト回数制限エラーの模様です。一旦postをやめてください。プログラムは引き続き動作します。");
}
//不明なエラー
else
{
//メッセージの表示
MessageBox.Show("twitterへのポストで不明なエラーが発生しました。終了します : " + er.Status.ToString());
//アプリケーションの終了
Application.Exit();
}
}
}
//字数オーバー
else
{
//メッセージ表示
MessageBox.Show("140文字を超えています!");
}
}
/// <summary>
/// Post文字列生成関数
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
/// <param name="imakoko">いまここ接頭辞</param>
/// <param name="header">post文字列のヘッダー</param>
/// <param name="footer">post文字列のフッター</param>
/// <param name="txtLatitude_post">post文字列用緯度情報</param>
/// <param name="txtLongitude_post">post文字列用経度情報</param>
public int makePostString(string imakoko, string header, string footer, string txtLatitude_post, string txtLongitude_post)
{
//文字列生成
mypost = header + imakoko + "[" + txtLatitude_post + " , " + txtLongitude_post + "] " + footer;
//Post文字列の長さを返す
return mypost.Length;
}
/// <summary>
/// 文字列生成メソッド
/// </summary>
/// <remarks>
/// ######################################################
/// Ver Data Auther Description
/// 1.0 11/6/17 ADO131 初版
/// </remarks>
/// <param name="imakoko">いまここ接頭辞</param>
/// <param name="header">post文字列のヘッダー</param>
/// <param name="footer">post文字列のフッター</param>
/// <param name="flag">post文字列に高度情報を含めるか</param>
public int makeString(string imakoko, string header, string footer, bool flag)
{
//戻り値用変数定義
int ret_val;
//高度情報を含める
if (flag)
{
//MSFSと接続
mainform.my_MSFSProcess.MyMSFSConnect();
//文字列生成
ret_val = makePostString(imakoko, header, " 高度:" + mainform.my_MSFSProcess.getAltitude() + " feet. " + footer,
mainform.my_MSFSProcess.getLatPosition_Post(), mainform.my_MSFSProcess.getLongPosition_Post());
}
//高度情報を含めない
else
{
//MSFSと接続
mainform.my_MSFSProcess.MyMSFSConnect();
//文字列生成
ret_val = makePostString(imakoko, header, footer,
mainform.my_MSFSProcess.getLatPosition_Post(), mainform.my_MSFSProcess.getLongPosition_Post());
}
//戻り値
return ret_val;
}
}
}