スナックelve 本店

バツイチ40代女の日記です

No.1205  よっしゃ。まず認証いけそう!! C# OAuth認証 はてなAPI

移動前ブクマページ: https://b.hatena.ne.jp/entry/s/elve.hateblo.jp/entry/2017/04/18/210709

実は自分のエントリやブクマがブクマされたことを検索するのが難しいのではないかと危惧しているのですが、とりあえずOAuth認証な。OAuthだかAOuthだかわからなくなるレベルのババァが書いてるから油断するなよw



Visual Studio Community 2017
ダウンロードとインストールくらいはできるぜ←インストール1回失敗したw


んで、新しいプロジェクト->Windowsフォームアプリ選択


ツール-> NuGet->何とかの管理->AsyncOAuthを検索してインストール


クラス追加してまるっとコピー
github.com

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using AsyncOAuth;

namespace WindowsFormsApp1
{
// a sample of hatena client
public class HatenaClient
    {
        readonly string consumerKey;
        readonly string consumerSecret;
        readonly AccessToken accessToken;

        public HatenaClient(string consumerKey, string consumerSecret, AccessToken accessToken)
        {
            this.consumerKey = consumerKey;
            this.consumerSecret = consumerSecret;
            this.accessToken = accessToken;
        }

        // sample flow for Hatena authroize
        public async static Task<AccessToken> AuthorizeSample(string consumerKey, string consumerSecret)
        {
            // create authorizer
            var authorizer = new OAuthAuthorizer(consumerKey, consumerSecret);

            // get request token
            var tokenResponse = await authorizer.GetRequestToken(
                "https://www.hatena.com/oauth/initiate",
                new[] { new KeyValuePair<string, string>("oauth_callback", "oob") },
                new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("scope", "read_public,write_public") }));
            var requestToken = tokenResponse.Token;

            var pinRequestUrl = authorizer.BuildAuthorizeUrl("https://www.hatena.ne.jp/oauth/authorize", requestToken);

            // open browser and get PIN Code
            Process.Start(pinRequestUrl);

            // enter pin
            Console.WriteLine("ENTER PIN");
            var pinCode = Console.ReadLine();

            // get access token
            var accessTokenResponse = await authorizer.GetAccessToken("https://www.hatena.com/oauth/token", requestToken, pinCode);

            // save access token.
            var accessToken = accessTokenResponse.Token;
            Console.WriteLine("Key:" + accessToken.Key);
            Console.WriteLine("Secret:" + accessToken.Secret);

            return accessToken;
        }

        HttpClient CreateOAuthClient()
        {
            return OAuthUtility.CreateOAuthClient(consumerKey, consumerSecret, accessToken);
        }

        public async Task<string> GetMy()
        {
            var client = CreateOAuthClient();

            var json = await client.GetStringAsync("http://n.hatena.com/applications/my.json");
            return json;
        }

        public async Task<string> AppicationStart()
        {
            var client = CreateOAuthClient();

            var response = await client.PostAsync("http://n.hatena.com/applications/start", new StringContent("", Encoding.UTF8));
            return await response.Content.ReadAsStringAsync();
        }
    }
}

フォームにボタンを適当においてダブルクリック
基本こぴぺ
blog.daruyanagi.jp

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Diagnostics;
using System.IO;
using System.Net.Http;
using AsyncOAuth;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            //登録
            //OAuth Consumer Keyプライベート 教えられない1
            //OAuth Consumer Secretプライベート 教えられない2
            //OAuth認証URL
            //Temporary Credential Request URL    https://www.hatena.com/oauth/initiate
            //Resource Owner Authorization URL(PC)   https://www.hatena.ne.jp/oauth/authorize
            //Token Request URL https://www.hatena.com/oauth/token

            var authorizer = new OAuthAuthorizer("教えられない1", "教えられない2");
            var callbackUri = "oob";

            var requestTokenResponse = await authorizer.GetRequestToken(
                "https://www.hatena.com/oauth/initiate",
                new[]
                {
                    new KeyValuePair<string, string>(
                    "oauth_callback",
                    callbackUri
                    )
                },
                new FormUrlEncodedContent(new[] {
                    new KeyValuePair<string, string>(
                    "scope",
                    "read_public,write_public"
                    )
                })
            );

            var requestToken = requestTokenResponse.Token;

            var authorizeUrl = authorizer.BuildAuthorizeUrl(
                "https://www.hatena.ne.jp/touch/oauth/authorize",
                requestToken);

            //標準のブラウザで開いて表示する
            System.Diagnostics.Process.Start(authorizeUrl);
        }
    }
}

これで実行するとハッシュタグ初期化? してねぇ!! って例外を投げられる
main関数に初期化コードコピペ

using System;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using AsyncOAuth;

namespace WindowsFormsApp1
{
 
static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            OAuthUtility.ComputeHash = (key, buffer) => { using (var hmac = new HMACSHA1(key)) { return hmac.ComputeHash(buffer); } };
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

ボタンぽち、で
f:id:elve:20170418210632p:plain
やったねー!!