You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
9.7 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. import requests
  2. from bs4 import BeautifulSoup as bs
  3. import bot_app.fulfillment.utility as util
  4. from datetime import datetime
  5. base_url = 'http://family.wanhai.com'
  6. account = None
  7. password = None
  8. payload = {'Account': account, 'Password': password}
  9. meeting_rooms = None
  10. massage_rooms = None
  11. session_req = None
  12. def getSession(check_login=True):
  13. global session_req
  14. if session_req is None:
  15. session_req = requests.Session()
  16. if check_login and not isLogin():
  17. login(account, password)
  18. return session_req
  19. def login(id, pw):
  20. global session_req
  21. if session_req is None:
  22. session_req = requests.Session()
  23. res = session_req.post(
  24. base_url + '/Login.jsp', data={'Account': id, 'Password': pw})
  25. print(res.request.headers['Cookie'])
  26. def isLogin():
  27. global session_req
  28. if session_req is None:
  29. session_req = requests.Session()
  30. route_url = base_url + '/LeaseEquip/equipListOnePage.jsp'
  31. res = session_req.get(route_url, allow_redirects=False)
  32. if res.status_code == 200:
  33. print(res.request.headers['Cookie'])
  34. return True
  35. else:
  36. return False
  37. # 取得可用設備列表
  38. def get_equip_list(type='MEETING'):
  39. equipList_url = base_url + '/LeaseEquip/equipListOnePage.jsp'
  40. result = getSession().get(
  41. equipList_url + '?file_num=61621&account_id=' + account + '&equip_type=' + type)
  42. print(result.request.headers['Cookie'])
  43. soup = bs(result.text, 'html.parser')
  44. elements = soup.find_all('input', {'id': 'check2', 'name': 'ID_keyD'})
  45. equipDict = dict()
  46. for v1, v2 in [(e['value'], e.find_parent().find_next_sibling().text) for e in elements]:
  47. equipDict[v1] = {'id': v1, 'type': type, 'name': v2}
  48. # print(equipDict)
  49. return equipDict
  50. # 取得設備名稱
  51. def get_equip_name(equipId):
  52. if equipId in meeting_rooms.keys():
  53. return meeting_rooms[equipId]['name']
  54. elif equipId in massage_rooms.keys():
  55. return massage_rooms[equipId]['name']
  56. else:
  57. return None
  58. # 查詢設備是否已被占用(by 特定日期/時段)
  59. def is_equip_in_use(equip_id, b_date=datetime.today(), b_time=datetime.now(), e_time=datetime.now(),
  60. equip_type='MEETING'):
  61. if equip_type == 'MASSAGE':
  62. print('Not Support Now!!!')
  63. return False
  64. equipUsageURL = base_url + '/LeaseEquip/equipUsage.jsp'
  65. payload = [('q_from_date', datetime.strftime(b_date, '%Y%m%d')),
  66. ('q_from_time', datetime.strftime(b_time, '%H:%M:%S')),
  67. ('q_to_date', datetime.strftime(b_date, '%Y%m%d')),
  68. ('q_to_time', datetime.strftime(e_time, '%H:%M:%S')),
  69. ('q_equip_type', equip_type),
  70. ('ID_keyD', equip_id)]
  71. result = getSession().post(equipUsageURL, data=payload)
  72. soup = bs(result.text, 'html.parser')
  73. elements = soup.select('td > b')
  74. if (len(elements) > 1) and ('目前無人預約' not in elements[1].text):
  75. return True
  76. else:
  77. return False
  78. return False
  79. # 查詢設備可用時段(by 特定日期)
  80. def search_available_time(equip_type, equip_id, strDate):
  81. if equip_type == 'MASSAGE':
  82. print('Not Support Now!!!')
  83. return
  84. from interval import Interval
  85. equipUsageURL = base_url + '/LeaseEquip/equipUsage.jsp'
  86. payload = [('q_from_date', strDate),
  87. ('q_from_time', ''),
  88. ('q_to_date', strDate),
  89. ('q_to_time', ''),
  90. ('q_equip_type', equip_type),
  91. ('ID_keyD', equip_id)]
  92. result = session_req.post(equipUsageURL, data=payload)
  93. soup = bs(result.text, 'html.parser')
  94. # print(soup.prettify())
  95. print('{}:\n{}'.format(equip_id, soup.select('td[nowrap]')[0].text))
  96. # 查詢可用設備(by 特定日期/時段)
  97. def search_available_equips(equip_type, strDate, b_time, e_time):
  98. if equip_type == 'MASSAGE':
  99. print('Not Support Now!!!')
  100. return
  101. from interval import Interval
  102. equipUsageURL = base_url + '/LeaseEquip/equipUsage.jsp'
  103. payload = [('q_from_date', strDate),
  104. ('q_from_time', ''),
  105. ('q_to_date', strDate),
  106. ('q_to_time', ''),
  107. ('q_equip_type', equip_type)]
  108. payload.extend([('ID_keyD', e) for e in meeting_rooms.keys()])
  109. result = getSession().post(equipUsageURL, data=payload)
  110. soup = bs(result.text, 'html.parser')
  111. equips = [equip.text.strip() for equip in soup.select(
  112. 'div[id="equips"] td[align="center"]')]
  113. # print(equips)
  114. availList = list()
  115. for index, elem in enumerate(soup.select('td[nowrap]')):
  116. availList.insert(index, 1)
  117. if '目前無人預約' in elem.text:
  118. continue
  119. target = Interval(int(b_time), int(e_time), closed=False)
  120. periods = [x.text.split('~') for x in elem.select('b')]
  121. periodIntvs = [Interval(x[0], x[1]) for x in list(
  122. map(lambda bb: [int(x) for x in bb], periods))]
  123. # print(equips[index])
  124. # for pp in periodIntvs:ontext['lifespanCount'] = 0
  125. # print(pp,'\n')
  126. for periodIntv in periodIntvs:
  127. if target.overlaps(periodIntv):
  128. availList[index] = 0
  129. break
  130. # print(availList)
  131. for index, avail in enumerate(availList):
  132. if avail == 1:
  133. print('{}\n'.format(equips[index]))
  134. # 預約設備
  135. def booking_equip(equip_id, equip_type, strDate, b_time, e_time):
  136. if equip_type == 'MASSAGE':
  137. print('Not Support Now!!!')
  138. bookingURL = base_url + '/LeaseEquip/equipBooking_db.jsp'
  139. payload = {
  140. 'item_choice1': 'F',
  141. 'equipment_id1': equip_id,
  142. 'lease_action1': 'book',
  143. 'str_yymmdd': strDate,
  144. 'f_rent_fm1': b_time,
  145. 'f_rent_to1': e_time,
  146. 'equip_count': '1',
  147. 'f_str_remark1': '#7253',
  148. 'contactor_mail1': 'x'
  149. # 'lease_time_code_1': '',
  150. # 'term_time_code1': '',
  151. # 'equip_name_c1': '<5F>台北廳 【可容納90人】',
  152. # 'lease_time_code1': 'enter_rent_time',
  153. # 'tea1': '0',
  154. # 'water1': '0',
  155. # 'coffee1': '0',
  156. # 'meeting_type1': 'IN',
  157. # 'selected_year': '2019',
  158. # 'selected_month': '06',
  159. # 'selected_day': '06',
  160. # 'equip_type': 'MEETING',
  161. # 'fm_date': '20190606',
  162. # 'to_date': '20190606',
  163. # 'select_equips': equip_id
  164. }
  165. soup = bs(getSession().post(bookingURL, data=payload).text, 'html.parser')
  166. print(soup.select('table tr:nth-child(2) td:nth-child(5)')[0].text)
  167. # print(soup.prettify())
  168. # 取消預約設備
  169. def cancel_booking(equip_type, rent_no):
  170. if equip_type == 'MASSAGE':
  171. print('Not Support Now!!!')
  172. bookingURL = base_url + '/LeaseEquip/userBooking_db.jsp'
  173. payload = {
  174. # 'ID_key': '0u',
  175. # 'action_type_0u': 'U',
  176. 'action_type': 'D',
  177. 'ID_keyDD': rent_no,
  178. # 'i_rent_no_0u': rent_no
  179. # 'ID_key': '1u',
  180. # 'action_type_1u': 'U',
  181. # 'i_rent_no_1u': '350438',
  182. # 'q_equip_id':'',
  183. # 'q_rent_date':'',
  184. # 'q_rent_no':'',
  185. # 'q_su_id':''
  186. }
  187. soup = bs(getSession().post(bookingURL, data=payload).text, 'html.parser')
  188. print(soup.prettify())
  189. # 列出個人設備預約紀錄
  190. def get_rented_equips():
  191. equipList_url = base_url + '/LeaseEquip/equipListOnePage.jsp'
  192. result = getSession().get(
  193. equipList_url + '?file_num=61621&account_id=' + account + '&equip_type=MEETING')
  194. soup = bs(result.text, 'html.parser')
  195. elements = soup.select('form[name="dataForm1"] input[name^="i_rent_no"]')
  196. elements = [x.find_parent().select('td[align="center"]') for x in elements]
  197. rentedList = [(x[0].input['value'], x[1].text, x[2].text, x[3].text)
  198. for x in elements]
  199. return rentedList
  200. def list_rented_equips(fulfillment):
  201. rented_list = get_rented_equips()
  202. if len(rented_list) == 0:
  203. return util.simple_response(text_content=u'您目前沒有預約任何的設備')
  204. else:
  205. str_rented_list = u'您預約的設備如下:\n'
  206. str_rented_list += ', \n'.join([x[2] + ' ' + x[3] + ' ' + x[1] for x in rented_list])
  207. return util.simple_response(text_content=str_rented_list)
  208. def list_all_meeting_rooms(fulfillment):
  209. global meeting_rooms
  210. str_meeting_rooms = ', \n'.join([x['id'] + x['name'] for x in meeting_rooms.values()])
  211. return util.simple_response(text_content=str_meeting_rooms)
  212. def check_equip_in_use(fulfillment):
  213. try:
  214. date_pattern = '%Y-%m-%dT%H%M%S%z'
  215. params = fulfillment.get('queryResult').get('parameters')
  216. meeting_room = params.get('meeting_room')
  217. date = datetime.strptime(params.get('date').replace(':', ''), date_pattern)
  218. start_time = datetime.strptime(params.get('time-period').get('startTime').replace(':', ''), date_pattern)
  219. end_time = datetime.strptime(params.get('time-period').get('endTime').replace(':', ''), date_pattern)
  220. meeting_room_id = next([x['id'] for x in meeting_rooms if x['name'].find(meeting_room) >= 0], None)
  221. if is_equip_in_use(meeting_room_id, date, start_time, end_time):
  222. return util.simple_response(text_content=meeting_room+u'已經被人預約')
  223. else:
  224. return util.simple_response(text_content=meeting_room+u'尚未被預約')
  225. except Exception as e:
  226. return util.simple_response(text_content=str(e))
  227. pass
  228. def greet_cancel(fulfillment):
  229. util.reset_all_contexts(fulfillment)
  230. return util.simple_response(fulfillmentObj={
  231. 'fulfillmentText': '好的,沒有問題!',
  232. 'outputContexts': fulfillment.get('queryResult').get('outputContexts')
  233. })
  234. def init_app(app):
  235. global password, account, meeting_rooms
  236. account = app.config['WHL_FAMILY_ID']
  237. password = app.config['WHL_FAMILY_PW']
  238. login(account, password)
  239. meeting_rooms = get_equip_list()