よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

はてなブログのOauth認証でAccessTokenを取得するコード

呟き はてなブログOauth認証アプリ開発PIN取得成功の続きです。
コードを書いておりませんでした。
今回はそのコードを書きます。



【参考】
qiita 一番分かりやすい OAuth の説明 : qiita 一番分かりやすい OAuth の説明

lisz-works : lisz-works Python3 はてな APIのOauth認証(ほぼコピペでOK)
コードはこちらを参考にさせて頂きました。ありがとうございました。



動作環境


PCとスマホで確認しました。

・Windows10
Anaconda


Androidスマホ
termux

・両方ともPython 3.7.3



目次




目的


事前にここのアプリケーション登録でconsumer keyconsumer secretを取得しておきます。
その2つを使って、新たにaccess tokenaccess token secret(と処理途中でPINコードも)をはてなのサーバーから取得すること。



実行方法


コマンドラインから実行用ファイルを実行します。
はてなのサーバーに接続するのでインターネット環境が必要です。



処理内容


実行すると、まずconsumer keyconsumer secretcallback urlを使ってrequest_urlにpostし、request tokenというものを取得します。
ブラウザが起動し、「外部アプリケーションの連携」をするかどうか尋ねられます。「許可する」とPINコードが表示されますのでコピーし、それをコマンドラインに入力することによりaccess tokenaccess token secretが取得されます。
PINコードはAccessTokenが得られた後は記録しておく必要はありません。
ブラウザの起動方法がOSによって違うので、環境に合わせて使ってください。



作成するpyファイルについて


3つ作ります。同じフォルダに保存してください。

  1. 設定用configファイル。keyやsecretなどを書いておく
  2. 実行用のpyファイル2つ(Windows用とAndroidのtermux用)。access token と secret と PIN を取得する



1 設定用ファイル
設定用に使います。consumer keyconsumer secretaccess tokenaccess token secretと、その他のurlを記入しておきます。
keysecretを直に実行用のコード内に書いてもいいんでしょうけど、セキュリティ的に分けて書き、参照する形にした方がいいらしいということでファイル2と別けています。



2 目的ブツ取得のための実行用ファイル
実行用です。このファイルをターミナルから実行するとaccess token 他の取得がなされます。



ファイル作成


ここから実際にファイルを作成していきます。

ファイル1 設定用


設定用ファイル

実行時に読み込まれます。何の動作もしません。
※ 実行前にconsumer keyconsumer secretを自分のものに書き換えること。(この2つはアプリケーション登録で取得する)

############### キー(秘密・自分用) ###############

CONSUMER_KEY = 'アプリケーション登録で取得したconsumer key'
CONSUMER_SECRET = 'アプリケーション登録で取得したconsumer secret'
ACCESS_TOKEN = '実行後に取得されるaccess token'
ACCESS_TOKEN_SECRET = '実行後に取得されるaccess token secret'


############### Oauth認証URL(共通) ###############

# Temporary Credential Request URL
request_url = 'https://www.hatena.com/oauth/initiate'

# Resource Owner Authorization URL
authorize_url_PC = 'https://www.hatena.ne.jp/oauth/authorize' #pc
authorize_url_SmartPhone = 'https://www.hatena.ne.jp/touch/oauth/authorize' # スマホ
authorize_url_Mobile = 'https://www.hatena.ne.jp/mobile/oauth/authorize' # 携帯電話

# Token Request URL
access_token_url = 'https://www.hatena.com/oauth/token'

# Callback URI
callback_uri = 'oob'



ファイル2-1 Windows実行用


実行用ファイル Windows

このファイルを実行します。
外部ライブラリでrequestsrequests_oauthlibを使っていますので事前にインストールが必要です。

pip install requests requests_oauthlib

# Windows用

import urllib
import webbrowser
import requests
from requests_oauthlib import OAuth1
import hatenablogOauthConfig


########## 設定用ファイル参照 ##########

API_KEY = hatenablogOauthConfig.CONSUMER_KEY

SECRET_KEY = hatenablogOauthConfig.CONSUMER_SECRET

request_url = hatenablogOauthConfig.request_url

authorize_url = hatenablogOauthConfig.authorize_url_PC # PC用URL

access_token_url = hatenablogOauthConfig.access_token_url

callback_uri = hatenablogOauthConfig.callback_uri



########## access token取得関数 ##########

def oauth_requests():
    # request token 取得
    auth = OAuth1(API_KEY, SECRET_KEY, callback_uri=callback_uri)
    r = requests.post(request_url, auth=auth)
    request_token = dict(urllib.parse.parse_qsl(r.text))


    # ユーザー認証
    # ブラウザが開き、ユーザ許可を行う
    webbrowser.open('%s?oauth_token=%s&perms=delete' % (authorize_url, request_token['oauth_token']))


    # 外部アプリ連携のユーザ許可後にコマンドラインに表示される。PINコードを入力する
    oauth_verifier = input("Please input PIN code:")
    auth = OAuth1(
        API_KEY,
        SECRET_KEY,
        request_token['oauth_token'],
        request_token['oauth_token_secret'],
        verifier=oauth_verifier)
    r = requests.post(access_token_url, auth=auth)

    access_token = dict(urllib.parse.parse_qsl(r.text))
    return access_token

