Movable Type DATA APIを使う

らら
らら

はじめに

前回は、Movable TypeのJavaScript SDKを使わず、データの読み出しだけを行うだけだったけど・・

今回は、書き込みをしかたったので・・とりあえず、Movable Type JavaScript SDKをつかうことにした・・

最終は、コンテンツデータの1レコード単位で、MTユーザーでない、外部ユーザーに投稿させて。管理者がOKだぜは、下書から公開へって感じで・・

関連

MovableType Data APIでコンテンツデータ検索を試す
https://www.omakase.net/blog/2024/08/movabletype-data-api.html

DATA APIを使用するにあたって

mt-data-api.cgiのパーミッション変更

MovableTypeをインストールしたディレクトリ内で、mt-data-api.cgiを探しパーミッションが設定されているか確認する。

mt-data-api.cgiのパーミッションを755など、サーバーに合わせて設定する。

Movable Type設定する

設定>サービス設定

Data API の利用を許可する。

Movable Type DATA APIを使う

ユーザーのWebサービスパスワードを確認

システム>ユーザー>該当のユーザーで下記を確認

あと権限でData API でのサインインとか・・

パスワードは、APIテストでつかうのでメモ・・・

のちのち英数字大文字小文字記号で13桁とかしておくとか・・

Movable Type DATA APIを使う

あとは、公開サーバー、編集サーバーとかでドメインが異なる場合は、サーバーでクロスオリジン設定するか・

mt-config.cgiで、DataAPICORSAllowOrigin の設定するなど必要になるかと・・

Data API用の変数

https://www.movabletype.jp/documentation/appendices/config-directives/data-api/

いま、記事書いてる最中・・MT9プレビューが出たみたいで・・今やってる・・・JavaScript SDKは。MT9から梱包されないようです。。

https://github.com/movabletype/mt-data-api-sdk-js/tree/master/mt-static/data-api

ちらっとみたら、コンテンツデータに検索が付くらしい・・これはうれしい・・と・・つづきはブログねたとしてとっておくとして・・

ためしてみる

コンテンツデータをやりたいけど・・ぐぐると・・情報ない・・・・けど・・

仕方ないので・・下記から・・1つずつやっていくか・・

https://github.com/movabletype/mt-data-api-sdk-js/wiki/DataAPI-SDK-japanese-MT.DataAPI-Basic-usage

1個目が・・記事のリストだったので・・まぁ使うかも・・というていで・・

記事の一覧を表示


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>DATA API記事取得</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content="">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
var	api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: "test"
});
$(function(){
	// MTのブログIDを変数 siteId に格納
	var siteId = 1;
	api.listEntries(siteId, function(response) {
		if (response.error) {
			// エラー処理
			return;
		}
		var html = "<ul>";
		for (var i = 0; i < response.items.length; i++) {
			var entry = response.items[i];
			html = html +'<li>'+ entry.date +  entry.title + entry.body + '</li>\n';
		}
		html = html + "</ul>";
		$('#list').html(html);
	});
});
</script>
</head>
<body>
<div id="list"></div>
</body>
</html>

日付が2025-04-15T11:25:03+09:00・・・・

clientIdはMTログインユーザ名でなく、任意の文字列。このIDは認証やcookieを利用する場合に利用されるらしい・・

MTのテンプレートでは、下記を


	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",

下記で・・・


	baseUrl: "<$MTCGIPath$><$MTDataAPIScript$>",

下記も・・


	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>

こんな感じで・・


	<script src="<$MTStaticWebPath$>data-api/v6/js/mt-data-api.js"></script>

書き込みするための認証・・

HTMLを表示すると・・ログインの表示にリンクが付きます、MTログイン画面から。ID、パスを入力すると再びこちらのHTMLへ戻って・・・

