Exemple #1
0
    async def before_campus(cls, bot, context, msg, input_vars, update_vars,
                            extras, **kwargs):
        prefix = kwargs["prefix"]
        var_scope = kwargs["var_scope"]
        update_vars["state", var_scope] = prefix + "beforeCampus"

        await log.debug("Requesting EC...")
        text = await util.http_get("http://202.120.163.129:88/default.aspx",
                                   proxy=priv_config.PROXY_TJ)
        await log.debug("Response from EC: " + text)
        html = bs4.BeautifulSoup(text, "lxml")

        powerbill_viewStateStr = html.select_one("#__VIEWSTATE")["value"]
        update_vars[prefix + "viewStateStr",
                    var_scope] = json.dumps(powerbill_viewStateStr)

        tagCampus = html.select_one("#drlouming")
        defaultCampusValue = tagCampus.find("option",
                                            {"selected": True})["value"]

        powerbill_campusList = []

        for child in tagCampus.select("option"):
            if child["value"] != defaultCampusValue:
                powerbill_campusList.append(
                    (child["value"], child.string.strip()))

        powerbill_campusList = dict(enumerate(powerbill_campusList))

        outString = ("(个人限定)" if var_scope == const.INDIVIDUAL else
                     "") + u"(说“退出”可以退出流程)选择校区:"
        outString += u"\n"

        for i in powerbill_campusList:
            outString += "\n" + str(i) + '. ' + powerbill_campusList[i][1]

        update_vars[prefix + "campusList",
                    var_scope] = json.dumps(powerbill_campusList)
        extras["_return"] = {"reply": outString, "auto_escape": False}

        return True
Exemple #2
0
    async def direct_query(cls, bot, context, msg, input_vars, update_vars,
                           extras, **kwargs):
        prefix = kwargs["prefix"]
        var_scope = kwargs["var_scope"]

        final_location = input_vars[prefix + 'final_location']

        powerbill_campus = json.loads(input_vars[prefix + 'campus_saved'])
        powerbill_building = json.loads(input_vars[prefix + 'building_saved'])
        powerbill_floor = json.loads(input_vars[prefix + 'floor_saved'])
        powerbill_room = json.loads(input_vars[prefix + 'room_saved'])
        powerbill_viewStateStr = json.loads(input_vars[prefix +
                                                       'viewStateStr_saved'])

        jar = aiohttp.CookieJar(unsafe=True)
        async with aiohttp.ClientSession(
                cookie_jar=jar,
                timeout=aiohttp.ClientTimeout(total=5)) as session:
            r = await session.post("http://202.120.163.129:88/default.aspx",
                                   data={
                                       "__EVENTTARGET": "",
                                       "__EVENTARGUMENT": "",
                                       "__LASTFOCUS": "",
                                       "__VIEWSTATE": powerbill_viewStateStr,
                                       "__VIEWSTATEGENERATOR": "CA0B0334",
                                       "drlouming": powerbill_campus,
                                       "drceng": powerbill_building,
                                       "dr_ceng": powerbill_floor,
                                       "drfangjian": powerbill_room,
                                       "radio": "usedR",
                                       "ImageButton1.x": 50,
                                       "ImageButton1.y": 50
                                   },
                                   proxy=priv_config.PROXY_TJ)
            data = await r.text()
            extras["powerbill_direct_query_text"] = data
            html = bs4.BeautifulSoup(data, "lxml")

        credit = html.select_one(".number.orange").string

        extras["_return"] = {
            "reply":
            final_location + " 电费还剩 ¥ " + credit + "。" +
            ("(个人限定)" if var_scope == const.INDIVIDUAL else ""),
            "auto_escape":
            False
        }
        return True
