acokikoy's notes

最近気になる=[NoCode, Shopify], I am..=[Python, ウクレレ, マニュアル車, CMS] LoveなWebディレクター

Python と MT DataAPI で 「お勉強ログ」プログラムを書いたよ - MTはデータ保存箱

この記事は、Movable Type Advent Calendar 2018の18日目です。

adventar.org

プログラムを書いたきっかけ

Web業界にいながら JavaScript もろくに読めない私が、9月に突然 Python のお勉強を始めて 早3ヶ月。 少しずつできることが増えて 楽しい盛りの今日この頃です。

そろそろAPIやClassが扱えるようになりたいと思い、PythonからMovable Type Data API 経由でMTに読み書きするスクリプトを書こうと考えました。

Python2ヶ月目の頃に書いて毎日使っている「お勉強ログ」プログラムがありまして、それをベースにしました。元のはログをiCloud上にテキストファイル保存していたのを、保存先をMTにして読み書きをDataAPI経由にします。

Advent Calendarのテーマが めっちゃ レジェンド 藤本壱 先生の記事とかぶってますが、いまさら気にしない (๑ˇεˇ๑)•¨•.¸¸♪

動作環境

  • 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"と表示して
お し ま い

実行画面のサンプル

f:id:acokikoy:20181218161839p:plain

ログの保存場所:MTコンテンツデータ

  • ログ日時、進捗、ログ本文 の3フィールド、全部1行テキスト型です。
  • ログ日時は、データ識別ラベルを兼ねるため、あえてテキスト型で必須項目にしています。

f:id:acokikoy:20181218161737p:plain

プログラム構成

  • 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メソッド:

f:id:acokikoy:20181218131522p:plain

まとめ

  • Pythonでお勉強履歴をログするプログラムを書きました。
  • データの保存先は MT7 コンテンツタイプを使い、データ読み書きは Data API経由で行いました。
  • 個人的には APIとClassの扱いを勉強できた。GJ>わたし ^^;

では、良いクリスマスを〜