if __name__ == '__main__':
    # アクセストークンを取得して、表示する
    print(oauth_requests())

実行後にはターミナルにaccess tokenやaccess token secretなどが記入された辞書が表示されます。



ファイル2-2 AndroidのTermux実行用


実行ファイル Androidのtermux用



PythonsubprocessLinuxコマンドのxdg-openを利用してブラウザを起動させるためにWindowsと別けました。
Androidにtermuxなどxdg-openコマンドが実行できる環境がなければ動きませんので、このファイルは不要です。
動かないようなら

pkg install xdg-open

apt install xdg-open

が必要かも。またはxdg-openコマンドの代わりにtermux-openに変えるとか...
xdg-openコマンドならUbuntu Linuxなどでも動くと思う。知らんけど…
openコマンドにすればMacOSで動くかも、知らんけど…
適当すぎ(*^^)v

# Androidのtermux用

import urllib
import subprocess
import requests
from requests_oauthlib import OAuth1
import hatenablogOauthConfig

# 秘密 ###############################
API_KEY = hatebOauthConfig.CONSUMER_KEY

SECRET_KEY = hatebOauthConfig.CONSUMER_SECRET

request_url = hatebOauthConfig.request_url

authorize_url = hatebOauthConfig.authorize_url

access_token_url = hatebOauthConfig.access_token_url

callback_uri = hatebOauthConfig.callback_uri
######################################

def oauth_requests():
    # Get request token
    auth = OAuth1(API_KEY, SECRET_KEY, callback_uri=callback_uri)
    r = requests.post(request_url, auth=auth)
    request_token = dict(urllib.parse.parse_qsl(r.text))


    # termux用 xdg-openコマンドが動く用
    cmd = ("xdg-open --choose " + authorize_url + "?oauth_token=" + request_token["oauth_token"] +"&perms=delete")

    subprocess.run(cmd.split())


    # ユーザ許可後に表示される、PINコードを入力する
    oauth_verifier = input("Please input PIN code:")
    auth = OAuth1(
        API_KEY,
        SECRET_KEY,
        request_token['oauth_token'],
        request_token['oauth_token_secret'],
        verifier=oauth_verifier)
    r = requests.post(access_token_url, auth=auth)

    access_token = dict(urllib.parse.parse_qsl(r.text))
    return access_token

if __name__ == '__main__':
    # アクセストークンを取得して、表示する
    print(oauth_requests())


こちらもWindows用で実行したのと同じく、access tokenなどが辞書型でターミナルに表示されます。



実行


作成したファイルの1、2-1、2-2は全て同じフォルダに入れておきます。
Android用は必要なければ削除してかまいません。



設定用ファイル1のconsumer keyconsumer secretの部分を自分のものに書き換えてから実行します。
実行はターミナルから

python getAccessTokenForWindows.py



python getAccessTokenForAndroid.py


などと実行用ファイルを指定で。



実行すると

ブラウザが起動し、
→ 外部アプリの連携を求められると思いますので許可する。
PINコードが表示されるのでコピーする。
→ ターミナルにPlease input PIN code:と出ていると思いますので、
→ コピーしたPINコードをペーストしエンターキーを押す。
→ 目的ブツのAccess token等が辞書型でターミナルに表示される。
→ 一応ここでミッション終了だが、

→ 表示されたoauth_token'oauth_token_secretを設定用ファイルのAccess TokenAccess Token Secretの所にそれぞれコピペする。



おわりに


設定ファイルに書き込んであるResource Owner Authorization URLは、PCかスマホか携帯かで別けてありますが、AndroidスマホのtermuxからPC用のURLに接続しても特に問題なくAccessToken等が取得できた。何が違うのかわからん。

あとはHatena Developer Center はてなブログAtomPubにある「ブログエントリー一覧の取得」だとか「ブログエントリーの新規投稿」だとかに従って、コレクションURIへGETやPOSTをするプログラムを実装すれば良い。
全然上手くいかないんだが…



以上です。動かない、コードが間違っているなどありましたらコメント下さいませ。
ありがとうございました。



追記 2019/10/02
肝心のアプリケーションが出来上がりません。簡単に出来そうにない。何度接続しても<response 401>の虚しいUnauthorized for urlがひたすら返ってくる(-_-;)
Oauth認証Pythonによるクライアント開発に関するページは、Twitterやqiitaなら結構新しいものがたくさんありますが、はてなブログのは無いに等しい。Python以外の言語もあまり無さげ。公式ドキュメントも10年ぐらい未更新かつ不親切で、素人にはハードル高い。
そういう訳で、いつ出来上がるか分からんので一旦棚上げという事にしておきます。うぅぅぅ