Back to tech

Pythonで今日は何の日かを検索する

3 min read
Table of Contents

PythonでMediaWikiAPIを使用した今日は何の日かを検索できるプログラムを作りました 今日だけでなく、引数を入れることでその日はなにが起こったかがわかります

概要

検索結果はコマンドとテキストファイルへ出力します 出力方法を変えたいときは適宜編集してください

出力内容は、「できごと」『誕生日』『忌日』『記念日・年中行事』『アニメの出来事』『アニメの登場人物の誕生日』です

※ 文字コードはutf-8です
RaspberryPi で起動を確認しましたが、Windowsでは引数を指定して特定した日を検索できません。
今日起こった出来事は取得出来ます
原因は文字コードのエンコード・デコードです(そのうち実装するかも)

shift-jisでやると文字化けしますのでLinux環境推奨です。

不要な文字を削除できていないところがあるので改善したい所です。

ex) * チュラーロンコーン大王記念日**({{THA}})** とか

  • 2015 7/1 修正しました
    1. 国名の表示を変更した EX)({{THA}})→(THA)
    2. 引数にて取得したい引数を記述する時、4月14日のように○月☓日でなければエラーが出るようにした
    3. 他のpyファイルにimportしやすいようにした
  • 2015 7/3 修正
    1. さらに不要な文字列を削除できるようにした
    2. 記念日・年中行事の取得時に備考(*:)も持ってくるため、”*:“を”NB:“と変換できるようにした
  • 2015 8/3 修正
    1. 不要文字列である「仮リンク|」が含まれていたため削除するようにした

実行方法

今日の出来事が知りたい場合

pi@raspberrypi $ python WahtToday.py 解析した日付:6月30日

\== できごと ==

\* 789年(延暦8年6月3日 (旧暦)|6月3日) - 征東将軍紀古佐美の軍が蝦夷の頭領・アテルイ|阿弖流爲の軍に敗退。

\* 1333年(元弘3年/正慶2年5月18日 (旧暦)|5月18日) - 元弘の乱 鎌倉幕府軍と新田義貞率いる反幕府軍の合戦・鎌倉の戦い (元弘の乱)|鎌倉の戦いが始まる。

\* 1643年 - イングランド内戦 アドウォルトン・ムーアの戦い。

\* 1651年 - 大洪水時代・フメリヌィーツィクィイの乱 {{仮リンク|ベレステーチュコの戦い|en|Battle of Berestechko}}が終結。

\* 1688年(グレゴリオ暦7月10日) - 名誉革命 オランダ総督|オランダ統領ウィリアム3世 (イングランド王)|オラニエ公ウィレム3世(後のイングランド王ウィリアム3世)のもとにイングランド議会からのイングランド王即位要請の手紙が届く。 (enInvitation to William)

\* 1805年 - アメリカ合衆国議会でミシガン準州が発足。

\* 1846年 - ジョン・ラッセル (初代ラッセル伯爵)|ジョン・ラッセルがイギリスの32代首相に就任。

\-以下略-

指定した日にちに起こったことが知りたい場合

pi@raspberrypi $ python WahtToday.py 10月2日 解析した日付:10月2日

\== できごと ==

\* 1187年 - エルサレム王国がサラーフッディーンに降伏しエルサレムを開城。

\* 1835年 - ゴンザレスの戦いによりテキサス革命が始まる。

\* 1836年 - チャールズ・ダーウィンがビーグル (帆船)|ビーグル号による5年間の世界一周航海から帰国。この航海で得た見分が後に進化論として結実する。

\* 1889年 - 第1回パン=アメリカ会議がワシントンD.C.で開催。

\* 1900年 - 内務省 (日本)|内務省令として娼妓取締規則公布。

\* 1924年 - 国際連盟第5回総会でジュネーブ平和議定書が可決。

\* 1928年 - 神父・聖ホセマリア・エスクリバーによってマドリードにオプス・デイ創立。

\* 1930年 - 日本がロンドン海軍軍縮条約に批准。野党や枢密院 (日本)|枢密院が統帥権干犯問題を提起し反対するが失敗。

\* 1932年 - リットン報告書が公表される。

\* 1941年 - 第二次世界大戦・独ソ戦 ドイツ軍がモスクワ攻略戦(モスクワの戦い|タイフーン作戦)を開始。

\* 1943年 - 第二次世界大戦 「在学徴集延期臨時特例」公布。文科系学生の徴兵猶予を全面停止。(学徒出陣)

\* 1944年 - 第二次世界大戦 国内軍 (ポーランド)|ポーランド国内軍がドイツ軍に降伏し、ワルシャワ蜂起が終結。 -以下略-

ソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Create:K.Takano
import urllib2
import sys
import datetime
import re

def main():
 #欲しい日にちを持ってくる
 argv = sys.argv
 argc = len(argv)

 #引数がなかった時は日付を突っ込む
 if(argc == 1):
  #今日の日にち取得
  d = datetime.datetime.today()
  dayreq = '%s%s日' % (d.month, d.day) 
 
 else:
  #引数が違うときの処理
  if(re.match(r'\d+\d+日',argv[1]) == None):
   print "error!! [ example run:python WhatToday.py 4月13日 ]"
   sys.exit()

  else:
   #引数の日付を持ってくる
   dayreq = argv[1]

 #テキストファイルの準備
 f = open('whattoday.txt','w')

 #読み込む日付の出来事をテキストへ書き込む
 f.write(dayreq + '\n')
 #解析した日付を出力
 print '解析した日付:' + dayreq

 #wikiと日付を結合
 reqURL = ('http://ja.wikipedia.org/w/api.php?action=query&export&format=txt&titles=' + dayreq)

 #デバッグ
 #print '取得するURL:' + reqURL

 #URL解析
 response = urllib2.urlopen(reqURL, 'utf-8')

 for htmlline in response:
  #見出しの摘出
  if htmlline.startswith('==') == True:
   #見出しで出典か関連項目がでたらforを抜ける
   if '出典' in htmlline or '関連項目' in htmlline:
    break

   #見出しをテキストファイルへ書き込み 先頭に改行を入れることで出力が見やすくなる
   f.write('\n' + htmlline)
   ##commandで見たい人向け##
   print '\n' + htmlline

  #内容の摘出
  elif htmlline.startswith('*') == True:
   #いらない文字列を削除
   htmlline = htmlline.replace('[[','')
   htmlline = htmlline.replace(']]','')
   htmlline = htmlline.split('<')[0]
   htmlline = htmlline.replace('-->','')
   htmlline = htmlline.replace('{{','')
   htmlline = htmlline.replace('}}','')
   htmlline = htmlline.replace('仮リンク|','')
   #備考欄を'*:'から'NB:'に変更
   htmlline = htmlline.replace('*:','NB:')

   #splitで末尾も削除したため、文末に改行を付け加える
   if htmlline.endswith('\n') == False:
    htmlline = htmlline + '\n'

   f.write(htmlline)
    
   ##commandで見たい人向け##
   print htmlline

 #最後に閉じる
 response.close()
 f.close()


if __name__ == "__main__":
 main()

Twitterにてこれを応用したBOT作りました → http://twitter.com/momijinn_raspi