Exemple #3
0
    async def before_building(cls, bot, context, msg, input_vars, update_vars,
                              extras, **kwargs):
        prefix = kwargs["prefix"]
        var_scope = kwargs["var_scope"]

        if cls.handle_exit(update_vars, extras, var_scope):
            return True

        msg_strip: str = extras["_msg_strip"]
        if not msg_strip.isdigit():
            return False

        opt = (msg_strip)

        powerbill_campusList = json.loads(input_vars[prefix + 'campusList'])
        powerbill_viewStateStr = json.loads(input_vars[prefix +
                                                       'viewStateStr'])

        await log.debug("campusList: " + str(powerbill_campusList))
        if opt in powerbill_campusList:
            powerbill_campus = powerbill_campusList[opt][0]
            update_vars[prefix + "campus",
                        var_scope] = json.dumps(powerbill_campus)
        else:
            return False

        update_vars["state", var_scope] = prefix + "beforeBuilding"

        text = await util.http_post("http://202.120.163.129:88/default.aspx",
                                    data={
                                        "__EVENTTARGET": "drlouming",
                                        "__EVENTARGUMENT": "",
                                        "__LASTFOCUS": "",
                                        "__VIEWSTATE": powerbill_viewStateStr,
                                        "__VIEWSTATEGENERATOR": "CA0B0334",
                                        "drlouming": powerbill_campus,
                                        "drceng": "",
                                        "dr_ceng": "",
                                        "drfangjian": ""
                                    },
                                    proxy=priv_config.PROXY_TJ)
        html = bs4.BeautifulSoup(text, "lxml")

        powerbill_viewStateStr = html.select_one("#__VIEWSTATE")["value"]
        update_vars[prefix + "viewStateStr",
                    var_scope] = json.dumps(powerbill_viewStateStr)

        tagBuilding = html.select_one("#drceng")
        defaultBuildingValue = tagBuilding.find("option",
                                                {"selected": True})["value"]

        powerbill_buildingList = []

        for child in tagBuilding.select("option"):
            if child["value"] != defaultBuildingValue:
                powerbill_buildingList.append(
                    (child["value"], child.string.strip()))

        powerbill_buildingList = dict(enumerate(powerbill_buildingList))

        outString = u"(说“退出”可以退出流程)选择楼栋:"
        outString += u"\n"

        for i in powerbill_buildingList:
            outString += "\n" + str(i) + '. ' + powerbill_buildingList[i][1]

        update_vars[prefix + "buildingList",
                    var_scope] = json.dumps(powerbill_buildingList)

        extras["_return"] = {"reply": outString, "auto_escape": False}
        return True
Exemple #4
0
    async def after_room(cls, bot, context, msg, input_vars, update_vars,
                         extras, **kwargs):
        prefix = kwargs["prefix"]
        var_scope = kwargs["var_scope"]
        msg_strip: str = extras["_msg_strip"]

        if cls.handle_exit(update_vars, extras, var_scope):
            return True

        powerbill_campus = json.loads(input_vars[prefix + 'campus'])
        powerbill_building = json.loads(input_vars[prefix + 'building'])
        powerbill_floor = json.loads(input_vars[prefix + 'floor'])
        powerbill_roomList = json.loads(input_vars[prefix + 'roomList'])
        powerbill_viewStateStr = json.loads(input_vars[prefix +
                                                       'viewStateStr'])

        final_location: str = ""

        valid = False
        for x in powerbill_roomList:
            if msg_strip == str(powerbill_roomList[x][1]):
                valid = True
                powerbill_room = powerbill_roomList[x][0]
                final_location = input_vars[
                    prefix + 'final_location'] + powerbill_roomList[x][1]
                update_vars[prefix + "final_location",
                            var_scope] = final_location
                update_vars[prefix + "room",
                            var_scope] = json.dumps(powerbill_room)
                break

        if not valid:
            log.error("Room num not found!")
            return False

        update_vars["state", var_scope] = prefix + "askSave"

        # There will be a redirect, the destination page needs a Cookie, thus the Session.
        # RFC 2109 explicitly forbids cookie accepting from URLs with IP address instead of DNS name, but electricity API has IP as host now, thus the unsafe cookie jar.
        jar = aiohttp.CookieJar(unsafe=True)
        async with aiohttp.ClientSession(cookie_jar=jar) as session:
            r = await session.post("http://202.120.163.129:88/default.aspx",
                                   data={
                                       "__EVENTTARGET": "",
                                       "__EVENTARGUMENT": "",
                                       "__LASTFOCUS": "",
                                       "__VIEWSTATE": powerbill_viewStateStr,
                                       "__VIEWSTATEGENERATOR": "CA0B0334",
                                       "drlouming": powerbill_campus,
                                       "drceng": powerbill_building,
                                       "dr_ceng": powerbill_floor,
                                       "drfangjian": powerbill_room,
                                       "radio": "usedR",
                                       "ImageButton1.x": 50,
                                       "ImageButton1.y": 50
                                   },
                                   proxy=priv_config.PROXY_TJ)
            html = bs4.BeautifulSoup(await r.text(), "lxml")

        powerbill_viewStateStr = html.select_one("#__VIEWSTATE")["value"]
        powerbill_viewStateGeneratorStr = html.select_one(
            "#__VIEWSTATEGENERATOR")["value"]
        #powerbill_eventValidationStr = html.select_one("#__EVENTVALIDATION")["value"]
        powerbill_eventValidationStr = "_ignored_"
        update_vars[prefix + "viewStateStr_new",
                    var_scope] = json.dumps(powerbill_viewStateStr)
        update_vars[prefix + "viewStateGeneratorStr_new",
                    var_scope] = json.dumps(powerbill_viewStateGeneratorStr)
        update_vars[prefix + "eventValidationStr_new",
                    var_scope] = json.dumps(powerbill_eventValidationStr)

        credit = html.select_one(".number.orange").string

        extras["_return"] = {
            "reply":
            final_location + " 电费还剩 ¥ " + credit + "。是否为" +
            ("个人" if var_scope == const.INDIVIDUAL else "本群") + "保存" +
            ("" if var_scope == const.INDIVIDUAL else "公共") + "房间数据?",
            "auto_escape":
            False
        }
        return True