2018年2月7日水曜日

Ruby を使って fc2 ブログに記事をポストする方法

概要

ruby で XML-RPC API を使って fc2 に記事をポストしてみました
記事の投稿からカテゴリの設定など記事の投稿に必要な最低限の流れを紹介したいと思います

環境

  • macOS 10.13.2
  • Ruby 2.4.1p111
  • xmlrpc 0.3.0

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "xmlrpc"
  • bundle install --path vendor

記事をポストする

metaWeblog.newPost を使います

  • vim post.rb
# coding: utf-8
require 'xmlrpc/client'

client = XMLRPC::Client.new2("http://blog.fc2.com/xmlrpc.php")
blog_id = '' # 空で OK
username = 'fc2_user@your.mail.local' # fc2 の場合 fc2 ID で登録したメールアドレスを指定します
password = 'password'
contents = {
  'title' => 'test',
  'description' => 'test post',
  'mt_text_more' => 'more text'
}
publish = 1 # 1 は公開, 0 は非公開

begin
  ret = client.call('metaWeblog.newPost', blog_id, username, password, contents, publish)
  puts ret
rescue XMLRPC::FaultException => e
  puts e
end

基本的な使い方は client.call の第一引数に API を指定します
それに続いて API に必要なパラメータを指定します
metaWeblog.newPost の場合 blog_id, username, password, contents, publish が必要になります
blog_id は fc2 の場合空で OK です
username はメールアドレスを指定します
password は fc2ID で登録したパスワードを指定します
contents はハッシュで指定します
title, description でタイトルと記事の本文を指定します
それ以外にも

  • mt_allow_comments
  • mt_allow_pings
  • mt_convert_breaks
  • mt_text_more
  • mt_excerpt
  • mt_keywords
  • mt_tb_ping_urls

などが指定できます
試しに mt_text_more を指定したところ「続きを読む」の表示が追加されました

API の一覧を取得する

mt.supportedMethods を使います

  • vim methods.rb
# coding: utf-8
require 'xmlrpc/client'

client = XMLRPC::Client.new2("http://blog.fc2.com/xmlrpc.php")
blog_id = '' # 空で OK
username = 'fc2_user@your.mail.local' # fc2 の場合 fc2 ID で登録したメールアドレスを指定します
password = 'password'

begin
  ret = client.call('mt.supportedMethods', blog_id, username, password)
  puts ret
rescue XMLRPC::FaultException => e
  puts e
end

以下の API 一覧が取得できました

  • blogger.getUsersBlogs
  • blogger.getUserInfo
  • blogger.newPost
  • blogger.editPost
  • blogger.deletePost
  • blogger.getRecentPosts
  • metaWeblog.newPost
  • metaWeblog.editPost
  • metaWeblog.getPost
  • metaWeblog.getRecentPosts
  • metaWeblog.newMediaObject
  • metaWeblog.getCategories
  • mt.getRecentPostTitles
  • mt.getCategoryList
  • mt.getPostCategories
  • mt.setPostCategories
  • mt.supportedMethods
  • mt.supportedTextFilters
  • mt.getTrackbackPings
  • mt.publishPost
  • mt.setNextScheduledPost

どうやら blogger API もサポートしているようです

カテゴリを登録する

これは残念ながら API がないので諦めて管理画面から登録しましょう

カテゴリを取得する

mt.getCategoryList を使います

  • vim get_category.rb
# coding: utf-8
require 'xmlrpc/client'

client = XMLRPC::Client.new2("http://blog.fc2.com/xmlrpc.php")
blog_id = '' # 空で OK
username = 'fc2_user@your.mail.local' # fc2 の場合 fc2 ID で登録したメールアドレスを指定します
password = 'password'

begin
  ret = client.call('mt.getCategoryList', blog_id, username, password)
  puts ret
rescue XMLRPC::FaultException => e
  puts e
end

先ほど手動で登録したカテゴリ (test) も取得できました
未分類には categoryId がないようです

{"categoryId"=>"0", "categoryName"=>"未分類"}
{"categoryId"=>"1", "categoryName"=>"test"}

カテゴリをセットする

新規で投稿した記事には未分類のカテゴリがセットされています
自分で作成したカテゴリをセットするには mt.setPostCategories を使います

  • vim set_category.rb
# coding: utf-8
require 'xmlrpc/client'

client = XMLRPC::Client.new2("http://blog.fc2.com/xmlrpc.php")
post_id = '1'
username = 'fc2_user@your.mail.local' # fc2 の場合 fc2 ID で登録したメールアドレスを指定します
password = 'password'
categories = [
  {'categoryId' => '1', 'isPrimary' => true}, {'categoryId' => '0', 'isPrimary' => false} # 手動で登録したカテゴリの ID
]

begin
  ret = client.call('mt.setPostCategories', post_id, username, password, categories)
  puts ret
rescue XMLRPC::FaultException => e
  puts e
end

categories 内で categoryId を指定することでセットすることができます
isPrimary は複数カテゴリを指定した場合、第一カテゴリにセットしたいカテゴリに対して true をセットします
ただ、fc2 の場合カテゴリを 1 つしかセットできないので、配列の一番初めにセットしたカテゴリが適用されます

最新の記事を取得する

  • vim get_current_posts.rb
# coding: utf-8
require 'xmlrpc/client'

client = XMLRPC::Client.new2("http://blog.fc2.com/xmlrpc.php")
blog_id = '' # 空で OK
username = 'fc2_user@your.mail.local' # fc2 の場合 fc2 ID で登録したメールアドレスを指定します
password = 'password'
num = 10

begin
  ret = client.call('mt.getRecentPostTitles', blog_id, username, password, num)
  puts ret
rescue XMLRPC::FaultException => e
  puts e
end

上記の場合 num = 10 で最新の 10 件を取得できます
num がどこまで指定可能なのか調べたところ 7,000 件以上投稿してから num = 10,000 で取得したところ問題なく全件取得できました
もしかすると無限に指定できるのかもしれません (もしくは Integer の最大値かもしれません)

最後に

XML-RPC API を使って fc2 ブログに記事をポストしてみました
記事を投稿する際の最低限の流れは紹介できたかなと思います

fc2 ブログの無料プランでは 1 日最大 10 件しか投稿できないので注意してください
テストであれば削除してから再度ポストすれば何回でもテストできます

今回は metaWeblog API と MovableType API を使って記事を投稿してみましたが一部 blogger API もサポートしているようなのでそれを使って良いと思います

参考サイト

0 件のコメント:

コメントを投稿