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_Twitter ❷ Twitter API の自分のアプリのトークンを使って投稿するだけの class Android_Twitter ❸ WSH : VBScript と JavaScript で Twitter に投稿する ❹ Twitter アプリの登録方法と、API キーの利用 ❺ PHP : Twitter 投稿関数( twitter_update ) / cURL 関数 変更履歴 2013-07-09 : 初回投稿 2013-08-22 : ダウンロード(テンプレート追加)
|
|
【Win8 ストアアプリの最新記事】
- C# : HttpClient で Post と Get する汎用 static クラス
- Win8.1 ストアアプリ(JS) : Visual Studio 2013 で Three.js(v65) の WebGLRenderer の動作を確認しました
- WinJS ストア : Three.js を組み込んで、『画像を飛ばす』テンプレート( Bird.js を利用 )
- WinJS ストア : 『背景画像をチェンジする2画面アプリ』のテンプレート
- VS2012ストア(C#) : WebView テンプレート
- VS2012(C#)ストア : ListView Twitter 検索テンプレート
- イラストを背景にして2ページの画面遷移を解りやすくした Windows Store テンプレート
- Win8 ストア(C#) / PDF viewer sample (Windows 8.1)
- ストアアプリの TextBox のスクロールバー
- Win8 ストアアプリの、メモリ上にページを残す画面遷移と、前画面のコントロールの参照
- Win8 ストアアプリで、『選択肢を応答するダイアログ』を簡単に使うための MessageBox クラス
- Win8 ストアから Post 投稿
- Win8ストア XAML の AppBarButtonStyle のContent に指定する 16進数 Unicode の取得
- Win8 ストア : UrlEncode と UrlDecode
- Win8 ストア : HttpClient + XDocument で RSS の取得
- Win8 ストア : リストボックス テンプレート
- Win8 ストア : ファイルアクセス テンプレート
- Win8 ストア : ストアブランク テンプレート
- AppBar テンプレート / Win8 ストアアプリ(C#)
- Windows ストアアプリの AppBar を作成してテストする







