主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GoogleAppEngineで指定時間毎にジョブを実行する Cron jobs

                
tags:
botを作るときには、定期時間毎にジョブを実行する。GoogleAppEngine(Python)にもそんな機能が備わっている。Cronという機能だ。
https://developers.google.com/appengine/docs/python/config/cron?hl=ja#Securing_URLs_for_Cron

以前作った各国のAmazon商品の値段比較Webアプリで、USやUKの価格を日本円に換算するときに使う為替レートを自動で毎日更新したかったので、このCron機能を使ってみた。
http://amazonstinger.appspot.com/

まずcron.yamlファイルの用意。ここに実行時間や、実行時にどのpathにアクセスするかを記述する。記述したらapp.yamlと同じディレクトリに保存する。
cron:
- description: daily summary job
url: /cron/currency
schedule: every day 04:00
timezone: Asia/Tokyo


次にapp.yamlファイルを書き換える。Cron実行時にリクエストを受けるpathにどう対応するかを記述する。ここで管理者権限がある者だけに、このpathへのアクセス権を与える。管理者権限による保護を必要としなければapp.yamlを書き換えずに、pythonスクリプトにハンドラクラスを追加するだけでもいいんだろう。
- url: /cron/currency
script: cron.py
login: admin


最後に。app.yamlで/cron/currencyにリクエストがあったら、cron.pyで対応するように書いたので、cron.pyを書く。このスクリプトでは/cron/currencyにリクエストがあったらYahoo!の為替サイトへアクセスし、為替レートを取得、それをデータストアに保存している。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cgi
import datetime
import urllib2
import re

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.ext.db import Key

def get_us_rate():
str = urllib2.urlopen("http://quote.yahoo.co.jp/m5?a=1&s=USD&t=JPY").read()
us_currency = re.search(r"USDJPY=X1([\d:]+)([\d\.]+)", str).group(2)
return us_currency

def get_uk_rate():
str = urllib2.urlopen("http://quote.yahoo.co.jp/m5?a=1&s=GBP&t=JPY").read()
uk_currency = re.search(r"GBPJPY=X1([\d:]+)([\d\.]+)", str).group(2)
return uk_currency

def put_to_db(string):
data = Data.get_by_key_name("rate")
data.rate_list = (string)
data.date = datetime.datetime.now() + datetime.timedelta(hours=9)
data.put()

class Data(db.Model):
rate_list = db.StringProperty()
date = db.DateTimeProperty()

class RenewRate(webapp.RequestHandler):
def get(self):
usrate = get_us_rate()
ukrate = get_uk_rate()
string = "{'us':%s, 'uk':%s}" % (usrate, ukrate)
put_to_db(string)
print usrate,ukrate

def main():
application = webapp.WSGIApplication(
[('/cron/currency', RenewRate),],
debug=False)
run_wsgi_app(application)

if __name__ == "__main__":
main()
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。