diff --git a/instaloader/instaloadercontext.py b/instaloader/instaloadercontext.py index dce9e13..486cac6 100644 --- a/instaloader/instaloadercontext.py +++ b/instaloader/instaloadercontext.py @@ -279,7 +279,7 @@ class InstaloaderContext: def _graphql_request_count_per_sliding_window(self, query_hash: str) -> int: """Return how many GraphQL requests can be done within the sliding window.""" if self.is_logged_in: - max_reqs = {'1cb6ec562846122743b61e492c85999f': 20, '33ba35852cb50da46f5b5e889df7d159': 20} + max_reqs = {'1cb6ec562846122743b61e492c85999f': 20, '33ba35852cb50da46f5b5e889df7d159': 20, 'iphone': 100} else: max_reqs = {'1cb6ec562846122743b61e492c85999f': 200, '33ba35852cb50da46f5b5e889df7d159': 200} return max_reqs.get(query_hash) or min(max_reqs.values()) @@ -346,11 +346,14 @@ class InstaloaderContext: :raises ConnectionException: When query repeatedly failed. """ is_graphql_query = 'query_hash' in params and 'graphql/query' in path + is_iphone_query = host == 'i.instagram.com' sess = session if session else self._session try: self.do_sleep() if is_graphql_query: self._ratecontrol_graphql_query(params['query_hash']) + if is_iphone_query: + self._ratecontrol_graphql_query('iphone') resp = sess.get('https://{0}/{1}'.format(host, path), params=params, allow_redirects=False) while resp.is_redirect: redirect_url = resp.headers['location'] @@ -389,8 +392,10 @@ class InstaloaderContext: raise ConnectionException(error_string) from err self.error(error_string + " [retrying; skip with ^C]", repeat_at_end=False) try: - if isinstance(err, TooManyRequestsException): + if is_graphql_query and isinstance(err, TooManyRequestsException): self._ratecontrol_graphql_query(params['query_hash'], untracked_queries=True) + if is_iphone_query and isinstance(err, TooManyRequestsException): + self._ratecontrol_graphql_query('iphone', untracked_queries=True) return self.get_json(path=path, params=params, host=host, session=sess, _attempt=_attempt + 1) except KeyboardInterrupt: self.error("[skipped by user]", repeat_at_end=False)