Python と MT DataAPI で 「お勉強ログ」プログラムを書いたよ - MTはデータ保存箱
この記事は、Movable Type Advent Calendar 2018の18日目です。
プログラムを書いたきっかけ
Web業界にいながら JavaScript もろくに読めない私が、9月に突然 Python のお勉強を始めて 早3ヶ月。 少しずつできることが増えて 楽しい盛りの今日この頃です。
そろそろAPIやClassが扱えるようになりたいと思い、PythonからMovable Type Data API 経由でMTに読み書きするスクリプトを書こうと考えました。
Python2ヶ月目の頃に書いて毎日使っている「お勉強ログ」プログラムがありまして、それをベースにしました。元のはログをiCloud上にテキストファイル保存していたのを、保存先をMTにして読み書きをDataAPI経由にします。
Advent Calendarのテーマが めっちゃ レジェンド 藤本壱 先生の記事とかぶってますが、いまさら気にしない (๑ˇεˇ๑)•¨•.¸¸♪
- プログラムを書いたきっかけ
- 動作環境
- 処理の流れ
- 実行画面のサンプル
- ログの保存場所:MTコンテンツデータ
- プログラム構成
- 説明: コンテンツデータの一覧読み出し部分(list_contentsメソッド)
- 説明: 新しいログを保存する部分(authenticateメソッド, create_contentメソッド)
- まとめ
動作環境
- MTのバージョン: Movable Type Pro r.4208 (MT7.0)
- DataAPIのバージョン: v4。相手がコンテンツタイプなので 現時点では v4 一択です。
- Pythonは v3.6
- ブラウザ、使いません。実行はターミナルから、電車の中では iPhone / Pythonista 3(神アプリ)から 実行。黒い画面でサクッとログをつけるですよ。
処理の流れ
新しくログを追加していくだけのごくシンプルなスクリプトです。
$ python my_pylog.ppy ターミナルからスクリプト実行 ↓ 直近のログを取得し <--------> DataAPI(GET: list_contents) 整形して表示 ↓ "input new log: (入力)" <--------- ターミナルからログ入力 今回のログを入力 ↓ 現在日時を添えて <--------> DataAPI (POST: create_content) MTに1件投稿 ↓ ”logged: ログ内容" HTTPレスポンスを整形して 投稿結果として表示 ↓ "done"と表示して お し ま い
実行画面のサンプル
ログの保存場所:MTコンテンツデータ
- ログ日時、進捗、ログ本文 の3フィールド、全部1行テキスト型です。
- ログ日時は、データ識別ラベルを兼ねるため、あえてテキスト型で必須項目にしています。
プログラム構成
- my_pylog.py : メイン処理
- mt.py:
- MT周りの操作をまとめて外部ファイル化したもの。
- DataAPIというクラスを用意し、データの読み書き処理はDataAPIクラスのメソッドとして書いた。
説明: コンテンツデータの一覧読み出し部分(list_contentsメソッド)
list_contentsメソッド:
メイン処理側:
list_contentsメソッドの返り値はタプル型で、 - r_status_code : ステータスコード 200(正常終了時) が入ります。 - r_json : レスポンスの内容が dict型で入ります。以下は戻り値の一例です。
# { # 'items': [ # { # コンテンツデータ一件分 # 'author': { # displayName': 'dev_admin', # 'userpicUrl': None # }, # 'basename': '9b86945ae46d286aa54c86dd605096f58ee1f7ff', # 'blog': {'id': '1'}, # 'data': [ #コンテンツデータの各フィールド値 # { # 'data': '2018-12-17 01:52:53', # 'id': '7', # 'label': 'log_id', # 'type': 'single_line_text' # }, # { # 'data': '完成!', 'id': '8', # 'label': 'progress', # 'type': 'single_line_text' # }, # { # 'data': 'PythonでDataAPI完成!', # 'id': '9', # 'label': 'body', # 'type': 'single_line_text' # } # ], # 'date': '2018-12-18T01:52:54+09:00', # 'id': 20, # 'label': '2018-12-18 01:52:53', # 'modifiedDate': '2018-12-18T01:52:54+09:00', # 'status': 'Publish', # 'updatable': False # } # ], # 'totalResults': '11' #コンテンツデータの総数 # }
ちなみにコンテンツデータのidがわかっている時は、get_contentメソッドで1件分だけ取得できます。
get_contentメソッド:
説明: 新しいログを保存する部分(authenticateメソッド, create_contentメソッド)
input() で入力した "進捗" と "ログ本文" 、str型に整形した"現在日時"を MTに投稿します。
投稿するには認証が必要なので、まずauthenticateメソッドで認証、アクセストークンを取得し、 それを添えて create_contentメソッドで投稿します。
メイン処理側:
投稿データのうち、data.label は省略可能みたいです。data.idはないと叱られました。必須。
authenticateメソッド, create_contentメソッド:
まとめ
- Pythonでお勉強履歴をログするプログラムを書きました。
- データの保存先は MT7 コンテンツタイプを使い、データ読み書きは Data API経由で行いました。
- 個人的には APIとClassの扱いを勉強できた。GJ>わたし ^^;
では、良いクリスマスを〜