はてなブログの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 key
とconsumer secret
を取得しておきます。
その2つを使って、新たにaccess token
とaccess token secret
(と処理途中でPINコード
も)をはてなのサーバーから取得すること。
実行方法
コマンドラインから実行用ファイルを実行します。
はてなのサーバーに接続するのでインターネット環境が必要です。
処理内容
実行すると、まずconsumer key
とconsumer secret
とcallback url
を使ってrequest_url
にpostし、request tokenというものを取得します。
ブラウザが起動し、「外部アプリケーションの連携」をするかどうか尋ねられます。「許可する」とPINコード
が表示されますのでコピーし、それをコマンドラインに入力することによりaccess tokenとaccess token secretが取得されます。
PINコード
はAccessTokenが得られた後は記録しておく必要はありません。
ブラウザの起動方法がOSによって違うので、環境に合わせて使ってください。
作成するpyファイルについて
3つ作ります。同じフォルダに保存してください。
- 設定用configファイル。keyやsecretなどを書いておく
- 実行用のpyファイル2つ(Windows用とAndroidのtermux用)。access token と secret と PIN を取得する
1 設定用ファイル
設定用に使います。consumer key
とconsumer secret
、access token
と access token secret
と、その他のurl
を記入しておきます。
key
やsecret
を直に実行用のコード内に書いてもいいんでしょうけど、セキュリティ的に分けて書き、参照する形にした方がいいらしいということでファイル2
と別けています。
2 目的ブツ取得のための実行用ファイル
実行用です。このファイルをターミナルから実行するとaccess token 他
の取得がなされます。
ファイル作成
ここから実際にファイルを作成していきます。
ファイル1 設定用
設定用ファイル
実行時に読み込まれます。何の動作もしません。
※ 実行前にconsumer key
とconsumer 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用
このファイルを実行します。
外部ライブラリでrequests
とrequests_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用
Pythonのsubprocess
でLinuxコマンドの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 key
とconsumer secret
の部分を自分のものに書き換えてから実行します。
実行はターミナルから
python getAccessTokenForWindows.py
か
python getAccessTokenForAndroid.py
などと実行用ファイルを指定で。
実行すると
→ ブラウザが起動し、
→ 外部アプリの連携を求められると思いますので許可する。
→ PINコードが表示されるのでコピー
する。
→ ターミナルにPlease input PIN code:
と出ていると思いますので、
→ コピーしたPINコードをペースト
しエンターキーを押す。
→ 目的ブツのAccess token等
が辞書型でターミナルに表示される。
→ 一応ここでミッション終了だが、
→ 表示されたoauth_token
と'oauth_token_secret
を設定用ファイルのAccess Token
とAccess 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年ぐらい未更新かつ不親切で、素人にはハードル高い。
そういう訳で、いつ出来上がるか分からんので一旦棚上げという事にしておきます。うぅぅぅ