Exemple #1
0
    def get_friendlist_leaderbord(self, unit=None):
        """
        Get user's rank in the week in descending order, stream from
        ``https://www.duolingo.com/friendships/leaderboard_activity?unit=week

        :param unit: maybe week or month
        :type unit: str
        :rtype: List
        """
        if unit:
            url = 'https://www.duolingo.com/friendships/leaderboard_activity?unit={}'
        else:
            raise Exception('Needs unit as argument (week or month)')

        leader_data = DuoRequest.do_request(url, self.session).json()
        data = []
        for result in self.get_friends():
            for value in leader_data['ranking']:
                if result['id'] == int(value):
                    temp = {
                        'points': int(leader_data['ranking'][value]),
                        'unit': unit,
                        'id': result['id'],
                        'username': result['username']
                    }
                    data.append(temp)

        return sorted(data, key=lambda user: user['points'], reverse=True)
Exemple #2
0
    def _homepage(self):
        if self._homepage_text:
            return self._homepage_text
        homepage_url = "https://www.duolingo.com"

        request = DuoRequest.do_request(homepage_url, self._user_session)
        self._homepage_text = request.text
        return self._homepage
Exemple #3
0
    def fetch(session, data):
        """ Set Debug to false to get real server data """
        if not __DEBUG__:
            learnRequest = DuoRequest.do_request(learn_session_data_url,
                                                 session, data)
            print(learnRequest)
            jsonResponseData = learnRequest.json()
        else:
            jsonResponseData = __sampleData__

        return DuolingoLearnSession(session, jsonResponseData)
Exemple #4
0
    def _switch_working_language(self, lang):
        """
        Change the learned language (the "working language") with
        ``https://www.duolingo.com/switch_language``.

        :param lang: Wanted language abbreviation (example: ``'fr'``)
        :type lang: str
        """
        data = {"learning_language": lang}
        url = "https://www.duolingo.com/switch_language"
        request = DuoRequest.do_request(url, self.session, data)

        try:
            parse = request.json()['tracking_properties']
            if parse['learning_language'] == lang:
                self._refresh_user_data()
        except:
            raise Exception('Failed to switch language')
Exemple #5
0
    def _initialize(self, username: str, password: str):
        """
        Authenticate through ``https://www.duolingo.com/login``.
        """
        """ Deferred import to avoid circular dependency """
        from duorequest import DuoRequest

        login_url = "https://www.duolingo.com/login"
        data = {"login": username, "password": password}
        response = DuoRequest.do_request(login_url, self, data)

        attempt = response.json()

        if attempt.get('response') == 'OK':
            self.jwt = response.headers['jwt']
            self.username = attempt.get("username")
            self.user_id = attempt.get("user_id")
            return self

        raise Exception("Login failed: " + attempt.get("failure"))
Exemple #6
0
    def _populate_voice_url_dictionary(self, lang_abbr):
        if self.voice_url_dict is None:
            self.voice_url_dict = {}
        self.voice_url_dict[lang_abbr] = {}
        # Get skill IDs
        skill_ids = []
        for skill in self._lang_data[lang_abbr]['skills']:
            skill_ids.append(skill['id'])
        # Scrape all sessions and create voice url dictionary
        for skill_id in skill_ids:
            req_data = {
                "fromLanguage": "en" if lang_abbr != "en" else "de",
                "learningLanguage": lang_abbr,
                "challengeTypes": ["definition", "translate"],
                "skillId": skill_id,
                "type": "SKILL_PRACTICE",
                "juicy": True,
                "smartTipsVersion": 2
            }

            resp = DuoRequest.do_request(
                "https://www.duolingo.com/2017-06-30/sessions",
                self._user_session, req_data)
            if resp.status_code != 200:
                continue

            resp_data = resp.json()
            for challenge in resp_data['challenges']:
                self._add_to_voice_url_dict(lang_abbr, challenge['prompt'],
                                            challenge['tts'])
                if challenge.get("metadata") and challenge['metadata'].get(
                        "non_character_tts"):
                    for word, url in challenge['metadata'][
                            'non_character_tts']['tokens'].items():
                        self._add_to_voice_url_dict(lang_abbr, word, url)
                for token in challenge['tokens']:
                    if token.get("tts") and token.get("value"):
                        self._add_to_voice_url_dict(lang_abbr, token['value'],
                                                    token['tts'])
Exemple #7
0
    def _refresh_user_data(self):

        user_url = "https://duolingo.com/users/%s" % self.username
        response = DuoRequest.do_request(user_url, self.session)

        self._user_data = Struct(**response.json())
Exemple #8
0
 def end_session(self, data):
     request = DuoRequest.do_request(
         learn_session_data_url + "/" + self.get_sessionid(), self.session,
         data, "PUT")
     return request