LoginSignup
6
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-07

cronはGoogleAppsScriptで

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

無料でお手軽Cron!Google Apps Scriptを使ってみる。

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

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 アプリをアップ

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

% foreman start web

でWebサーバー上のアプリをローカル実行できるようにしておく。(デフォルトのポート番号だと、http://localhost:5000で見られる)
このやり方は、herokuのチュートリアルに載っていた。
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アプリの作り方

% rails generate controller tweet-blog-update tweet

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

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メモ
最初はRails無しのrubyで作ってて、「rss」っていうライブラリだったんだけど、それはgemがなかったので、「simple-rss」に変えた。

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

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

  • コンシューマーキーとアクセストークンはこちらで取得する。
    Twitter Application Management

その他

  • herokuでもschdulerというアドオンでタスク実行(cron)できるらしい。それを使おうと思ったのだけど、カード登録が必要になる。カード登録しようと思ったら、そんなはずはないと思うんだけど、支払いページが表示できなかった。
    billingページ
    ?????

  • herokuアプリを作って最初のpushで、エラーになった。これはシンプルなディレクトリをあげようとすると、PHPのアプリ(Framework:PHP)として登録されてしまい、その場合はindex.phpがないとエラーになるみたい。index.phpをルートに置くと解消されると言う謎仕様。
    Heroku push rejected, no Cedar-supported app detected
    herokuにただのWebページを乗せてみる

    index.phpがないと怒られる。エラーメッセージからは推測不可能な所がキモい。

6
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
9