Ejemplo n.º 1
0
 def __init__(self):
     self.token = "hunshuibainianguorenjianyixing"
     self.msg_parser = WXMessageParser()
     self.msg_builder = WXMessageBuilder()
     self.msg_favword = WXFavWord()
Ejemplo n.º 2
0
class WXService:
    def __init__(self):
        self.token = "hunshuibainianguorenjianyixing"
        self.msg_parser = WXMessageParser()
        self.msg_builder = WXMessageBuilder()
        self.msg_favword = WXFavWord()

    def verify(self, signature, timestamp, nonce, echostr):
        result = "parameter invalid"

        if signature and timestamp and nonce and echostr:
            # merge
            array = [self.token, timestamp, nonce]
            array.sort()
            content = reduce(lambda x, y: x + y, array)

            # sha1
            m = hashlib.sha1()
            m.update(content)
            digest = m.hexdigest()
            if signature == digest:
                result = echostr
            else:
                result = "signature={} invalid".format(signature)

        return result

    def get_zero_ytc(self, dtime, hour):
        zero_str = "{}-{}-{} {}:{}:{}".format(dtime.year, dtime.month, dtime.day, hour, 0, 0)
        zero_time = time.strptime(zero_str, "%Y-%m-%d %H:%M:%S")
        return int(time.mktime(zero_time))

    def z_str2datetime(self, tmstr):
        tmstr = tmstr.strip()
        t1 = time.strptime(tmstr, "%Y%m%d")

        if t1.tm_year < 1900:
            print "Big write is failed."
            t1 = time.strptime(tmstr, "%y%m%d")
        d = datetime.datetime(*tuple(t1)[:6])
        return d

    # subscribe and unsubscribe
    def on_event(self, msg):
        msgs = None
        if "subscribe" == msg.event:
            text = u"欢迎关注!\n\n这里分享的内容主要是挨踢、八卦、历史、科学。\n\n"
            text = text + u'由于微信未向普通订阅号/开发者模式公开每日群发图文消息的机制,所以请发送"i"来获取最新内容!\n\n'
            text = text + u"忆从樊口载春酒,步上西山寻野梅。\n"
            text = text + u"●苏东坡《武昌西山》"
            msgs = [{"title": text, "content": ""}]
        elif "unsubscribe" == msg.event:
            text = u"再见!"
            msgs = [{"title": text, "content": ""}]
        else:
            return -1, "post data is wrong"
        return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))

    # URL
    def on_url(self, msg):
        text = None
        msgs = None

        id, result = dba.msg_text_insert(msg)
        if id > 0:
            text = u"谢谢投递!"
            url = u"{}-{}".format(str(id), msg.content)
            add_task("FetchJobQueue", "/task/fetch", url)
        else:
            text = u"数据库操作不幸失败鸟!"
        msgs = [{"title": text, "content": ""}]
        return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))

    # command text
    def on_command(self, msg):
        now = datetime.datetime.now()
        cmd = msg.content
        offset_day = 0

        try:
            offset_day = int(cmd)
        except:
            offset_day = 0

        if cmd in ("i", "I"):
            yday = now - datetime.timedelta(days=1)

            # yestoday
            begin = self.get_zero_ytc(yday, 0)
            end = self.get_zero_ytc(now, 0)
            msgs = dba.msg_text_query_time(begin, end).list()
            return 0, self.msg_builder.build(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif "0" == cmd:
            tday = now + datetime.timedelta(days=1)

            # today
            begin = self.get_zero_ytc(now, 0)
            end = self.get_zero_ytc(tday, 0)
            msgs = dba.msg_text_query_time(begin, end).list()
            return 0, self.msg_builder.build(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif cmd in ("h", "H"):
            text = u"发送URL投稿,发送i获取最新内容,发送-1获取前日内容,依此类推。"
            msgs = [{"title": text, "content": ""}]
            return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif cmd in ("v", "V"):
            text = u"樊口的行板  版本号:ver:0.0.0.1 update131213。"
            msgs = [{"title": text, "content": ""}]
            return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif cmd in ("f", "F"):
            begin = self.get_zero_ytc(now, 0)
            fw = self.msg_favword.FindIn(int(begin))
            text = u"今日热词:" + fw
            msgs = [{"title": text, "content": ""}]
            return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif offset_day < 0:
            begin_day = now - datetime.timedelta(days=abs(offset_day - 1))
            end_day = now - datetime.timedelta(days=abs(offset_day))

            # past day
            begin = self.get_zero_ytc(begin_day, 0)
            end = self.get_zero_ytc(end_day, 0)
            msgs = dba.msg_text_query_time(begin, end).list()
            return 0, self.msg_builder.build(msgs, msg.from_user, msg.to_user, int(time.time()))
        elif offset_day > 0:
            end_day = self.z_str2datetime(cmd)
            begin_day = end_day - datetime.timedelta(days=1)

            # past day
            begin = self.get_zero_ytc(begin_day, 0)
            end = self.get_zero_ytc(end_day, 0)
            msgs = dba.msg_text_query_time(begin, end).list()
            return 0, self.msg_builder.build(msgs, msg.from_user, msg.to_user, int(time.time()))

            # text = u"查询:" + end_day.strftime( "%Y%m%d" ) + "kk" + cmd
            # text = u"查询1:" + cmd + " kaka" + str2
            # text = u"查询:" + cmd + " kaka"

            # msgs = [{'title':text, 'content':''}]
            # return 0, self.msg_builder.to_text(msgs, msg.from_user, msg.to_user, int(time.time()))
        else:
            result = "unsupport"
            return -1, result

    # process wechat's message
    def process_message(self, data):
        msg = self.msg_parser.parse(data)
        if msg is None:
            return -1, "post data is wrong"

        if isinstance(msg, WXMessageEvent):
            return self.on_event(msg)
        elif isinstance(msg, WXMessageText):
            msg.content = msg.content.lower()
            if msg.content.startswith("http://") or msg.content.startswith("https://"):
                return self.on_url(msg)
            return self.on_command(msg)
        else:
            pass
        return -1, "post data unsupport"