herokuとGoogleAppsScriptを使って、ブログ更新をツイートする


#cronはGoogleAppsScriptで
GoogleAppsScriptというツールから、定期実行スクリプトを登録できる。
これは知らなかった。GoogleAppEngineとは関係なくて、Googleアカウントでエディター画面にログインする。
書くスクリプトは.gsというJavaScriptっぽいやつで、Web上のエディターから登録する。

[無料でお手軽Cron！Google Apps Scriptを使ってみる。](http://kijtra.com/article/cron-by-google-apps-script/)

ほぼこのサイトの通りで、URLをfetch実行させて、戻り値(ブラウザ出力内容)をメール送信する。
URLのページが404とかでもcronエラーにならないように、引数 **muteHttpExceptions**を追加した。こうすると、404なら404のページ内容が返ってくる。
普通に管理画面があって、cronバッチの実行日時とか頻度を設定できる。

```javascript:script.gs
function myFunction() {
    var response = UrlFetchApp.fetch("https://heroku-appli-9090.herokuapp.com/-cont-/-view-"
                                      , { muteHttpExceptions:true });
    MailApp.sendEmail(
        "-my-mail-address-@gmail.com",// 送信先メール
        "Cronの実行結果ですよ",// メール件名
        "",
        {
            htmlBody: response.getContentText()
        }
    );
}
```

#herokuでWebアプリ作成
上記cronでURLを呼び出せるように、herokuでプロジェクトを作る。

参考にしたサイトはこことか。
[Heroku に Rails アプリをアップ](http://railsgirls.jp/heroku/)


herokuのチュートリアルだけでも十分できる。はずだが、いろいろはまった。

> % foreman start web

でWebサーバー上のアプリをローカル実行できるようにしておく。(デフォルトのポート番号だと、http://localhost:5000で見られる)
このやり方は、herokuのチュートリアルに載っていた。
[Run the app locally](https://devcenter.heroku.com/articles/getting-started-with-ruby#run-the-app-locally)

ローカルで試してから、`git push heroku master`して本番で見る。

#RubyonRailsで、ツイートするプログラム作成
> % rails new app-name --skip-active-record

でrailsプロジェクトを作り、そこに入ってからremoteのherokuにプッシュできるようにしておく。
「--skip-active-record」：DBを使わないRailsプロジェクトを作成するための引数。
（[DB不要のRailsアプリの作り方](http://qiita.com/h7kayama/items/8b0870716777494f8c31)）

> % rails generate controller tweet-blog-update tweet

でコントローラとビューを作成。

```ruby:TweetBlogUpdateController.rb
require "twitter"
require "simple-rss"
require "open-uri"
class TweetBlogUpdateController < ApplicationController
  def post
    title = self.getTitle()
    if title != "-" then
      self._post(title)
    end
    render :text=> title
  end

  def _post(title)
    client = Twitter::REST::Client.new do |config|
        config.consumer_key = "--your consumer key--"
        config.consumer_secret = "--your consumer secret--"
        config.access_token    = "--token---"
        config.access_token_secret = "--token secret--"
    end
    message = "blog update \"#{title}\"  http://--blog-url--"
    client.update(message)
  end

  def getTitle()
    filename = 'http://フィードURL'
    rss = SimpleRSS.parse open(filename)

    # 記事タイトルを取得
    title = rss.items[0].title
    # 最終更新日時を取得
    lastUpdate = rss.items[0].published

    # 本日0時0分の日時オブジェクトを作成
    tyear = Time.now().year
    tmonth = Time.now().month
    tday = Time.now().day
    dayStart = Time.local(tyear, tmonth, tday, 0, 0, 0)

    # 本日の記事があればツイート（なければツイートしない。その場合はハイフンのみをメールする）
    if lastUpdate - dayStart <= 0 then
      title = "-"
    end
    return title
  end

end

```

* requireしているライブラリの内、twitterとsimple-rssはGemfileに記載が必要であった。

> gem 'twitter'
> gem 'simple-rss'

参考にしたのはこちらとか。[simple-rssメモ](http://d.hatena.ne.jp/cuspos/20080123/1201066236)
最初はRails無しのrubyで作ってて、「rss」っていうライブラリだったんだけど、それはgemがなかったので、「simple-rss」に変えた。

* getTitleメソッドでは、RSSフィードの1件目のタイトルと日時を取得する。1件目の記事投稿時間が本日の0時0分より後であれば（=本日投稿の記事があれば）、タイトルを返す。無ければハイフンを返す。

* postメソッドでは、getTitleで取得したタイトルがハイフンでなければ、_postメソッドにツイートさせる。タイトルはブラウザに出力する（=cronでのメール内容になる）

* コンシューマーキーとアクセストークンはこちらで取得する。
[Twitter Application Management](https://apps.twitter.com/)


# その他
* herokuでもschdulerというアドオンでタスク実行(cron)できるらしい。それを使おうと思ったのだけど、カード登録が必要になる。カード登録しようと思ったら、そんなはずはないと思うんだけど、支払いページが表示できなかった。
![billingページ](http://i.gyazo.com/1112f2e7e3639158dd2e48cc8c9b4dbb.png)
?????


* herokuアプリを作って最初のpushで、エラーになった。これはシンプルなディレクトリをあげようとすると、PHPのアプリ（Framework:PHP）として登録されてしまい、その場合はindex.phpがないとエラーになるみたい。index.phpをルートに置くと解消されると言う謎仕様。
[Heroku push rejected, no Cedar-supported app detected](http://stackoverflow.com/questions/8361475/heroku-push-rejected-no-cedar-supported-app-detected)
[herokuにただのWebページを乗せてみる](http://d.hatena.ne.jp/softsama/20120715/1342373494)
> 
index.phpがないと怒られる。エラーメッセージからは推測不可能な所がキモい。