# encoding: utf-8
from itertools import takewhile
import Skype4Py
import cjson as json
import urllib2
import datetime
import time
OUTPUT_ENCODING = 'UTF-8'
SERVICE_URI = 'http://api.jugemkey.jp/api/horoscope/free/%(year)04d/%(month)02d/%(day)02d'
ZODIACS = {
u'牡羊座': ( (3, 21), (4, 20) ),
u'牡牛座': ( (4, 21), (5, 21) ),
u'双子座': ( (5, 22), (6, 21) ),
u'蟹座': ( (6, 22), (7, 22) ),
u'獅子座': ( (7, 23), (8, 22) ),
u'乙女座': ( (8, 23), (9, 22) ),
u'天秤座': ( (9, 23), (10, 23) ),
u'蠍座': ( (10, 24), (11, 22) ),
u'射手座': ( (11, 23), (12, 22) ),
u'山羊座': ( (12, 23), (1, 20) ),
u'水瓶座': ( (1, 21), (2, 19) ),
u'魚座': ( (2, 20), (3, 20) ),
}
def get_zodiac(d):
nd = d.month * 31 + d.day
for k, v in ZODIACS.iteritems():
nv = [ _[0] * 31 + _[1] for _ in v ]
if nv[0] < nv[1]:
if nv[0] <= nd and nd <= nv[1]:
return k
else:
if nv[0] <= nd and nd < 13 * 31:
return k
elif 0 <= nd and nd <= nv[1]:
return k
assert False
def fetch_astrogy_data(d):
d = dict(year=int(d.year), month=int(d.month), day=int(d.day))
s = urllib2.urlopen(SERVICE_URI % d)
charset = 'utf-8'
for i in s.headers.plist:
i = i.split('=', 2)
if len(i) == 2 and i[0].strip().lower() == 'charset':
charset = i[1].strip()
data = json.decode(unicode(s.read(), charset))['horoscope']['%(year)04d/%(month)02d/%(day)02d' % d]
retval = {}
for i in data:
retval[i['sign']] = i
return retval
def format_astrogy_entry(i):
def stars(n):
return u"★" * n + u"☆" * (5 - n)
retval = u""
retval += u"%d位 %s" % (i['rank'], i['sign'])
retval += u"\n"
retval += u"総合: %s" % stars(i['total'])
retval += u"\n"
retval += u"恋愛運: %s" % stars(i['love'])
retval += u"\n"
retval += u"金運: %s" % stars(i['money'])
retval += u"\n"
retval += u"仕事運: %s" % stars(i['job'])
retval += u"\n"
retval += u"ラッキーカラー: %s" % i['color']
retval += u"\n"
retval += i['content']
retval += u"\n"
return retval
if __name__ == "__main__":
skype = Skype4Py.Skype(Transport='x11')
def notifyEventHandler(message, status):
if status in ('RECEIVED', 'READ'):
if message.Body == "#uranai":
birthday = message.Sender.Birthday
print birthday
if birthday:
message.Chat.SendMessage(format_astrogy_entry(fetch_astrogy_data(datetime.date.today())[get_zodiac(birthday)]).encode(OUTPUT_ENCODING))
else:
message.Chat.SendMessage(u"プロフィールに誕生日が設定されていないようです")
elif message.Body == "#uranai-ichiban":
data = fetch_astrogy_data(datetime.date.today())
a = [ (m, data[get_zodiac(m.Birthday)]) for m in message.Chat.Members if m != skype.User() and m.Birthday]
a.sort(lambda a, b: cmp(a[1]['rank'], b[1]['rank']))
msg = u"このチャットで今日一番運勢がいいのは以下の%sの皆さんです:\n" % a[0][1]['sign']
for idx, (m, i) in enumerate(takewhile(lambda p: p[1]['rank'] == a[0][1]['rank'], a)):
if idx > 0:
msg += "、"
msg += u"%sさん" % m.FullName
message.Chat.SendMessage(msg)
skype.OnMessageStatus = notifyEventHandler
skype.Attach()
while True:
time.sleep(1)