Exemple #1
0
 def test_service_from_url(self):
     service1 = dispatch.service_from_url('https://codeforces.com/')
     self.assertEqual(service1.get_name(), 'Codeforces')
     self.assertTrue(
         isinstance(service1, service.codeforces.CodeforcesService))
     self.assertEqual(service1.get_url_of_login_page(),
                      'https://codeforces.com/enter')
Exemple #2
0
 def handleCookieAdded(self, cookie: QNetworkCookie):
     url = self.browser.url().toString()
     if service_from_url(url):
         py_cookie = toPyCookie(cookie)
         with with_cookiejar(new_session_with_our_user_agent(),
                             path=default_cookie_path) as sess:
             sess.cookies.set_cookie(py_cookie)
 def test_service_from_url(self):
     service1 = dispatch.service_from_url('https://atcoder.jp/')
     self.assertIsInstance(service1, service.atcoder.AtCoderService)
     self.assertEqual(service1.get_name(), 'AtCoder')
     self.assertEqual(service1.get_url_of_login_page(),
                      'https://atcoder.jp/login')
     self.assertEqual(service1.get_user_history_url(22),
                      'https://atcoder.jp/users/22/history/json')
def is_logged_in(url: str, *, memo={}) -> bool:
    # functools.lru_cache is unusable since Service are unhashable, so we need to use `memo={}`.
    service = dispatch.service_from_url(url)
    assert service is not None
    url = service.get_url()  # normalize url
    if url not in memo:
        # We need to use main instead of `service.is_logged_in()` to use cookies.
        result = main(['login-service', '--check', url], debug=True)
        memo[url] = bool((result.get('result') or {}).get('loggedIn'))
    return memo[url]
Exemple #5
0
def login(args: 'argparse.Namespace') -> None:
    service = dispatch.service_from_url(args.url)
    if service is None:
        sys.exit(1)

    with utils.new_session_with_our_user_agent(path=args.cookie) as session:

        if is_logged_in_with_message(service, session=session):
            return
        else:
            if args.check:
                sys.exit(1)

        if args.use_browser in ('always', 'auto'):
            try:
                login_with_browser(service, session=session)
            except ImportError:
                logger.error(
                    'Selenium is not installed. Please run $ pip3 install selenium'
                )
            except WebDriverException as e:
                logger.debug(e)
            else:
                if is_logged_in_with_message(service, session=session):
                    return
                else:
                    sys.exit(1)

        if args.use_browser in ('never', 'auto'):
            if args.use_browser == 'auto':
                logger.warning(
                    'Switch to use CUI-based login instead of Selenium')
            try:
                login_with_password(service,
                                    username=args.username,
                                    password=args.password,
                                    session=session)
            except NotImplementedError as e:
                logger.exception(e)
            except LoginError as e:
                logger.debug(e)
            except Exception as e:
                logger.exception(e)
            else:
                if is_logged_in_with_message(service, session=session):
                    return
                else:
                    sys.exit(1)

        sys.exit(1)
