Google Spreadsheet(Google Apps Script)からtumblrに投稿する方法

[前回のラブライブ！](http://qiita.com/hidesuke/items/0d2083e0d1b5baeee136)では、Google Spreadsheetからtwitterに投稿する方法について書きました。

tumblrだっておんなじようなもんだろ？( 0w0)ﾉ ｳｪｰｲ とかって思って、スクリプト書いていたら、多少ハマったのでメモ的に書いておきます。

Google Apps Scriptを書いたことがある、ということを前提に書いていきます。  
関連ドキュメントは以下です。

* [tumblrのAPIドキュメント](https://www.tumblr.com/docs/en/api/v2)
* 今回の肝な Google Apps Api
  * [UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)
  * [OAuthConfig](https://developers.google.com/apps-script/reference/url-fetch/o-auth-config.html) 

## tumblrにアプリを登録する

投稿するためにはtumblrで認証しないと話になんねっす。詳しくは[tubmlr apiのAuthenticationあたりを読んでください。](https://www.tumblr.com/docs/en/api/v2#auth)
OAuthなので、アプリを登録してConsumerKeyとConsumerSecretを取得しましょう。
[アプリの登録はここ](https://www.tumblr.com/oauth/apps)から。英語ページなのに、「アプリを登録する」ボタンだけ日本語なのが趣深いです。
登録したらConsumerKeyとConsumerSecretをメモっておきましょうね。

## Google Apps Scriptを書く

### OAuthのための設定
[前回のラブライブ！](http://qiita.com/hidesuke/items/0d2083e0d1b5baeee136) 同様に、ConsumerKeyとConsumerSecretはプロジェクトのプロパティに登録しておきます。Google Apps Scriptのスクリプトエディタの画面で`ファイル→プロジェクトのプロパティ→スクリプトのプロパティ`って場所に保存します。
ここでは、ConsumerKeyを`tumblrConsumerKey`、ConsumerSecretを`tumblrConsumerSecret`として保存しました。

そしたら、下記のような関数を作りましょう。コピペで使えます。

```lang:js
function tumblrInitialize() {
  var oAuthConfig = UrlFetchApp.addOAuthService("tumblr");
  oAuthConfig.setAccessTokenUrl("http://www.tumblr.com/oauth/access_token");
  oAuthConfig.setRequestTokenUrl("http://www.tumblr.com/oauth/request_token");
  oAuthConfig.setAuthorizationUrl("http://www.tumblr.com/oauth/authorize");
  oAuthConfig.setParamLocation('auth-header');
  var scriptProperties = PropertiesService.getScriptProperties();
  oAuthConfig.setConsumerKey(scriptProperties.getProperty("tumblrConsumerKey"));
  oAuthConfig.setConsumerSecret(scriptProperties.getProperty("tumblrConsumerSecret"));  
}
```

一応解説すると、OAuthに必要な各種URLやkeyの設定を行っています。ここでの味噌は`oAuthConfig.setParamLocation('auth-header');`この設定です。
この設定、デフォルトでは `post-body`が設定されていますが、tumblrのAPIドキュメントを読んでいると
> The API supports the OAuth 1.0a Protocol, accepting parameters via the Authorization header

って書いてあります。ヘッダに書きやがれって言ってますね。なので、この設定が超必要です。

### ブログにポストする。

なんか、解説書くのがだるくなってきたのでとりあえずコード載せます。

```lang:js
function tumblrPost() {
  var BLOG_POST_URL = "https://api.tumblr.com/v2/blog/{base-hostname}/post";
  var options =
  {
    "oAuthServiceName" : "tumblr",
    "oAuthUseToken" : "always",
    "method" : "POST",
    "payload" : {
      "type": "text",
      "body": "ブログの内容だよ'`,､('∀`) '`,､"
    }
  };
  var result = UrlFetchApp.fetch(BLOG_POST_URL, options);
}
```

上記のコードは、tumblrにtextで「ブログの内容だよ'\`,､('∀\`) '`,､」という内容をポストするサンプルです。
「{base-hostname}」には、例えば、わたしの tumblrは[http://hidesuke.tumblr.com](http://hidesuke.tumblr.com) なので、「hidesuke.tumblr.com」を指定します。すると、hidesuke.tumblr.comにGoogle Apps Scriptから投稿できるというわけですね。簡単簡単。

ここでのみそは `options` の中に`payload`というプロパティです。ここには、POSTメソッドで送信する内容を記述します。何を書くかは[tumblrのAPIドキュメン](https://www.tumblr.com/docs/en/api/v2)を読んで欲しいのですが、とにかくPOSTの中身はとにかくpayloadに書くんだ。

## まとめ

Google Apps APIを使ってtumblrに投稿する方法を雑に解説しました。

ハマった点は`auth-header`を指定する点(ドキュメントをちゃんと読みましょうという教訓を得ました)と、`{base-hostname}`に最初`hidesuke`と自分のアカウント名だけを入れていた点(URL的なものをいれるのが正解でしたね)。

tumblr使っている人が少ない説もありますが、[前回のラブライブ！](http://qiita.com/hidesuke/items/0d2083e0d1b5baeee136)と組み合わせて、tumblrに定期的にポストするボットとかつくれると思います。

tumblr apiはリブログとかもできるらしいので、大相撲のシーズンに[例の投稿](http://maybowjing.tumblr.com/post/16006401309/1)を忘れずreblogするbotとかつくれると思いますのでご活用ください。

enjoy!