ユーザー名を表示するだけのものです。


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>DATA API認証</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content="">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
var	api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: "test"
});
// MTのブログIDを変数 siteId に格納
var siteId = 1;
$(function(){
	function goToAuthorizationUrl() {
		// 認証が成功した場合、現在の URL に戻ってくる
		document.getElementById('login').href = api.getAuthorizationUrl(location.href);
	}
	if (! api.getTokenData()) {
		// トークンのデータを持っていない
		goToAuthorizationUrl();
	}
	api.getUser('me', function(response) {
		if(response.error) {
			if(response.error.code === 401) {
				// 以前取得したトークンが期限切れになっているなどの理由で再認証が必要
				goToAuthorizationUrl();
				return;
			}
			// エラー処理
			return;
		}
		var user = response;
		$('#login').hide();;
		$('#username').html(user.displayName);
	});
});
</script>
</head>
<body>
<div id="username"></div>
<a href="" id="login">ログイン</a>
</body>
</html>

あああ・・・そうなるのね・・・

ここでのパスワードは、通常のMovable Typeのパスワードでなくて・・Webサービスパスワードを入力しないと・・だめ

筆者は・・・通常のパスワードを入れていて・・なんでって・・・悩んだ・・・

でも・・このMTのログインは・・・ちょっと・・なぁ。。

Movable Type DATA APIを使う

何となく理解できたので・・

api.authenticateをつかって、javascriptに直接、ID、パス書くのもあれだし、自分でログイン画面作って・・

認証できたら、ブログの入力を表示して、登録してもらう感じで・・ 何となくエラーの処理もいれてと・・

ログイン入力を省くのであれば・・・そちらをperlとかphpに投げるとか・・・

外部からなので・・statusはDraft(下書)で・・・

ここ自体のhtmlはベーシッツク認証とかかけてとかかな・・・


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>記事書き込みテスト</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content="">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
var api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: 'test'
});
// MTのブログIDを変数 siteId に格納
var siteId = 1;
$(function(){
	// ログインチェック
	function logincheck() {
		api.authenticate({
			username: $('#user').val(),
			password: $('#pass').val(),
			remember: true
		}, function(response) {
			if(response.error) {
				$('#result').html('認証エラー');
			} else {
				inputEntry();
			}
		});
	};
	// 記事投稿処理
	function entrywrite() {
		entryData = {
			'title' : $('#entrytitle').val(),
			'body' : $('#entrycomment').val(),
			'status' : 'Draft'
		};
		api.createEntry(siteId, entryData, function(response) {
			if (response.error) {
				$('#result').html('エラーです');
			} else {
				$('#result').html('登録しました。');
			}
		});
	};
	// 入力画面表示
	function inputEntry() {
		$('#result').html('ログインしました');
		api.getToken(function(response) {
			if(response.error) {
				$('#result').html('ログインエラー');
			} else {
				$('#contentform').show();
				$('#submitBtn').on('click', entrywrite);
			}
		});
	};
	$('#contentform').hide();
	$('#loginBtn').on('click', logincheck);
});
</script>
</head>
<body> 
<h1>記事書き込みテスト</h1>
<p>ユーザID:<input id="user" type="text" placeholder="ユーザID"></p>
<p>パスワード:<input id="pass" type="password" placeholder="パスワード"></p>
<p><input id="loginBtn" type="button" value="ログイン"></p>
<hr>
<div id="result">結果表示</div>
<hr>
<div id="contentform">
	<input id="entrytitle" size="80" type="text" placeholder="タイトルはここに">
	<br>
	<textarea id="entrycomment" placeholder="本文をここに" rows="4" cols="40"></textarea>
	<br>
	<input id="submitBtn" type="button" value="登録">
</div>
</body>
</html>

で。コンテンツデータは??・・サンプルねーじゃん・・

ここをみながら・・

https://movabletype.github.io/mt-docs-data-api-reference/v6.html#tag/Content-Data

\mt-static\data-api\v6\jsのjsを見ながら・・・

listEntriesは下記なので・・


    {
        "id": "list_entries",
        "route": "/sites/:site_id/entries",
        "verb": "GET",
        "resources": null
    },

1件取得するのは。。

getContentDataってこと??


    {
        "id": "get_content_data",
        "route": "/sites/:site_id/contentTypes/:content_type_id/data/:content_data_id",
        "verb": "GET",
        "resources": null
    },

