cronはGoogleAppsScriptで
GoogleAppsScriptというツールから、定期実行スクリプトを登録できる。
これは知らなかった。GoogleAppEngineとは関係なくて、Googleアカウントでエディター画面にログインする。
書くスクリプトは.gsというJavaScriptっぽいやつで、Web上のエディターから登録する。
無料でお手軽Cron!Google Apps Scriptを使ってみる。
ほぼこのサイトの通りで、URLをfetch実行させて、戻り値(ブラウザ出力内容)をメール送信する。
URLのページが404とかでもcronエラーにならないように、引数 muteHttpExceptionsを追加した。こうすると、404なら404のページ内容が返ってくる。
普通に管理画面があって、cronバッチの実行日時とか頻度を設定できる。
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
でコントローラとビューを作成。
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)できるらしい。それを使おうと思ったのだけど、カード登録が必要になる。カード登録しようと思ったら、そんなはずはないと思うんだけど、支払いページが表示できなかった。
?????-
herokuアプリを作って最初のpushで、エラーになった。これはシンプルなディレクトリをあげようとすると、PHPのアプリ(Framework:PHP)として登録されてしまい、その場合はindex.phpがないとエラーになるみたい。index.phpをルートに置くと解消されると言う謎仕様。
Heroku push rejected, no Cedar-supported app detected
herokuにただのWebページを乗せてみるindex.phpがないと怒られる。エラーメッセージからは推測不可能な所がキモい。