-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequestNum.py
More file actions
70 lines (58 loc) · 2.39 KB
/
requestNum.py
File metadata and controls
70 lines (58 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import yaml
import requests
from bs4 import BeautifulSoup
from utils.logger import setup_logger
from utils.configManager import ConfigManager
logger = setup_logger()
config = ConfigManager.get_config()
power_cfg = config['power_checker']
session = requests.Session()
session.headers.update({'User-Agent': power_cfg['user_agent']})
url = power_cfg['login_url']
def get_viewstate(html):
soup = BeautifulSoup(html, 'html.parser')
try:
viewstate = soup.find('input', {'name': '__VIEWSTATE'})['value']
viewstategenerator = soup.find('input', {'name': '__VIEWSTATEGENERATOR'})['value']
return viewstate, viewstategenerator
except (TypeError, KeyError):
logger.error("无法提取 __VIEWSTATE 或 __VIEWSTATEGENERATOR")
raise
def post_event(html, event_target, extra_fields):
viewstate, viewstategenerator = get_viewstate(html)
data = {
'__VIEWSTATE': viewstate,
'__VIEWSTATEGENERATOR': viewstategenerator,
'__EVENTTARGET': event_target,
'__EVENTARGUMENT': '',
'radio': 'buyR',
'ImageButton1.x': '10',
'ImageButton1.y': '10',
}
data.update(extra_fields)
return session.post(url, data=data)
def check_power(building=None, floor=None, room=None):
building = building or power_cfg['building']
floor = floor or power_cfg['floor']
room = room or power_cfg['room']
logger.info(f"开始获取电量(楼栋={building}, 楼层={floor}, 房间={room})")
try:
resp1 = session.get(url)
resp2 = post_event(resp1.text, 'drlouming', {'drlouming': building})
resp3 = post_event(resp2.text, 'ablou', {'drlouming': building, 'ablou': floor})
resp4 = post_event(resp3.text, 'drceng', {'drlouming': building, 'ablou': floor, 'drceng': room})
soup = BeautifulSoup(resp4.text, 'html.parser')
h6_tags = soup.find_all('h6')
if len(h6_tags) >= 2:
spans = h6_tags[1].find_all('span', {'class': 'number orange'})
if len(spans) >= 3:
remaining = spans[2].text.strip()
logger.info(f"获取成功,剩余电量:{remaining} 度")
return remaining
else:
logger.warning("未找到足够的 <span> 标签")
else:
logger.warning("未找到足够的 <h6> 标签")
except Exception as e:
logger.error(f"查询出错: {e}")
return None