なんとなく、関数名はわかったので・・

引数は。。上記のドキュメントから推測して・・

下記みたいなテスト用で、使いそうな・・項目をチョイス・・

Movable Type DATA APIを使う

こんなコード書いて。。構造を取得・・・・・


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>コンテンツデータ構造をはっく</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content=",,,,">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
var api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: 'test'
});
$(function(){
	var siteId				= 1;
	var content_type_id 	= 4
	var content_data_id		= 1;
	api.getContentData(siteId, content_type_id, content_data_id, function (data) {
		var  json = JSON.stringify(data);
		alert(json);
	});
});
</script>
</head>
<body> 
</body>
</html>

取得できたjson


{
    "author": {
        "displayName": "テストユーザー",
        "userpicUrl": null
    },
    "basename": "c768362aca816c5a",
    "blog": {
        "id": "16"
    },
    "createdDate": "2025-04-16T10:55:11+09:00",
    "data": [
        {
            "data": "1",
            "id": 421,
            "label": "ID",
            "type": "single_line_text"
        },
        {
            "data": "名前",
            "id": 422,
            "label": "名前",
            "type": "single_line_text"
        },
        {
            "data": "複数行です\r\nどうですか?",
            "id": 423,
            "label": "複数行",
            "type": "multi_line_text"
        },
        {
            "data": "1234",
            "id": 424,
            "label": "数値",
            "type": "number"
        },
        {
            "data": "https://www.omakase.net/",
            "id": 425,
            "label": "URL",
            "type": "url"
        },
        {
            "data": "20250416000000",
            "id": 426,
            "label": "日付",
            "type": "date_only"
        },
        {
            "data": [
                "データ2"
            ],
            "id": 427,
            "label": "セレクト",
            "type": "select_box"
        },
        {
            "data": "データ2",
            "id": 428,
            "label": "ラジオ",
            "type": "radio_button"
        },
        {
            "data": [
                "データ1",
                "データ2"
            ],
            "id": 429,
            "label": "チェック",
            "type": "checkboxes"
        },
        {
            "data": [
                "7159"
            ],
            "id": 430,
            "label": "画像",
            "type": "asset_image"
        },
        {
            "data": [
                "7160"
            ],
            "id": 431,
            "label": "ファイル",
            "type": "asset"
        }
    ],
    "date": "2025-04-16T10:52:34+09:00",
    "id": 1,
    "label": "test",
    "modifiedDate": "2025-04-16T10:55:11+09:00",
    "permalink": "https://ドメイン名/ディレクリ名/",
    "status": "Publish",
    "updatable": false
}

うーむ・・ファイル系は・・idなのね。。アセットidなのかね。。。

コンテンツデータ書き込み

試行錯誤して・・・・できたのがこれ・・

あとは、複数選択、ファイル系は・・・やってない・・

とりあえず・・content_data.data では、すべて記載しなくてもエラーにはならないよう・・

変更する項目だけで、OKですね。kintoneとかのAPIと同じぽいので・・ファイル系もまず、アセット登録して

アセットIDをコンテンツデータに登録するイメージなのかね。。

