Toolsみんな大好きWordpressはCMS/ブログアプリケーションの有名な実装例、ですが、APIを使って管理できるとちょっとしたときに便利です。APIはWordpressを設置するだけで使えるようになっています。APIを扱うことができるので、今回はその例をいろいろメモしておくことにしました。して、Wordpressはすでに設置済みと想定します。2)」のインストールが必要です。APIを無効化するプラグインを導入している場合もあります。変更を伴うAPIの実行には編集以上の権限を持つユーザを、認証を通した上で使用する必要があります。認証は基本的にはBasic認証。作成済のユーザのアカウントそのものを使うのが気になる場合は、専用のアプリケーションパスワードを発行させて利用終了時に破棄する手があります。DDDD”のような形式)。Pythonモジュール主にrequests、ところによりHTMLをパースするためにBeautifulSoupを使います。これでないとできないというわけではありませんが、おそらく最もシンプルに書ける部類の良いモジュールです。インストールされていない場合はpipで導入できます。3系を使う場合はデフォルトでそうなっていると思いますので特に気にする必要はありません。APIと同じく、基本形は”http(s)://(WordPressのドキュメントルート)/wp-json/wp/v2/(リソースのパス)”で、JSON形式のデータ(String)を各メソッドで送受信します。以降のPythonスクリプト中ではurllib.parseクラスを使って各リソースのパスを結合しています。最近のサイトだとHTTPではなくHTTPSが多いと思われますが、APIも基本はそのサイトの設定に揃えます。リソースは、よく使うものはこんな感じかと思います。アップロードされたメディア他にもタグやコメント、固定ページといったWordpressユーザにはお馴染みのリソースが定義されています。.../posts/200のように下の階層にIDを指定すると個別のアイテムにアクセスすることができます。APIのルート、この場合は”http://.../wp-json”または”http://.../wp-json/wp/v2′′をGETするとAPIの一覧(JSON形式)が返ってきます。参照(GETメソッド)系のAPIはブラウザでURLを開くだけで応答が確認できるので、動作確認は簡単です。curlコマンドなどでも可。作成・更新などの変更や設定(settings)の参照など、一部の操作にはWordpress側で設定したユーザの認証が必要になります。URLが間違っている場合は素直に404が返ってくるケースがほとんど。APIが有効化されていて、APIのルート以下の階層で間違っている場合には404に加えてエラー内容のメッセージ(JSON)が応答されることもあります。参照するのみであれば特に認証せずとも取得が可能です。以下はrequestsモジュールを使って投稿(posts)を取得する例です。"__main__":try:get_posts_per_page(3)except:print_exc()といっても全ての投稿が取得できるわけではなく、基本は公開されているものがページネーションされて返ってきます。ページを指定するためにはクエリパラメータにページ番号(posts?page=...)を指定します。レスポンスは.json()メソッドを使ってオブジェクト化していますので、あとはPythonの文法で値を取り出すことができます。正常に取得できた場合、下記の例のように投稿がJSON形式のリストとして返ってきます。...]キーを見ればおおよそ意味はつかめると思いますが、"id"が投稿のID、"status"が「下書き」や「公開」などの状態、"content"が本文です。"author"や"categories"などは生の文字列ではなく、サーバ側(WordPress)で内部的に振られたIDですね。画像のダウンロード標準で利用可能なエクスポート機能ではメディアが含まれないこともあり、投稿中に挿入した画像のダウンロードができると便利ですよね。ここでは、上記の例で見たように投稿を取得、本文からimgタグを抽出、さらにタグのsrc属性(URL)を参照して画像データを取得する、というやり方にします。投稿の書き方によってはsrcに画像の実体がセットされていないケースもありますが、まあ単純な方法としてはこれで十分でしょう。上述のように、全投稿を一括で取得するような仕様にはなっていないので、事前に投稿IDを指定して対象を絞り込んでいます。当たり前ですが、画像を多用しているようなサイトや大量のページをクロールする場合はトラフィックが大きくなりますので注意しましょう。他人様の個人サイトでやってはいけません。"__main__":try:save_images()except:print_exc()BeautifulSoupはWebスクレイピングによく使われるモジュールですが、今回はimgタグを抽出するのに使っています。その中で、srcにはアップロード先ディレクトリ内のリソースを指す相対パスが設定されている場合もありますが、静的コンテンツ用に別途CDNやクラウドストレージを利用している場合など、”http(s)://...”から始まるURL(絶対パス)がセットされている場合がありますので、相対パスの場合にはurljoinで絶対パスに変換しています。ファイルを保存するところは、普通にリンク先を保存するのと同じようにrequestsモジュールを使います。バイナリのストリームとしてファイルに書き出せばそのまま画像ファイルとして保存することができます。面倒なのでリソース名をそのままファイル名に使っていますが、srcにクエリ文字列が含まれている場合など処理系によってファイルシステムに使えない名前になってしまう場合は保存に失敗します。画像のアップロードダウンロードとは逆に、POSTを使ってメディアをアップロードすることができます。Wordpress標準のメディアアップロードページでも複数ファイルを指定することができますが、数十、数百個となるとうまく動かないケースが多いので、そんなときはPythonにやらせましょう。アップロードの操作はWordpress上のデータに変更を加えることになるので、設定済みのアカウントを使った認証が必要になります。"__main__":try:upload_image("C:\\path\\to\\myimage.jpg")except:print_exc()user_、pass_にはWordpressで設定済のものを代入します。requestsのauth引数にタプルとして渡すとBasic認証(Base64エンコード)のヘッダを作ってくれるので便利ですね。画像ファイルをバイナリモードで読み、POSTリクエストのボディとして渡します。APIのバージョンによって微妙に振る舞いが異なるようですが、Content-typeに”application/octet-stream”を明示的にセットするとうまくいくようです。画像ファイルはスクリプト内で(ローカルの)絶対パスまたはスクリプト実行場所からの相対パスで指定し、ファイル名をアップロード対象の画像リソース名に使っています。同期的にPOSTリクエストを送信し、アップロードがうまくいけば成功の応答(HTTPステータス200)が返ってきます。deniedやunauthorizedが返ってくるでしょう。新しい投稿を作成するには、JSON形式の本文をPOSTすれば最低限はOK。指定しなかった他のパラメータにはデフォルト値が適用されます。定義済のカテゴリやユーザを指定する場合には、各々のIDを渡す必要がありますので事前に取得しておくと良いでしょう。"wpuser",...},...]同じくカテゴリは.../categoriesのレスポンスとして取得することができます。3,...},...]下記は投稿を作成する例です。APIの認証を通すユーザ(user_)と、投稿自体の作成者(user_id)は同一でなくても構いませんが、もちろんWordpress側で設定済みである必要があります。post")except:print_exc()送信するデータ(リクエストボディ)はJSON形式の文字列にエンコードする必要があります。投稿の作成者やカテゴリは上述のIDを使い、カテゴリやタグなど複数指定が可能なものはリストとして渡します。"status"を"draft"にしておくと下書き状態で登録されます。通常GUIから投稿した場合と同じく、投稿自体のIDやその他の値はWordpress側で採番されます。APIを作成する~おかえり~前記事までに書ききれなかった話題をちょっと続けます。3のヘッドレスセットアップみんな大好きラズパイ、の今回はヘッドレスセットアップの方法をメモしておきます。ServiceはAzureのPaaS環境。(セットアップ~VM電源操作)仮想マシン環境と言えば色々ありますが、個人的にはVirtualBoxがPC環境でも使いやすいと思っています。安定性や品質、機能面では他の仮想...記事を読むElasticsearchをセットアップするElasticsearchは全文検索エンジン。AWSやelastic社のクラウドサービスもありますが、インターネットへの接続に制約がある...記事を読むWindowsが自動作成したファイルに連番を付ける特定のディレクトリ直下にあるファイルの名前を連番に変更したいとき、意外にうまくいかないケースがあります。具体的には、不定長さの文字列...記事を読むUbuntu16にCrowiをインストールするMarkdownで書けるWikiサーバ、Crowiをインストールします。最近、複数台立ち上げる必要に迫られたので、シェルスクリプトで書い...記事を読むPythonとElasticsearchの夕べElasticsearchの魅力の一つは豊富な機能。その分、使いこなすのが大変なので、少しでも実例ベースで勉強したいところです。(関連設定の取得・設定変更)別記事の続きです。ここではポートフォワードの設定や仮想メディアの情報取得について書いておきます。完成形のサンプルは最後に掲載します。~レボリューションズ~別記事の続きです。Storageは従量課金なので、できるだけ通信量や消費容量を削減したいですね。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。