def step1_login_reserve(driver, username, password, date, hour_from, hour_to, is_indoor): url = get_url(date, hour_from, hour_to, is_indoor) driver.get(url) try: input_member_code = driver.find_element_by_id( 'input_reserver_code' ) input_password = driver.find_element_by_id( 'input_reserver_password' ) input_submit = driver.find_element_by_css_selector( "input[type='submit']" ) except NoSuchElementException: # NOTE: ASSUMPTION specified time is unavailable # of course, this could be the case of form HTML changed logging.exception( ('step1: unable to locate username and password inputs: ' f'{date}-{hour_from}-{hour_to}') ) raise ReservationUnavailable() else: input_member_code.send_keys(username) input_password.send_keys(password) input_submit.click()
def open_websockets(connections_number): aliases = [str(uuid4()) for _ in xrange(connections_number)] wss_url = get_url(WSS_PROTOCOL, DOMAIN, WEBSOCKET_PATH) futures = [get_future(a, wss_url) for a in aliases] for f in futures: yield f
def logout(self): self.login_status = False package = self.login_session.post(config.get_url('login'), data=config.get_payload(mode='logout'), headers=self.login_config.headers) if package.status_code == 200: # print('Logout Successfully!') # print(config.msg_logout) self.login_session.close() else: self.login_session.close()
def login(): #Get config info url = config.get_url() username = config.get_user() password = config.get_password() driver.get(url) username = driver.find_element_by_id('LoginCtrl_txtLoginUsername') username.send_keys(username) password = driver.find_element_by_id('LoginCtrl_txtPassword') password.send_keys(password) login = driver.find_element_by_id('LoginCtrl_btnLogin').click()
def register_user(alias): register_url = get_url(HTTPS_PROTOCOL, DOMAIN, REGISTER_PATH) method = 'POST' headers = {"Content-Type": "application/x-www-form-urlencoded"} register_params = {'id': 0, 'alias': alias, 'device_type': DEVICE_TYPE} register_body = urlencode(register_params) http_client = AsyncHTTPClient() register_request = HTTPRequest(register_url, method, headers, register_body) yield http_client.fetch(register_request)
def send_req(nam, path, meth = 'GET', body = '', isCorrect = lambda c: c == 200): url = config.get_url(nam) cn = mk_conn(url) fullUrl = '%s/api/v3/%s' % (url, path) cn.request(meth, fullUrl, body, { 'PRIVATE-TOKEN': config.get_token(nam), 'Content-Type': 'application/json' }) rsp = cn.getresponse() ret = rsp.read() assert isCorrect(rsp.status), '''Server has returned an error URL: %s Status: %d Body: %s''' % (fullUrl, rsp.status, ret) return json.loads(ret)
def send_req(nam, path, meth='GET', body='', isCorrect=lambda c: c == 200): url = config.get_url(nam) cn = mk_conn(url) fullUrl = '%s/api/v3/%s' % (url, path) cn.request(meth, fullUrl, body, { 'PRIVATE-TOKEN': config.get_token(nam), 'Content-Type': 'application/json' }) rsp = cn.getresponse() ret = rsp.read() assert isCorrect(rsp.status), '''Server has returned an error URL: %s Status: %d Body: %s''' % (fullUrl, rsp.status, ret) return json.loads(ret)
def get_token(alias): yield register_user(alias) token_url = get_url(HTTPS_PROTOCOL, DOMAIN, TOKEN_PATH) method = 'POST' headers = {"Content-Type": "application/x-www-form-urlencoded"} # формируем запрос на получение токена token_params = {'alias': alias, 'app_id': APP_ID} token_body = urlencode(token_params) token_request = HTTPRequest(token_url, method, headers, token_body) http_client = AsyncHTTPClient() # получаем токен response = yield http_client.fetch(token_request) token = json.loads(response.body).get('token', None) raise gen.Return(token)
def login_init(self): package = self.login_session.post(config.get_url('login'), data=config.get_payload(mode='login_init'), headers=self.login_config.headers) if package.status_code == 200: package = package.json() self.server_status = package['result'] try: self.secure_random = package['secureRandom'] return package except KeyError: # print(config.msg_server_begin+package['message']) self.init_message = package['message'] self.login_session.close() return package else: # print('POST Unsuccessfully!') self.login_session.close() return {'result': False, 'message': '選課系統異常!無法登入!'}
def hermes_scraper(): wanted_bags = config.load() print(wanted_bags['categories']) URL = config.get_url() page = requests.get(URL, headers={'Cache-Control': 'no-cache'}) print(f'Status code: {page.status_code}') soup = BeautifulSoup(page.content, 'html.parser') bags_on_site = soup.find_all(class_='product-item-name') available_bags = [] print(f'Number of bags: {len(bags_on_site)}') for bag_on_site_html in bags_on_site: bag_on_site = bag_on_site_html.text.strip() print("Bag on site: " + bag_on_site) for wanted_bag in wanted_bags['categories']: if wanted_bag in bag_on_site: available_bags.append(bag_on_site) previous_bags = db.get_bags() available_bags.sort() print(f'Previous bags: {previous_bags}') print(f'Wanted bags: {wanted_bags}') print(f'Available bags: {available_bags}') print(f'previous bags == current bags: {previous_bags == available_bags}') if (previous_bags != available_bags): print("Change in bags") notify.email(wanted_bags, available_bags) db.update_bags(available_bags) else: print("No change") return str(available_bags) if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
def login(self, _id, _pw): if self.server_status and self.secure_random: self.student_id = _id student_pw = _pw hash_pw = hashlib.md5(student_pw.encode("utf-8")).hexdigest() hash_pw = hmac.new(str.encode(hash_pw), digestmod=hashlib.sha256) hash_pw.update(str.encode(self.student_id)) hash_pw.update(str.encode(self.secure_random)) hash_pw = hash_pw.hexdigest() package = self.login_session.post(config.get_url('login'), data=config.get_payload(mode='login', userid=self.student_id, hash=hash_pw), headers=self.login_config.headers) # print(package.json()) if package.status_code == 200: if package.json()['result']: # 允許使用者名單 sheet_id = 'xxxxxxxxxxxxxxxxxxxxxxx' sheet_gid = 'xxxxxxxxxxxxxxxxxxxxxxx' allowed_user_list = requests.get('https://docs.google.com/spreadsheets/d/'+sheet_id+ '/export?format=csv&gid='+sheet_gid).text.split( '\r\n') # print(type(self.student_id)) tmp_hash = hashlib.sha256() tmp_hash.update(self.student_id.encode('utf8')) if tmp_hash.hexdigest().upper() in allowed_user_list: self.allowed_id = True self.login_status = True self.login_config.set_headers(package.json()['pageId']) return {'result': True, 'message': '登入成功!'} else: return package.json() else: # print(config.msg_server_begin+'非學生作業時段!學生無法登入!') self.login_session.close() return {'result': False, 'message': '非學生作業時段!學生無法登入!'}
from aiogram import Dispatcher, Bot, types, dispatcher import requests import config, models from urllib.parse import urljoin import os from aiogram.utils.executor import start_webhook bot_token = config.get_token() url = config.get_url() WEBHOOK_HOST = f'https://catcatcat-bot.herokuapp.com/' # Enter here your link from Heroku project settings WEBHOOK_URL_PATH = '/webhook/' + bot_token WEBHOOK_URL = urljoin(WEBHOOK_HOST, WEBHOOK_URL_PATH) cats_url = 'https://api.thecatapi.com/v1/images/search' vote_url = 'https://api.thecatapi.com/v1/votes/?api_key=9c384300-7b15-449e-991a-205654945bce/' bot = Bot(bot_token) dp = Dispatcher(bot) @dp.message_handler( dispatcher.filters.builtin.Text(equals='Помощь') ) @dp.message_handler(commands=['start', 'help']) async def start(message): """ Sends a help message """ chat_id = message.chat.id user = models.get_user(chat_id)
def main(): j = 0 even = False change = False date_li = [] days_li = [] class_li = [] change_li = [] send_li = [] day = datetime.datetime.today() + datetime.timedelta(1) today = day.strftime('%-m月%-d日') res = req.urlopen(config.get_url()) soup = BeautifulSoup(res, 'html.parser') changes = soup.select('table:nth-of-type(10) > tr[height="35"] > td') for li in changes: if even is False: cut = li.string date_li.append(cut.lstrip()) even = True elif even is True: cut = li.string change_li.append(cut.lstrip()) even = False for x in date_li: days_li.append(re.findall( '(\d{1,2}月\d{1,2}日)\(([月火水木金])\) ([12345678])', x )) for x in change_li: class_li.append(re.findall('.+ → (.+)', x)) # today = '10月3日' # days_li.append([('10月3日', '火', '8')]) # print(days_li) # class_li.append(['ぎゃぎゃ']) # print(class_li) for x in days_li: time = x[0] if x[0][0] == today: change = True if '月' == time[1]: config.mon.change_class( int(zen_to_han(time[2])), class_li[j][0] ) send_li = config.mon.classes elif '火' == time[1]: config.tue.change_class( int(zen_to_han(time[2])), class_li[j][0] ) send_li = config.tue.classes elif '水' == time[1]: config.wed.change_class( int(zen_to_han(time[2])), class_li[j][0] ) send_li = config.wed.classes elif '木' == time[1]: config.thu.change_class( int(zen_to_han(time[2])), class_li[j][0] ) send_li = config.thu.classes elif '金' == time[1]: config.fri.change_class( int(zen_to_han(time[2])), class_li[j][0] ) send_li = config.fri.classes # print(send_li) else: # print('Not match.') if '月' == time[1]: send_li = config.mon.classes elif '火' == time[1]: send_li = config.tue.classes elif '水' == time[1]: send_li = config.wed.classes elif '木' == time[1]: send_li = config.thu.classes elif '金' == time[1]: send_li = config.fri.classes j += 1 message = sender.text_gen( send_li, change, today, config.get_url()[-2:] ) # print(message) sender.sender(message)