各idは環境にあわせて、修正してください。


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>コンテンツデータ書き込みテスト</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content=",,,,">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
var api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: 'test'
});
$(function(){
	// ログインをチェックする
	function logincheck() {
		api.authenticate({
			username: $('#user').val(),
			password: $('#pass').val(),
			remember: true
		}, function(response) {
			if(response.error) {
				$('#result').html('認証エラー');
			} else {
				inputContent();
			}
		});
	};
	// データを投稿するための処理
	function ContentWrite() {
		var siteId				= 1,
		var content_type_id 	= 4;
		var date = new Date();
		var datestr = date.toISOString().replace(/[^0-9]/g, '').slice(0, -5);
		var content_data = {};
		content_data.basename		= "test01";
		content_data.label			= "test01";
		content_data.date			= datestr;	//YYYYMMDDHHmmSS
		content_data.status 		= 'Draft';
		content_data.data = [];
		content_data.data[0] = {};
		content_data.data[0].data	= $('#id').val();
		content_data.data[0].id		= "421";
		content_data.data[0].label	= "ID"
		content_data.data[0].type	= "single_line_text"
		content_data.data[1] = {};
		content_data.data[1].data	= $('#name').val();
		content_data.data[1].id		= "422";
		content_data.data[1].label	= "名前"
		content_data.data[1].type	= "single_line_text"
		content_data.data[2] = {};
		content_data.data[2].data	= $('#comment').val();
		content_data.data[2].id		= "423";
		content_data.data[2].label	= "商品説明"
		content_data.data[2].type	= "multi_line_text"
		var json = JSON.stringify(content_data);
		api.createContentData(siteId, content_type_id, json, function (response) {
			if (response.error) {
				$('#result').html('エラーです');
			} else {
				$('#result').html('登録しました。');
			}
		});
	};
	// 入力画面を表示
	function inputContent() {
		$('#result').html('ログインしました');
		api.getToken(function(response) {
			if(response.error) {
				$('#result').html('ログインエラー');
			} else {
				$('#contentform').show();
				$('#submitBtn').on('click', ContentWrite);
			}
		});
	};
	$('#contentform').hide();
	$('#loginBtn').on('click', logincheck);
});
</script>
</head>
<body> 
<h1>コンテンツデータ書き込みテスト</h1>
<p>ID:<input id="idr" type="text" placeholder="ID"></p>
<p>パスワード:<input id="pass" type="password" placeholder="パスワード"></p>
<p><input id="loginBtn" type="button" value="ログイン"></p>
<hr>
<div id="result">結果表示</div>
<hr>
<div id="contentform">
	ID<input id="id" size="80" type="text" placeholder="ID"><br>
	名前<input id="name" size="80" type="text" placeholder="名前"><br>
	複数行<textarea id="comment" placeholder="本文をこちらに" rows="4" cols="40">複数行</textarea><br>
	<input id="submitBtn" type="button" value="登録">
</div>
</body>
</html>

アセットのアップロード

uploadAssetでは、画像がどうかまではみてくれないので、こちらで画像かどうかは判断するようにする。

pathでアップロード先のパスを指定できるが・・デフォルトで・・

https://movabletype.github.io/mt-docs-data-api-reference/v6.html#tag/Assets/paths/~1assets~1upload/post

autoRenameIfExists

この値が「1」で、同じファイル名のファイルが存在する場合、アップロードされたファイルの名前はランダムに生成された名前に自動的に変更されます。デフォルトは「0」です。

normalizeOrientation

この値が「1」で、アップロードされたファイルの向きがExifデータに含まれている場合、このファイルの向きは自動的に正規化されます。デフォルトは「1」です。


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>アセットのアップロードテスト</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content="">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
const api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: "image-upload-1"
});
// MTのブログIDを変数 siteId に格納
var siteId = 1;
$(function(){
	// ログインをチェックする
	function logincheck() {
		api.authenticate({
			username: $('#user').val(),
			password: $('#pass').val(),
			remember: true
		}, function(response) {
			if(response.error) {
				$('#result').html('認証エラー');
			} else {
				inputUpload();
			}
		});
	};
	$('input[type=file]').change(function() {
		var file = $(this).prop('files')[0];
		if (!file.type.match('image.*')) {
			$(this).val('');
			$('#result').html('画像ではありません。');
			return;
		}
		var reader = new FileReader();
		reader.onload = function() {
			$('#imgview').attr('src', reader.result);
		}
		reader.readAsDataURL(file);
	});
	function upload() {
		var data = {
			site_id: siteId,
			path: $("#path").val(),
			file: $("#upload")[0].files[0],
			autoRenameIfExists: true,
			normalizeOrientation: true,
		};
		api.uploadAsset(data, function(response) {
			if(response.error) {
				$('#result').html(response.error.message);
			}
		});
	}
	// 入力画面表示
	function inputUpload() {
		$('#result').html('ログインしました');
		api.getToken(function(response) {
			if(response.error) {
				$('#result').html('ログインエラー');
			} else {
				$('#contentform').show();
				$('#submitBtn').on('click', upload);
			}
		});
	};
	$('#contentform').hide();
	$('#loginBtn').on('click', logincheck);
});
</script>
</head>
<body>
<h1>ファイルアップロードテスト</h1>
<p>ユーザID:<input id="user" type="text" placeholder="ユーザID"></p>
<p>パスワード:<input id="pass" type="password" placeholder="パスワード"></p>
<p><input id="loginBtn" type="button" value="ログイン"></p>
<hr>
<div id="result">結果表示</div>
<hr>
<div id="contentform">
	<p><input type="file" name="upload" id="upload"></p>
	<p><img src="" id="imgview"></p>
	<input id="submitBtn" type="button" value="アップロード">