Exemple #6
0
def main(args: Optional[List[str]] = None,
         *,
         debug: bool = False) -> Dict[str, Any]:
    parser = get_parser()
    parsed = parser.parse_args(args=args)

    if parsed.verbose:
        basicConfig(level=DEBUG)
    else:
        basicConfig(level=INFO)

    # do sleep to prevent impolite scraping
    logger.info('sleep %f sec', parsed.wait)
    time.sleep(parsed.wait)

    # parse the URL
    problem = dispatch.problem_from_url(getattr(parsed, 'url', ''))
    contest = dispatch.contest_from_url(getattr(parsed, 'url', ''))
    service = dispatch.service_from_url(getattr(parsed, 'url', ''))

    # prepare a session
    session = requests.Session()
    session.headers['User-Agent'] = parsed.user_agent

    # set yukicoder's token
    if parsed.yukicoder_token is not None:
        parser.error("don't use --yukicoder-token. use $YUKICODER_TOKEN")
    else:
        parsed.yukicoder_token = os.environ.get('YUKICODER_TOKEN')
        is_yukicoder = isinstance(problem, YukicoderProblem) or isinstance(
            service, YukicoderService)
        if parsed.yukicoder_token and is_yukicoder:
            session.headers['Authorization'] = 'Bearer {}'.format(
                parsed.yukicoder_token)

    # set password to login from the environment variable
    if parsed.subcommand == 'login-service':
        if parsed.password is not None:
            parser.error("don't use --password. use $PASSWORD")
        else:
            parsed.password = os.environ.get('PASSWORD')

    try:
        with utils.with_cookiejar(session, path=parsed.cookie) as session:
            result = None  # type: Optional[Dict[str, Any]]
            schema = {}  # type: Dict[str, Any]

            if parsed.subcommand == 'get-problem':
                if problem is None:
                    raise ValueError("unsupported URL: {}".format(
                        repr(parsed.url)))
                result = get_problem.main(
                    problem,
                    is_system=parsed.system,
                    is_full=parsed.full,
                    is_compatibility=parsed.compatibility,
                    session=session)
                if parsed.compatibility:
                    schema = get_problem.schema_compatibility
                else:
                    schema = get_problem.schema

            elif parsed.subcommand == 'get-contest':
                if contest is None:
                    raise ValueError("unsupported URL: {}".format(
                        repr(parsed.url)))
                result = get_contest.main(contest,
                                          is_full=parsed.full,
                                          session=session)
                schema = get_contest.schema

            elif parsed.subcommand == 'get-service':
                if service is None:
                    raise ValueError("unsupported URL: {}".format(
                        repr(parsed.url)))
                result = get_service.main(
                    service,
                    does_list_contests=parsed.list_contests,
                    session=session)
                schema = get_service.schema

            elif parsed.subcommand == 'login-service':
                if service is None:
                    raise ValueError("unsupported URL: {}".format(
                        repr(parsed.url)))
                result = login_service.main(service,
                                            username=parsed.username,
                                            password=parsed.password,
                                            check_only=parsed.check,
                                            session=session)
                schema = login_service.schema

            elif parsed.subcommand == 'submit-code':
                if problem is None:
                    raise ValueError("unsupported URL: {}".format(
                        repr(parsed.url)))
                result = submit_code.main(problem,
                                          file=parsed.file,
                                          language_id=parsed.language,
                                          session=session)
                schema = submit_code.schema

            elif parsed.subcommand is None:
                parser.print_help()
                result = None

            else:
                assert False

    except:
        etype, evalue, _ = sys.exc_info()
        logger.exception('%s', evalue)
        wrapped = {
            "status":
            "error",
            "messages": [
                *map(lambda line: line.strip(),
                     traceback.format_exception_only(etype, evalue))
            ],
            "result":
            None,
        }  # type: Dict[str, Any]
        if debug:
            return wrapped
        else:
            print(json.dumps(wrapped))
            raise SystemExit(1)

    else:
        if result is None:
            # no subcommand given
            if debug:
                return {
                    "status": "ok",
                    "messages": [],
                    "result": None,
                }
            else:
                raise SystemExit(0)

        wrapped = {
            "status": "ok",
            "messages": [],
            "result": result,
        }
        if not debug:
            print(json.dumps(wrapped))

        try:
            jsonschema.validate(result, schema)
        except jsonschema.exceptions.ValidationError as e:
            logger.debug('%s', e)

        if debug:
            return wrapped
        else:
            raise SystemExit(0)
 def test_service_from_url(self):
     self.assertIsNone(
         dispatch.service_from_url('https://www.yahoo.co.jp/'))
Exemple #8
0
 def test_service_eq(self):
     self.assertEqual(service_from_url('https://atcoder.jp/'), service_from_url('https://atcoder.jp/contests/agc030'))
     self.assertNotEqual(service_from_url('https://atcoder.jp/'), service_from_url('https://codeforces.com/'))