時候の挨拶

30分プログラム、その251。時候の挨拶を出力するプログラム。
単に日付にあわせて、直子の代筆から時候の挨拶を取得して、ランダムに一つ出力するだけ。
詰ったのは、PythonUTF-8以外を扱う方法。Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法にあるようにcodecモジュールを使えばいいらしい。

たとえば、Shift_JISのWebページを取得する場合は、

fh = codecs.getreader('shift_jis')(urllib.urlopen(url))

としてやる。

使い方

$ python season_msg.py
余寒なお去りがたきおりから、ますますご発展の事お喜び申し上げます。

$ python season_msg.py
雪の消え間に久しぶりで黒い土が見えはじめましたが、皆様ますますご清栄のこととお喜び申し上げます。

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# season_msg.py -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/02/22 21:42:04
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
import urllib
import datetime
import random
import re
import codecs
import sys

sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
class SeasonMessage:
  def current_message(self):
    """Get message for today"""
    return self.message(datetime.date.today())

  def message(self,date):
    """Get message for 'date'"""
    return random.choice(self.all_messages(date))
    
  def all_messages(self,date):
    """Get all meggages for 'date'"""
    return self.__parse(self.__open(date))

  def __open(self,date):
    # jan: http://sample.teglet.co.jp/doc/133/
    url = 'http://sample.teglet.co.jp/doc/%d/' % (date.month+132)
    return codecs.getreader('shift_jis')(urllib.urlopen(url))

  def __parse(self,fh):
    l = []
    r = re.compile(u"<br>・([^<>]+)")
    for line in fh.read().split("\r"):
      m = r.search(line)
      if m:
        l.append(m.group(1))
    return l

if __name__ == '__main__':
  sm = SeasonMessage()
  print sm.current_message()