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
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
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
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