</div>
</body>
</html>

なんとなく、アップロードができた。。ただ、画像には、公開・非公開はないので・・・

なんとなく、コツは・・・わかった気がする・・気だけかも。。

トークン取得をPerlで・・

ID,パスワードが入力を省くために。。

Movable Typeは、Perlなので、Perlでauthenticateにの部分は書いてみる・・

一応、セキュリティ的に、自サーバー以外は無応答な感じで処理をいれてみた。

expiresInのデフォルトは3600です

Cookeiは下記で設定される・・clientIdは、HTML、CGIともに合わせる・・・

mt_data_api_access_token_「clientId」_443


#!/usr/bin/perl
use Encode;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Request;
use JSON;
use Data::Dumper;
my	$server_url		= '設置したドメイン名';
my	$mt_dataapi_url = "設置したドメイン名/mtのパス/";
my	$mt_userid		= 'DATAAPIのユーザー';
my	$mt_pass		= 'Webサービスのパスワード';
my	$mt_clientId	= "クライアントIDは、JavaScript SDKと合わせる";
	if($server_url) {
		unless($ENV{HTTP_REFERER} =~ /$server_url/) {
#			$data->{'sts'}		= "NG";
#			$data->{'message'}	= "不正アクセス";
#			print "Location: $ENV{HTTP_REFERER}\n\n";
			exit(0);
		}
	}
	my $ua = LWP::UserAgent->new;
	my $auth_uri = 'https://' . $mt_dataapi_url. 'mt-data-api.cgi/v6/authentication';
	my %MT_POST = ();
	$MT_POST{'clientId'}				= $mt_clientId;
#	$MT_POST{'mtDataApiLoginMagicToken'}= $mt_clientId;
	$MT_POST{'password'} 				= $mt_pass;
	$MT_POST{'username'}				= $mt_userid;
	my $req  = POST($auth_uri, [%MT_POST]);
	my $res = $ua->request($req);
	if ($res->is_success) {
		my $obj = decode_json($res->content);
		if($obj->{'accessToken'}) {
			$data->{'sts'}		= "OK";
			$data->{'accessToken'}	= $obj->{'accessToken'};
			$data->{'expiresIn'}	= $obj->{'expiresIn'};
			$data->{'sessionId'}	= $obj->{'sessionId'};
		} else {
			$data->{'sts'}		= "NG";
			$data->{'message'}	= "不正アクセス";
		}
	} else {
		$data->{'sts'}		="NG";
		$data->{'message'}	= $res->code."サーバーエラー";
	}
	my $json	= JSON->new();
	$js ="";	
	if($data) {
		$js		= $json->encode($data);
	}
	print "Content-type: application/json; charset=UTF-8;\n\n";
	print  $js."\n";

HTML側・・

今までの、ものをCGI経由に置き換え、入力ないままログインボタンを押すと記事入力


<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>記事書き込みテスト</title>
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1">
	<meta name="format-detection" content="telephone=no">
	<meta name="keywords" content="">
	<meta name="description" content="">
	<meta name="author" content="">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://ドメインとMTパス/mt-static/data-api/v6/js/mt-data-api.js"></script>
<script>
// Movable Type Data API のインスタンス生成
const api = new MT.DataAPI({
	baseUrl: "https://ドメインとMTパス/mt-data-api.cgi",
	clientId: "test"
});
// MTのブログIDを変数 siteId に格納
var siteId = 1;
$(function(){
	// ログインチェック
	function logincheck() {
		$.ajax({
			url:'auth.cgi',
			dataType: "json",
			type:'post',
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				alert( XMLHttpRequest.status + "-" + textStatus + "-" + errorThrown.message);
			},
			success:function(response){
				var msg = "";
				if(response.sts == "OK"){
					api.storeTokenData(response);
					inputEntry();
				} else {
					msg = "ログインIDまたはパスワードが異なります。";
				}
				$("#message").html(response.message);
			}
		});
	}
	// 記事投稿処理
	function entrywrite() {
		entryData = {
			'title' : $('#entrytitle').val(),
			'body' : $('#entrycomment').val(),
			'status' : 'Draft'
		};
		api.createEntry(siteId, entryData, function(response) {
			if (response.error) {
				$('#result').html('エラーです');
			} else {
				$('#result').html('登録しました。');
			}
		});
	};
	// 入力画面表示
	function inputEntry() {
		$('#result').html('ログインしました');
		api.getToken(function(response) {
			if(response.error) {
				$('#result').html('ログインエラー');
			} else {
				$('#contentform').show();
				$('#submitBtn').on('click', entrywrite);
			}
		});
	};
	$('#contentform').hide();
	$('#loginBtn').on('click', logincheck);
});
</script>
</head>
<body> 
<h1>記事書き込みテスト</h1>
<p><input id="loginBtn" type="button" value="ログイン"></p>
<hr>
<div id="result">結果表示</div>
<hr>
<div id="contentform">
	<input id="entrytitle" size="80" type="text" placeholder="タイトルはここに">
	<br>
	<textarea id="entrycomment" placeholder="本文をここに" rows="4" cols="40"></textarea>
	<br>
	<input id="submitBtn" type="button" value="登録">
</div>
</body>
</html>

コンテンツデータを修正・・・

これを調べてみたけど・・・現実的な、実装はむずかしそう・・・

getContentDataで、該当項目を取得するには、コンテンツIDのみでコンテンツIDは、Movable Typeが自動で生成するシーケンシャルID

listContentDataで、取得して、比較とかも、データ件数によっては、厳しそう・・

listContentDataで、特定のコンテンツフィールドとコンテンツIDだけ取得して、特定のコンテンツフィールドと入力されたキーで一致させてコンテンツIDを取得して

そのIDをもとに・・getContentDataするとか?!あんまり・・現実的じゃない・・

コンテンツIDを配布しておいて、それを入力してとかでも、他のレコードが用意に判断できるじゃ・・ってなるし、

下記みたいのがあれば・・・

api.serachContentData(blog_id, content_type_id, content_fileta_field(比較するフィールド名), "検索する文字列", function (data)

まぁ、とりあえず、修正ではなく、再度また登録してもらう運用かなぁ・・

下書→公開→修正(下書)→公開されてるのを削除→修正の下書を公開

あと、Perl側で全部行うか、Movable Type側では、ベーシック認証のかかったフォルダに全件のコンテンツIDと比較対象の項目を吐き出ししておいて、

こんなファイルを作っておく・・


1,比較1
2,比較2
3,比較3
4,比較4
5,比較5
6,比較6

Perl側でこれを読み込んで、入力されたID(キー)と作成したファイルを読み込んで、一致したコンテンツIDをもとに、getContentDataして以前の登録を出すみたいな・・

まぁ、上記で作ったPerlに、トークンと、コンテンツIDを渡せば・・なんとかなる?

か、・・ここまで調べた。JavaScript SDKをやめて・・全部Perlに任せるか・・ううぅぅ。。

さいごに

まぁ、ここまで、押さえておけば・・・あとは・・なんとかなるかな?

あと、ここで記載しているコードは、おいらが検証用で作成したそのままなので、エラー処理だったり、脆弱性対応とか適当なので。。注意してね。。

とりま・・自分のメモで残しておきます・・・

では・・

関連記事