def login_with_github(self, get_credentials, session=None): session = session or utils.new_default_session() url = "https://yukicoder.me/auth/github" # get resp = utils.request("GET", url, session=session) if urllib.parse.urlparse(resp.url).hostname == "yukicoder.me": log.info("You have already signed in.") return True # redirect to github.com # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find("form") if not form: log.error("form not found") log.info("Did you logged in?") return False log.debug("form: %s", str(form)) # post username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set("login", username) form.set("password", password) resp = form.request(session) resp.raise_for_status() if urllib.parse.urlparse(resp.url).hostname == "yukicoder.me": log.success("You signed in.") return True else: log.failure("You failed to sign in. Wrong user ID or password.") return False
def login(self, get_credentials, session=None): session = session or utils.new_default_session() url = "http://codeforces.com/enter" # get resp = utils.request("GET", url, session=session) if resp.url != url: # redirected log.info("You have already signed in.") return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find("form", id="enterForm") log.debug("form: %s", str(form)) username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set("handleOrEmail", username) form.set("password", password) form.set("remember", "on") # post resp = form.request(session) resp.raise_for_status() if resp.url != url: # redirected log.success("Welcome, %s.", username) return True else: log.failure("Invalid handle or password.") return False
def login(self, get_credentials: onlinejudge.service.CredentialsProvider, session: Optional[requests.Session] = None) -> bool: session = session or utils.new_default_session() url = 'https://codeforces.com/enter' # get resp = utils.request('GET', url, session=session) if resp.url != url: # redirected log.info('You have already signed in.') return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', id='enterForm') log.debug('form: %s', str(form)) username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set('handleOrEmail', username) form.set('password', password) form.set('remember', 'on') # post resp = form.request(session) resp.raise_for_status() if resp.url != url: # redirected log.success('Welcome, %s.', username) return True else: log.failure('Invalid handle or password.') return False
def login_with_github( self, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> bool: session = session or utils.new_default_session() url = 'https://yukicoder.me/auth/github' # get resp = utils.request('GET', url, session=session) if urllib.parse.urlparse(resp.url).hostname == 'yukicoder.me': log.info('You have already signed in.') return True # redirect to github.com # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form') if not form: log.error('form not found') log.info('Did you logged in?') return False log.debug('form: %s', str(form)) # post username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set('login', username) form.set('password', password) resp = form.request(session) resp.raise_for_status() if urllib.parse.urlparse(resp.url).hostname == 'yukicoder.me': log.success('You signed in.') return True else: log.failure('You failed to sign in. Wrong user ID or password.') return False
def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> bool: session = session or utils.new_default_session() url = 'https://www.hackerrank.com/auth/login' # get resp = utils.request('GET', url, session=session) if resp.url != url: log.debug('redirected: %s', resp.url) log.info('You have already signed in.') return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) csrftoken = soup.find('meta', attrs={'name': 'csrf-token'}).attrs['content'] tag = soup.find('input', attrs={'name': 'username'}) while tag.name != 'form': tag = tag.parent form = tag # post username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set('login', username) form.set('password', password) form.set('remember_me', 'true') form.set('fallback', 'true') resp = form.request(session, method='POST', action='/rest/auth/login', headers={'X-CSRF-Token': csrftoken}) resp.raise_for_status() log.debug('redirected: %s', resp.url) # result if '/auth' not in resp.url: log.success('You signed in.') return True else: log.failure('You failed to sign in. Wrong user ID or password.') return False
def submit_code(self, code: bytes, language: str, session: Optional['requests.Session'] = None) -> onlinejudge.type.Submission: # or SubmissionError session = session or utils.new_default_session() # get resp = utils.request('GET', self.get_url(), session=session) # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', class_='submitForm') if form is None: log.error('not logged in') raise SubmissionError log.debug('form: %s', str(form)) # make data form = utils.FormSender(form, url=resp.url) form.set('programTypeId', language) form.set_file('sourceFile', 'code', code) resp = form.request(session=session) resp.raise_for_status() # result if resp.url.endswith('/my'): # example: https://codeforces.com/contest/598/my log.success('success: result: %s', resp.url) return onlinejudge.type.DummySubmission(resp.url) else: log.failure('failure') log.debug('redirected to %s', resp.url) # parse error messages soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) for span in soup.findAll('span', class_='error'): log.warning('Codeforces says: "%s"', span.string) raise SubmissionError
def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> bool: session = session or utils.new_default_session() url = 'https://toph.co/login' # get resp = utils.request('GET', url, session=session) if resp.url != url: # redirected log.info('You are already logged in.') return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', class_='login-form') log.debug('form: %s', str(form)) username, password = get_credentials() form[ 'action'] = '/login' # to avoid KeyError inside form.request method as Toph does not have any defined action form = utils.FormSender(form, url=resp.url) form.set('handle', username) form.set('password', password) # post resp = form.request(session) resp.raise_for_status() resp = utils.request( 'GET', url, session=session ) # Toph's Location header is not getting the expected value if resp.url != url: log.success('Welcome, %s.', username) return True else: log.failure('Invalid handle/email or password.') return False
def submit(self, code, language, session=None): assert language in self.get_language_dict(session=session) session = session or requests.Session() url = self.get_url() + '/submit' # get log.status('GET: %s', url) resp = session.get(url) log.status(utils.describe_status_code(resp.status_code)) resp.raise_for_status() # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', action=re.compile(r'/submit$')) if not form: log.error('form not found') return None log.debug('form: %s', str(form)) # post form = utils.FormSender(form, url=resp.url) if False: form.set('source', code) else: form.set_file('file', ('source', code)) form.set('lang', language) resp = form.request(session=session) resp.raise_for_status() # result if '/submissions/' in resp.url: log.success('success: result: %s', resp.url) return resp.url else: log.failure('failure') return None
def login(self, get_credentials, session=None): session = session or requests.Session() url = 'http://codeforces.com/enter' # get log.status('GET: %s', url) resp = session.get(url) log.status(utils.describe_status_code(resp.status_code)) resp.raise_for_status() if resp.url != url: # redirected log.info('You have already signed in.') return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', id='enterForm') log.debug('form: %s', str(form)) username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set('handle', username) form.set('password', password) form.set('remember', 'on') # post resp = form.request(session) resp.raise_for_status() if resp.url != url: # redirected log.success('Welcome, %s.', username) return True else: log.failure('Invalid handle or password.') return False
def submit_code( self, code: bytes, language: str, session: Optional[requests.Session] = None ) -> onlinejudge.type.DummySubmission: assert language in self.get_language_dict(session=session) session = session or utils.new_default_session() # get url = 'http://{}.contest.atcoder.jp/submit'.format( self.contest_id) # TODO: use beta.atcoder.jp resp = _request('GET', url, session=session) msgs = AtCoderService._get_messages_from_cookie(resp.cookies) if AtCoderService._report_messages(msgs, unexpected=True): raise SubmissionError # check whether logged in path = utils.normpath(urllib.parse.urlparse(resp.url).path) if path.startswith('/login'): log.error('not logged in') raise SubmissionError # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', action=re.compile(r'^/submit\?task_id=')) if not form: log.error('form not found') raise SubmissionError log.debug('form: %s', str(form)) # post task_id = self._get_task_id(session=session) form = utils.FormSender(form, url=resp.url) form.set('task_id', str(task_id)) form.set('source_code', code) form.set('language_id_{}'.format(task_id), language) resp = form.request(session=session) resp.raise_for_status() # result msgs = AtCoderService._get_messages_from_cookie(resp.cookies) AtCoderService._report_messages(msgs) if '/submissions/me' in resp.url: # example: https://practice.contest.atcoder.jp/submissions/me#32174 # CAUTION: this URL is not a URL of the submission log.success('success: result: %s', resp.url) # NOTE: ignore the returned legacy URL and use beta.atcoder.jp's one url = 'https://beta.atcoder.jp/contests/{}/submissions/me'.format( self.contest_id) return onlinejudge.type.DummySubmission(url) else: log.failure('failure') log.debug('redirected to %s', resp.url) raise SubmissionError
def submit(self, code, language, session=None): assert language in self.get_language_dict(session=session) session = session or utils.new_default_session() # get url = "http://{}.contest.atcoder.jp/submit".format( self.contest_id) # TODO: use beta.atcoder.jp resp = utils.request("GET", url, session=session) msgs = AtCoderService._get_messages_from_cookie(resp.cookies) if AtCoderService._report_messages(msgs, unexpected=True): return None # check whether logged in path = utils.normpath(urllib.parse.urlparse(resp.url).path) if path.startswith("/login"): log.error("not logged in") return None # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find("form", action=re.compile(r"^/submit\?task_id=")) if not form: log.error("form not found") return None log.debug("form: %s", str(form)) # post task_id = self._get_task_id(session=session) form = utils.FormSender(form, url=resp.url) form.set("task_id", str(task_id)) form.set("source_code", code) form.set("language_id_{}".format(task_id), language) resp = form.request(session=session) resp.raise_for_status() # result msgs = AtCoderService._get_messages_from_cookie(resp.cookies) AtCoderService._report_messages(msgs) if "/submissions/me" in resp.url: # example: https://practice.contest.atcoder.jp/submissions/me#32174 # CAUTION: this URL is not a URL of the submission log.success("success: result: %s", resp.url) # NOTE: ignore the returned legacy URL and use beta.atcoder.jp's one url = "https://beta.atcoder.jp/contests/{}/submissions/me".format( self.contest_id) return onlinejudge.submission.CompatibilitySubmission(url) else: log.failure("failure") return None
def login(self, get_credentials: onlinejudge.service.CredentialsProvider, session: Optional[requests.Session] = None) -> bool: session = session or utils.new_default_session() url = 'https://www.hackerrank.com/login' # get resp = utils.request('GET', url, session=session) if resp.url != url: log.info('You have already signed in.') return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', id='legacy-login') if not form: log.error('form not found') return False csrftoken = soup.find('meta', attrs={ 'name': 'csrf-token' }).attrs['content'] # post username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set('login', username) form.set('password', password) form.set('remember_me', 'true') form.set('fallback', 'true') resp = form.request(session, action='/auth/login', headers={'X-CSRF-Token': csrftoken}) resp.raise_for_status() # result if resp.url != url: log.success('You signed in.') return True else: log.failure('You failed to sign in. Wrong user ID or password.') return False
def submit(self, code, language, session=None): assert language in self.get_language_dict(session=session) session = session or requests.Session() url = 'http://{}.contest.atcoder.jp/submit'.format(self.contest_id) # get log.status('GET: %s', url) resp = session.get(url) log.status(utils.describe_status_code(resp.status_code)) resp.raise_for_status() msgs = AtCoderService._get_messages_from_cookie(resp.cookies) if AtCoderService._report_messages(msgs, unexpected=True): return None # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', action=re.compile(r'^/submit\?task_id=')) if not form: log.error('form not found') return None log.debug('form: %s', str(form)) # post task_id = self._get_task_id(session=session) form = utils.FormSender(form, url=resp.url) form.set('task_id', str(task_id)) form.set('source_code', code) form.set('language_id_{}'.format(task_id), language) resp = form.request(session=session) resp.raise_for_status() # result msgs = AtCoderService._get_messages_from_cookie(resp.cookies) AtCoderService._report_messages(msgs) if '/submissions/me' in resp.url: log.success('success: result: %s', resp.url) return resp.url else: log.failure('failure') return None
def submit_code( self, code: bytes, language: str, session: Optional[requests.Session] = None ) -> onlinejudge.type.Submission: # or SubmissionError session = session or utils.new_default_session() # get url = self.get_url() + '/submit' resp = utils.request('GET', url, session=session) # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form', id='submit_form') if not form: log.error('form not found') raise onlinejudge.type.SubmissionError # post form = utils.FormSender(form, url=resp.url) form.set('lang', language) form.set_file('file', 'code', code) form.unset('custom_test') resp = form.request(session=session) resp.raise_for_status() # result if 'submissions' in resp.url: # example: https://yukicoder.me/submissions/314087 log.success('success: result: %s', resp.url) return onlinejudge.type.DummySubmission(resp.url) else: log.failure('failure') log.debug('redirected to %s', resp.url) soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) for div in soup.findAll('div', attrs={'role': 'alert'}): log.warning('yukicoder says: "%s"', div.string) raise onlinejudge.type.SubmissionError
def submit_code( self, code: bytes, language: str, session: Optional['requests.Session'] = None ) -> onlinejudge.type.Submission: # or SubmissionError session = session or utils.new_default_session() # get resp = utils.request('GET', self.get_url(), session=session) # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find('form') if form is None: log.error('not logged in') raise SubmissionError log.debug('form: %s', str(form)) if form.find('select' ) and form.find('select').attrs['name'] != 'languageId': log.error("Wrong submission URL") raise SubmissionError # make data form = utils.FormSender(form, url=resp.url) form.set('languageId', language) form.set_file('source', 'code', code) resp = form.request(session=session) resp.raise_for_status() # result if '/s/' in resp.url: # example: https://toph.co/s/201410 log.success('success: result: %s', resp.url) return onlinejudge.type.DummySubmission(resp.url) else: log.failure('failure') log.debug('redirected to %s', resp.url) raise SubmissionError
def login(self, get_credentials, session=None): session = session or utils.new_default_session() url = "https://www.hackerrank.com/login" # get resp = utils.request("GET", url, session=session) if resp.url != url: log.info("You have already signed in.") return True # parse soup = bs4.BeautifulSoup(resp.content.decode(resp.encoding), utils.html_parser) form = soup.find("form", id="legacy-login") if not form: log.error("form not found") return False csrftoken = soup.find("meta", attrs={ "name": "csrf-token" }).attrs["content"] # post username, password = get_credentials() form = utils.FormSender(form, url=resp.url) form.set("login", username) form.set("password", password) form.set("remember_me", "true") form.set("fallback", "true") resp = form.request(session, action="/auth/login", headers={"X-CSRF-Token": csrftoken}) resp.raise_for_status() # result if resp.url != url: log.success("You signed in.") return True else: log.failure("You failed to sign in. Wrong user ID or password.") return False