2016년 6월 1일 수요일

초등학교 오늘의 식단 알리미 - telegram-cli

아침에 집사람이 뜬금없이 '아들 학교 오늘의 식단도 알림장 처럼 보내 주면 안돼?' 라고 했다.
학교 홈페이지에 알림장이 뜨면 자동으로 집사람에게 보내 주는 것을 라즈베리 파이에 돌리고 있는데, 최근에는 아들 친구 엄마들의 요청으로 단체 알림을 하고 있었는데 기능추가 요구가 들어 온 것이다 ㅠㅜ...

'월급을 달라!!!' 라고 데모를 했더니 방울 토마토 씻어 주고 가 버렸다.
받았으니 해야지 orz....

뚝딱 뚝딱...
최근에 python 을 접하게 되었는데 bash script 만 해 본 나에게는 참 깔끔한 녀석인것 같다.
그럼 만들어 볼까.

우선 초등학교 홈페이지를 살펴 보면,
우측에 핑크색으로 '오늘의 식단'이 소개 된다. 로그인이 필요 없기 때문에 알림장 보다는 간단하게 긁어 올 수 있다.

필요한 것은 python 의 datetime, requests, HTMLParser 정도에 telegram-cli 이다.
모든 초등학교가 같은 시스템을 사용하기 때문에 http://www.{학교이름}.es.kr 로 대체 하면 활용 가능하다.

단계별로 자세히 적어보면,
1. requests 로 'http://www.{학교이름}.es.kr' index.html 을 가져 온다.
2. 필요없는 내용은 잘라내기 위해서 '<!-- 오늘의 식단 시작 -->' 위는 strip 한다.
3. HTMLParser 로 '메뉴' 를 parsing 해서 날짜 와 메뉴를 저장한다.
4. 날짜가 오늘이고 아침 7시 이후이면 telegram 으로 엄마들에게 쏴준다.

알림을 받을 엄마들이 늘어나면서 list 로 변경해서 관리를 하고 있다. 코드 라인수도 줄어들고 좋다. 그럼 소스 코드를 살펴 보면,

1   #!/usr/bin/env python
2   #-*- coding: utf-8 -*-
3   import requests
4   import datetime, time
5   import os.path
6   import re
7   import sys
8   from HTMLParser import HTMLParser
9   from htmlentitydefs import name2codepoint
10
11  class MyHTMLParser(HTMLParser):
12      def __init__(self):
13          HTMLParser.__init__(self)
14          self.inLink = False
15          self.dataArray = []
16          self.count = 0
17          self.licount = 0
18          self.lasttag = None
19          self.lastname = None
20          self.lastvalue = None
21          self.href = ''
22          self.menu = ''
23
24      def handle_starttag(self, tag, attrs):
25          self.inLink = False
26          if tag == 'a':
27              if self.count == 3:
28                  self.inLink = True
29                  self.lasttag = tag
30                  for name, value in attrs:
31                      if name == 'href':
32                          self.href = value
33              self.count += 1
34
35      def handle_endtag(self, tag):
36          if tag == "a":
37              self.inlink = False
38
39      def handle_data(self, data):
40          if self.lasttag == 'a' and self.inLink and data.strip():
41              self.menu = data
42
43      def get_href(self):
44          return self.href
45
46      def get_menu(self):
47          return self.menu
48
49  parser1 = MyHTMLParser()
50
51  TAG_RE = re.compile(r'<[^>]+>')
52
53  def remove_tags(text):
54      return TAG_RE.sub('', text)
55
56  d = datetime.date.today()
57  yy = d.strftime('%Y')
58  mm = d.strftime('%m')
59  dd = d.strftime('%d')
60  t = datetime.datetime.now()
61  hh = t.strftime('%H')
62  if hh.startswith('0'):
63   hh = hh[1:]
64  if int(hh) < 7:
65     sys.exit(1)
66  td = yy + mm + dd
67  path = ""
68
69  if 1:
70     r = requests.get('http://www.{학교이름}.es.kr/')
71     r2 = r.text.encode('utf-8')
72
73     r3 = r2.split('<!-- 오늘의 식단 시작 -->');
74     parser1.feed(r3[1])
75
76     fname = ''.join(parser1.get_href().split('=')[1])
77     if os.path.isfile(fname) == True:
78        print 'already fetched'
79        sys.exit(1)
80
81     if  td == parser1.get_href().split('=')[1]:
82        if os.path.isfile(fname) != True:
83           with open(fname, 'w') as f:
84              f.write('오늘의 식단 [' + td + ']\n')
85              f.write(parser1.get_menu())
86        else:
87           print("DBG = " + "이미 파일이 있습니다.")
88           sys.exit(1)
89
90     fr = open("mail.list")
91     people = fr.readlines()
92     fr.close()
93
94     for p in people:
95        p = p.strip('\n')
96        print "send to : " + p
97        time.sleep(5)
98        os.system('tg-send-text.sh ' + p + ' ' + fname)

telegram-cli 사용은 shell script 로 하나 만들어 뒀다.
#!/bin/bash
to=$1
msg=$2
(sleep 5; echo "send_text $to $msg"; echo "safe_quit") | /home/pi/hobby/tg/bin/telegram-cli -k /home/pi/hobby/tg/tg-server.pub -W -R
send_msg 는 줄바꿈이 되지 않기 때문에 send_text 로 보내야 했다.
음... 아무래도 앞으로 보내 달라는 정보가 늘어 날 것 같다 ㅠㅜ

댓글 없음: