SQLの窓

2013年08月22日


Twitter API の自分のアプリのトークンを使って投稿するだけの class VS2012_Twitter

SkyDrive に移動( Windows8 用テンプレート )

テンプレートの主な機能
❶ Twitter 投稿
❷ ダイアログボックス用クラス
❸ Http 用クラス( Twitter では無く一般的なもの )
❹ 新しいページをメモリ上に保持する為の実装( App.xaml.css )
Twitter API の自分のアプリのトークンを使って投稿するだけの class VS2010_Twitter とは、微妙に違います。 VS2012_Twitter.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;

namespace LBOX_Tool
{
	class VS2012_Twitter
	{
        private string _consumer_key;
        private string _consumer_secret;
        private string _token;
        private string _secret;

        private string _tweet_api = "https://api.twitter.com/1.1/statuses/update.json";

        public VS2012_Twitter (
            string consumer_key,
            string consumer_secret,
            string token,
            string secret
            ) {
                _consumer_key = consumer_key;
                _consumer_secret = consumer_secret;
                _token = token;
                _secret = secret;
        }

        public async Task<string> TweetAsync(string text)
        {

            // ソートされるリスト
			SortedDictionary<string, string> sd = new SortedDictionary<string, string>();
            sd.Add("oauth_consumer_key", _consumer_key);
            sd.Add("oauth_nonce", Nonce());
            sd.Add("oauth_signature_method", "HMAC-SHA1");
            sd.Add("oauth_timestamp", TimeStamp());
            sd.Add("oauth_token", _token);
            sd.Add("oauth_version", "1.0");
            sd.Add("status",  Uri.EscapeDataString(text));

            // http ヘッダ用シグネチャ作成
            string work = "";
            foreach (KeyValuePair<string, string> kvp in sd)
            {
                if (work != "")
                {
                    work += "&";
                }
                work += kvp.Key + "=" + kvp.Value;
            }

            string work2 = "";
            // メソッド
            work2 += "POST" + "&";
            // API URL
            work2 += Uri.EscapeDataString(_tweet_api) + "&";
            // Oauth + データ
            work2 += Uri.EscapeDataString(work);

            // OAuth tool チェック用
            Debug.WriteLine(work2);

            string oauth_signature = Signature(work2);

            // ヘッダ情報を作成
            work = "";
            foreach (KeyValuePair<string, string> kvp in sd)
            {
                // oauth_* のみを使用する
                if (work != "")
                {
                    if (kvp.Key.Substring(0, 6) == "oauth_") {
                        work += ", ";
                    }
                }
                if (kvp.Key.Substring(0, 6) == "oauth_")
                {
                    work += kvp.Key + "=" + Dd(kvp.Value);
                }
            }
            // シグネチャを追加( ヘッダーはソートの必要は無い )
            work += ", oauth_signature=" + Dd(Uri.EscapeDataString(oauth_signature));

            // OAuth tool チェック用
            Debug.WriteLine(work);

			string result = "";
			HttpResponseMessage response = null;
			HttpClient hc = new HttpClient();
			try
			{
				hc.MaxResponseContentBufferSize = int.MaxValue;
				hc.DefaultRequestHeaders.ExpectContinue = false;
				hc.DefaultRequestHeaders.Add("Authorization", "OAuth " + work);

				// 送信処理の準備
				HttpContent content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    { "status",  text }
                });

				response = await hc.PostAsync( _tweet_api, content );
				result = await response.Content.ReadAsStringAsync();
				if (response.IsSuccessStatusCode)
				{
					if (result.Substring(0, 10) == "{\"errors\":")
					{
						result = "ERROR:" + response.StatusCode + ":" + result;
					}
				}
				else
				{
					result = "ERROR:" + response.StatusCode + ":2XX以外:" + result;
				}
			}
			catch (Exception ex)
			{
				result = "ERROR:" + ex.Message;
			}

			return result;

        }

        // ダブルクォートで挟む
        private string Dd(string base_string)
        {
            return "\"" + base_string + "\"";
        }

        private string Nonce()
        {
            Random rand = new Random();
            int nonce = rand.Next(1000000000);
            return nonce.ToString();
        }

        // タイムスタンプ
        private string TimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        // シグネチャ
        private string Signature(string target)
        {
			String signingKey = _consumer_secret + "&";
			signingKey += _secret;

			IBuffer keyMaterial = CryptographicBuffer.ConvertStringToBinary(signingKey, BinaryStringEncoding.Utf8);
			MacAlgorithmProvider hmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
			CryptographicKey macKey = hmacSha1Provider.CreateKey(keyMaterial);
			IBuffer dataToBeSigned = CryptographicBuffer.ConvertStringToBinary(target, BinaryStringEncoding.Utf8);
			IBuffer signatureBuffer = CryptographicEngine.Sign(macKey, dataToBeSigned);
			String signature = CryptographicBuffer.EncodeToBase64String(signatureBuffer);
			return signature;
		}
	}
}


MainPage.xaml.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Diagnostics;
using System.Threading.Tasks;
using LBOX_Tool;

namespace C_Sharp_Twitter1
{
	public sealed partial class MainPage : Page
	{
		public MainPage()
		{
			this.InitializeComponent();
		}

		protected override void OnNavigatedTo(NavigationEventArgs e)
		{
		}

		private async void  Button_Click_1(object sender, RoutedEventArgs e)
		{
			VS2012_Twitter twitter =
				new VS2012_Twitter(
		                    "Consumer key",
		                    "Consumer secret",
		                    "Access token",
		                    "Access token secret"
				);

			string result = await twitter.TweetAsync(this.tweet.Text);
			if (result.Substring(0, 6) != "ERROR:")
			{
				this.Response.Text = result;
			}
			else
			{
				Debug.WriteLine(result);
			}

		}
	}
}

関連する記事Twitter API の自分のアプリのトークンを使って投稿するだけの class VS2010_TwitterTwitter API の自分のアプリのトークンを使って投稿するだけの class Android_TwitterWSH : VBScript と JavaScript で Twitter に投稿するTwitter アプリの登録方法と、API キーの利用PHP : Twitter 投稿関数( twitter_update ) / cURL 関数

変更履歴
2013-07-09 : 初回投稿
2013-08-22 : ダウンロード(テンプレート追加)


タグ:twitter API
【Win8 ストアアプリの最新記事】
posted by lightbox at 2013-08-22 15:45 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり