WordPress XML-RPC Frameworkを呼び出して、指定のWordPressとXML-RPCによる通信を行うテスト用のAppleScriptです。
# 本BlogではAppleScriptからの自動更新時以外はWordPressのXML-RPC通信機能をプラグイン「Disable XML-RPC」によって止めているので、本Scriptを実行してもエラーになる可能性があります。他のWordPressのサイトでお試しください
本Blogがホスティング業者との行き違いでデータベースをシャットダウンされて、やむなく再構築を行おうと決意してから迅速に再構築を進めて来られたのは、手元にAppleScriptの元コードがすべて無傷で残っていたことと、これまで半自動だった記事の投稿をすべてAppleScriptから自動化できる目処が立っていたためでした。
・指定のAppleScriptをHTML化(URLリンク付き)するAppleScriptライブラリ
・指定内容のHTMLをWordPressにXML-RPC経由で投稿するAppleScript
といった「飛び道具」を整備することで、指定のAppleScript書類をWordPressに投稿できるようになりました。
とくに、XML-RPCについてはAppleScriptの標準搭載命令「call xmlrpc」がとことん使い物にならず、WordPressへの通信を行うとクラッシュすることを(ずいぶん昔に)確認してあったため、、、かわりになる部品を地道に探してありました。
WordPressとのXML-RPCによる通信を行うmacOS用フレームワーク「wpxmlrpc」を見つけ、Xcode上でビルドしてAppleScriptから呼び出す実験を行い、このように実際の投稿に利用しています。Github上のドキュメントはたいへんに素っ気なく、そのままObjective-CのコードをAppleScriptに置き換えても動作しない程度の素朴すぎる内容でしたが、REST APIの呼び出しAppleScriptを参考に内容を類推してひととおり動作できるところまでこぎつけました。
AppleScript名:WordPress XML-RPC Frameworkのじっけん |
— Created 2018-02-08 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "wpxmlrpc" –https://github.com/wordpress-mobile/wpxmlrpc set aRes to callXMLRPC("http://piyocast.com/as/xmlrpc.php", "demo.addTwoNumbers", {2, 3}) of me –> 5 set aRes to callXMLRPC("http://piyocast.com/as/xmlrpc.php", "mt.supportedMethods", {}) of me –> {"wp.getUsersBlogs", "wp.newPost", "wp.editPost", "wp.deletePost", "wp.getPost", "wp.getPosts", "wp.newTerm", "wp.editTerm", "wp.deleteTerm", "wp.getTerm", "wp.getTerms", "wp.getTaxonomy", "wp.getTaxonomies", "wp.getUser", "wp.getUsers", "wp.getProfile", "wp.editProfile", "wp.getPage", "wp.getPages", "wp.newPage", "wp.deletePage", "wp.editPage", "wp.getPageList", "wp.getAuthors", "wp.getCategories", "wp.getTags", "wp.newCategory", "wp.deleteCategory", "wp.suggestCategories", "wp.uploadFile", "wp.deleteFile", "wp.getCommentCount", "wp.getPostStatusList", "wp.getPageStatusList", "wp.getPageTemplates", "wp.getOptions", "wp.setOptions", "wp.getComment", "wp.getComments", "wp.deleteComment", "wp.editComment", "wp.newComment", "wp.getCommentStatusList", "wp.getMediaItem", "wp.getMediaLibrary", "wp.getPostFormats", "wp.getPostType", "wp.getPostTypes", "wp.getRevisions", "wp.restoreRevision", "blogger.getUsersBlogs", "blogger.getUserInfo", "blogger.getPost", "blogger.getRecentPosts", "blogger.newPost", "blogger.editPost", "blogger.deletePost", "metaWeblog.newPost", "metaWeblog.editPost", "metaWeblog.getPost", "metaWeblog.getRecentPosts", "metaWeblog.getCategories", "metaWeblog.newMediaObject", "metaWeblog.deletePost", "metaWeblog.getUsersBlogs", "mt.getCategoryList", "mt.getRecentPostTitles", "mt.getPostCategories", "mt.setPostCategories", "mt.supportedMethods", "mt.supportedTextFilters", "mt.getTrackbackPings", "mt.publishPost", "pingback.ping", "pingback.extensions.getPingbacks", "demo.sayHello", "demo.addTwoNumbers"} on callXMLRPC(paramURL, aMethod, aParamList) set aURL to current application’s |NSURL|’s URLWithString:paramURL set aReq to current application’s NSMutableURLRequest’s alloc()’s initWithURL:aURL aReq’s setHTTPMethod:"POST" set encoder to current application’s WPXMLRPCEncoder’s alloc()’s initWithMethod:aMethod andParameters:aParamList (aReq’s setHTTPBody:(encoder’s dataEncodedWithError:(missing value))) set aRes to current application’s NSURLConnection’s sendSynchronousRequest:aReq returningResponse:(reference) |error|:(missing value) set resList to aRes as list set bRes to contents of (first item of resList) set cRes to second item of resList (* (NSHTTPURLResponse) <NSHTTPURLResponse: 0x6000000289a0> { URL: http://piyocast.com/as/xmlrpc.php } { status code: 200, headers { Connection = close; "Content-Type" = "text/xml; charset=UTF-8"; Date = "Wed, 07 Feb 2018 16:10:49 GMT"; Server = Apache; "Transfer-Encoding" = Identity; } } *) set decoder to current application’s WPXMLRPCDecoder’s alloc()’s initWithData:bRes set errF to (decoder’s isFault()) as boolean if errF = true then —Error set xmlRPCres to faultCode of resStr set xmlRPCbody to faultString of resStr return false else –Success? set xmlRPCres to (decoder’s object()) as list of string or string –Error if xmlRPCres = missing value then return false end if return xmlRPCres end callXMLRPC |
WordPressの指定IDの記事にリンクされているapplescriptからCocoa Classのproperty宣言を抽出 – AppleScriptの穴 says:
[…] XML-RPCでWordPressと通信するのには、記事アップロード自動化に使ったFrameworkもありますが、ためしにAppleScript標準搭載のcall xmlrpcコマンドを使ってみました。記事新規投稿コマンドだとク […]
Blog Archiveの電子書籍を計画しています – AppleScriptの穴 says:
[…] 消失直後に、AppleScript書類をHTML化してXML-RPC経由でWordPressをコントロールして、BlogにアップロードするAppleScriptを書いて実戦投入。機械的に基礎的なサブルーチンをアップロードし、じょじょに説明文を付加したコンテンツをアップロード。 […]