SkyDrive へ移動
※ VS2010 用
■ テキストファイル(SHIFT_JIS)の内容を OpenFileDialog で開いて読み込む
■ 読み込んだテキストをツイートする
■ ツイートの結果の JSON 内の日本語を元に戻してインデント整形して UTF8N で出力
■ ツイートの結果の JSON を定義したクラスのインスタンスに一括投入後インデント整形して UTF8N で出力
以上の処理を リツイートに対しても行います
JSON の処理は、Json.NET を使用しています(テンプレートに同梱)
1) 整形
JObject jo = JObject.Parse(json);
string json_work = JsonConvert.SerializeObject(jo, Formatting.Indented);
2) デシリアライズと整形
TweetResult tr = JsonConvert.DeserializeObject(json);
json_work = JsonConvert.SerializeObject(tr, Formatting.Indented);
-----
private class TweetResult
{
public string created_at { get; set; }
public string id { get; set; }
public string text { get; set; }
}
Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace TryApp_Tweet1
{
public class Program
{
// 外部テキストファイルを読み込んだ内容
static string text = "まだ読み込まれていません";
static string json = "まだセットされていません";
[STAThreadAttribute]
static void Main(string[] args)
{
App app = new App();
// イベントの追加
app.ShowEnv += MyProc1;
app.GetDir += (string path) =>
{
Console.WriteLine(path + " が選択されました");
string[] filenames = null;
if (path != "") {
filenames = Directory.GetFiles(path);
foreach (string value in filenames) {
Console.WriteLine(value);
}
}
};
// ******************************************
// ファイルを選択
// ******************************************
app.GetFile += (string path) =>
{
// 外部ファイルが SHIFT_JIS で書かれているという前提で読み込む
StreamReader reader = new StreamReader(path, Encoding.GetEncoding("shift_jis"));
// 一気に全て読み込み
text = reader.ReadToEnd();
reader.Close();
Console.WriteLine(path + " が読み込まれました");
};
// ******************************************
// テキストを表示
// ******************************************
app.DisplayText += (string cmd) =>
{
Console.WriteLine(text);
};
// ******************************************
// JSONを表示
// ******************************************
app.DisplayJson += (string cmd) =>
{
JObject jo = JObject.Parse(json);
string json_work = JsonConvert.SerializeObject(jo, Formatting.Indented);
Console.WriteLine(json_work);
};
// ******************************************
// ツイート処理の登録
// ******************************************
// メソッドによる実装
app.Cmd += Tweet;
// ラムダ式による実装
app.Cmd += (string cmd) =>
{
Console.WriteLine(cmd + " が実行されました");
};
// ******************************************
// 終了せずに、コマンドプロンプトを保持する。
// ( "q" で終了 )
// ******************************************
app.Loop();
}
// ******************************************
// 環境周りの情報
// ******************************************
static private void MyProc1(string[] data)
{
foreach (string value in data) {
Console.WriteLine(value);
}
}
// ******************************************
// 処理のテンプレート
// ******************************************
static private void Tweet(string cmd)
{
VS2010_Twitter twitter =
new VS2010_Twitter(
"Consumer key",
"Consumer secret",
"Access token",
"Access token secret"
);
switch (cmd) {
case "tweet":
// 投稿
json = twitter.Tweet(text);
break;
// retweet:id でリツイート
default:
// id を取得する為に、":" で配列に分解
string[] param = cmd.Split(new[] { ":" }, StringSplitOptions.None);
// id でリツイート
json = twitter.ReTweet(param[1]);
break;
}
// 取得した JSON を utf8n で書き込む
string thisPath = Assembly.GetExecutingAssembly().Location;
string thisDir = Path.GetDirectoryName(thisPath);
string path = thisDir + @"\" + "json.txt";
StreamWriter writer = new StreamWriter(path, false, new UTF8Encoding(false));
// JSON の日本語表示を元に戻して整形
JObject jo = JObject.Parse(json);
string json_work = JsonConvert.SerializeObject(jo, Formatting.Indented);
// 書き込み
writer.Write(json_work);
writer.Close();
// オブジェクトに直接投入
TweetResult tr = JsonConvert.DeserializeObject<TweetResult>(json);
Console.WriteLine(tr.created_at);
Console.WriteLine(tr.id);
Console.WriteLine(tr.text);
// クラスに投入した内容を出力
path = thisDir + @"\" + "json2.txt";
writer = new StreamWriter(path, false, new UTF8Encoding(false));
json_work = JsonConvert.SerializeObject(tr, Formatting.Indented);
// 書き込み
writer.Write(json_work);
writer.Close();
}
private class TweetResult
{
public string created_at { get; set; }
public string id { get; set; }
public string text { get; set; }
}
}
}
App.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
using System.Windows.Forms;
namespace TryApp_Tweet1
{
class App
{
// 引数が一つのイベント
public delegate void AppHandler(string cmd);
// 引数が文字列配列のイベント
public delegate void AppHandlerResults(string[] data);
// 環境周りの情報を取得するイベント
public event AppHandlerResults ShowEnv = null;
// フォルダ選択ダイアログ
public event AppHandler GetDir = null;
// ファイル選択ダイアログ
public event AppHandler GetFile = null;
// イベントのテンプレート
public event AppHandler Cmd = null;
// 追加イベント
public event AppHandler DisplayText = null;
public event AppHandler DisplayJson = null;
// ******************************************
// コンストラクタ
// ******************************************
public App()
{
}
// ******************************************
// 終了せずに、コマンドプロンプトを保持する。
// ******************************************
public void Loop()
{
while (true) {
// ******************************************
// 専用プロンプト
// ******************************************
Console.Write("app>");
string line = Console.ReadLine();
// ******************************************
// 終了コマンド
// ******************************************
if (line == "q") {
break;
}
// ******************************************
// 環境周りの情報を取得するイベント
// ******************************************
if (line == "env") {
if (ShowEnv != null) {
// 実行ファイル
string thisPath = Assembly.GetExecutingAssembly().Location;
// 実行ファイルのあるディレクトリ
string thisDir = Path.GetDirectoryName(thisPath);
string[] result = { line, thisPath, thisDir };
ShowEnv(result);
}
}
// ******************************************
// フォルダ選択
// ******************************************
if (line == "dir") {
if (GetDir != null) {
// フォルダ選択ダイアログ
var dir = new FolderBrowserDialog();
dir.SelectedPath = @"c:\";
var result = dir.ShowDialog();
string path = "";
if (result == DialogResult.OK) {
path = dir.SelectedPath;
}
GetDir(path);
}
}
// ******************************************
// フアイル選択
// ******************************************
if (line == "file") {
if (GetFile != null) {
// ファイル選択ダイアログ
var file = new OpenFileDialog();
file.Filter = "全て|*.*|テキスト|*.txt;*.log";
file.FilterIndex = 0;
file.FileName = "";
var dr = file.ShowDialog();
string path = "";
if (dr == DialogResult.OK) {
path = file.FileName;
}
GetFile(path);
}
}
// ******************************************
// イベントのテンプレート
// ******************************************
if (line == "tweet" || (line + " ").Substring(0, 7) == "retweet") {
if (Cmd != null) {
Cmd(line);
}
}
// ******************************************
// 追加のイベント
// ******************************************
if (line == "text") {
if (DisplayText != null) {
DisplayText(line);
}
}
if (line == "json") {
if (DisplayJson != null) {
DisplayJson(line);
}
}
}
}
}
}
関連する記事
■ VS2010_Twitter.cs
■ アプリケーションテスト用コンソールアプリ(TryApp)テンプレート