mirror of
https://github.com/instaloader/instaloader.git
synced 2024-09-11 16:22:24 +02:00
Enhance behavior of waiting between requests
Unless --no-sleep is given, Instaloader waits between requests to the Instagram servers. This commit fixes and enhances this behavior. Now, --no-sleep is always obeyed. Between requests to the instagram.com servers, there is now a delay of 250 ms ~ 2000 ms. Requests to the file servers do not cause a delay.
This commit is contained in:
parent
bf5e3b90d0
commit
151ccfd71d
@ -148,17 +148,21 @@ class Instaloader:
|
|||||||
if not self.quiet:
|
if not self.quiet:
|
||||||
print(*msg, sep=sep, end=end, flush=flush)
|
print(*msg, sep=sep, end=end, flush=flush)
|
||||||
|
|
||||||
|
def _sleep(self):
|
||||||
|
"""Sleep a short, random time if self.sleep is set. Called before each request to the instagram.com."""
|
||||||
|
if self.sleep:
|
||||||
|
time.sleep(random.uniform(0.25, 2.0))
|
||||||
|
|
||||||
def get_json(self, name: str, session: requests.Session = None,
|
def get_json(self, name: str, session: requests.Session = None,
|
||||||
max_id: Optional[str] = None) -> Optional[Dict[str, Any]]:
|
max_id: Optional[str] = None) -> Optional[Dict[str, Any]]:
|
||||||
"""Return JSON of a profile"""
|
"""Return JSON of a profile"""
|
||||||
if session is None:
|
if session is None:
|
||||||
session = self.session
|
session = self.session
|
||||||
|
self._sleep()
|
||||||
if not max_id:
|
if not max_id:
|
||||||
resp = session.get('https://www.instagram.com/' + name)
|
resp = session.get('https://www.instagram.com/' + name)
|
||||||
else:
|
else:
|
||||||
resp = session.get('https://www.instagram.com/' + name, params={'max_id': max_id})
|
resp = session.get('https://www.instagram.com/' + name, params={'max_id': max_id})
|
||||||
if self.sleep:
|
|
||||||
time.sleep(4 * random.random() + 1)
|
|
||||||
match = re.search('window\\._sharedData = .*<', resp.text)
|
match = re.search('window\\._sharedData = .*<', resp.text)
|
||||||
if match is not None:
|
if match is not None:
|
||||||
return json.loads(match.group(0)[21:-2])
|
return json.loads(match.group(0)[21:-2])
|
||||||
@ -211,6 +215,7 @@ class Instaloader:
|
|||||||
tmpsession.headers['accept'] = '*/*'
|
tmpsession.headers['accept'] = '*/*'
|
||||||
if referer is not None:
|
if referer is not None:
|
||||||
tmpsession.headers['referer'] = referer
|
tmpsession.headers['referer'] = referer
|
||||||
|
self._sleep()
|
||||||
response = tmpsession.get('https://www.instagram.com/graphql/query',
|
response = tmpsession.get('https://www.instagram.com/graphql/query',
|
||||||
params={'query_id': query_id,
|
params={'query_id': query_id,
|
||||||
'variables': json.dumps(variables, separators=(',', ':'))})
|
'variables': json.dumps(variables, separators=(',', ':'))})
|
||||||
@ -485,7 +490,6 @@ class Instaloader:
|
|||||||
data = self.get_json(str(), session=session)
|
data = self.get_json(str(), session=session)
|
||||||
if data['config']['viewer'] is None:
|
if data['config']['viewer'] is None:
|
||||||
return
|
return
|
||||||
time.sleep(4 * random.random() + 1)
|
|
||||||
return data['config']['viewer']['username']
|
return data['config']['viewer']['username']
|
||||||
|
|
||||||
def login(self, user: str, passwd: str) -> None:
|
def login(self, user: str, passwd: str) -> None:
|
||||||
@ -495,13 +499,13 @@ class Instaloader:
|
|||||||
'ig_vw': '1920', 'csrftoken': '',
|
'ig_vw': '1920', 'csrftoken': '',
|
||||||
's_network': '', 'ds_user_id': ''})
|
's_network': '', 'ds_user_id': ''})
|
||||||
session.headers.update(self.default_http_header())
|
session.headers.update(self.default_http_header())
|
||||||
|
self._sleep()
|
||||||
resp = session.get('https://www.instagram.com/')
|
resp = session.get('https://www.instagram.com/')
|
||||||
session.headers.update({'X-CSRFToken': resp.cookies['csrftoken']})
|
session.headers.update({'X-CSRFToken': resp.cookies['csrftoken']})
|
||||||
time.sleep(9 * random.random() + 3)
|
self._sleep()
|
||||||
login = session.post('https://www.instagram.com/accounts/login/ajax/',
|
login = session.post('https://www.instagram.com/accounts/login/ajax/',
|
||||||
data={'password': passwd, 'username': user}, allow_redirects=True)
|
data={'password': passwd, 'username': user}, allow_redirects=True)
|
||||||
session.headers.update({'X-CSRFToken': login.cookies['csrftoken']})
|
session.headers.update({'X-CSRFToken': login.cookies['csrftoken']})
|
||||||
time.sleep(5 * random.random())
|
|
||||||
if login.status_code == 200:
|
if login.status_code == 200:
|
||||||
if user == self.test_login(session):
|
if user == self.test_login(session):
|
||||||
self.username = user
|
self.username = user
|
||||||
@ -574,6 +578,7 @@ class Instaloader:
|
|||||||
os.makedirs(dirname, exist_ok=True)
|
os.makedirs(dirname, exist_ok=True)
|
||||||
if '__typename' in node:
|
if '__typename' in node:
|
||||||
if node['__typename'] == 'GraphSidecar':
|
if node['__typename'] == 'GraphSidecar':
|
||||||
|
self._sleep()
|
||||||
sidecar_data = self.session.get('https://www.instagram.com/p/' + shortcode + '/',
|
sidecar_data = self.session.get('https://www.instagram.com/p/' + shortcode + '/',
|
||||||
params={'__a': 1}).json()
|
params={'__a': 1}).json()
|
||||||
edge_number = 1
|
edge_number = 1
|
||||||
@ -587,23 +592,17 @@ class Instaloader:
|
|||||||
filename_suffix=str(edge_number))
|
filename_suffix=str(edge_number))
|
||||||
downloaded = downloaded and edge_downloaded
|
downloaded = downloaded and edge_downloaded
|
||||||
edge_number += 1
|
edge_number += 1
|
||||||
if self.sleep:
|
|
||||||
time.sleep(1.75 * random.random() + 0.25)
|
|
||||||
elif node['__typename'] in ['GraphImage', 'GraphVideo']:
|
elif node['__typename'] in ['GraphImage', 'GraphVideo']:
|
||||||
url = node["display_url"] if "display_url" in node else node["display_src"]
|
url = node["display_url"] if "display_url" in node else node["display_src"]
|
||||||
downloaded = self.download_pic(filename=filename,
|
downloaded = self.download_pic(filename=filename,
|
||||||
url=url,
|
url=url,
|
||||||
date_epoch=date)
|
date_epoch=date)
|
||||||
if self.sleep:
|
|
||||||
time.sleep(1.75 * random.random() + 0.25)
|
|
||||||
else:
|
else:
|
||||||
self._log("Warning: Unknown typename discovered:" + node['__typename'])
|
self._log("Warning: Unknown typename discovered:" + node['__typename'])
|
||||||
downloaded = False
|
downloaded = False
|
||||||
else:
|
else:
|
||||||
# Node is an old image or video.
|
# Node is an old image or video.
|
||||||
downloaded = self.download_pic(filename=filename, url=node["display_src"], date_epoch=date)
|
downloaded = self.download_pic(filename=filename, url=node["display_src"], date_epoch=date)
|
||||||
if self.sleep:
|
|
||||||
time.sleep(1.75 * random.random() + 0.25)
|
|
||||||
if "edge_media_to_caption" in node and node["edge_media_to_caption"]["edges"]:
|
if "edge_media_to_caption" in node and node["edge_media_to_caption"]["edges"]:
|
||||||
self.save_caption(filename, date, node["edge_media_to_caption"]["edges"][0]["node"]["text"])
|
self.save_caption(filename, date, node["edge_media_to_caption"]["edges"][0]["node"]["text"])
|
||||||
elif "caption" in node:
|
elif "caption" in node:
|
||||||
@ -787,8 +786,6 @@ class Instaloader:
|
|||||||
data = self.get_json(name)
|
data = self.get_json(name)
|
||||||
# Download profile picture
|
# Download profile picture
|
||||||
self.download_profilepic(name, data["entry_data"]["ProfilePage"][0]["user"]["profile_pic_url"])
|
self.download_profilepic(name, data["entry_data"]["ProfilePage"][0]["user"]["profile_pic_url"])
|
||||||
if self.sleep:
|
|
||||||
time.sleep(1.75 * random.random() + 0.25)
|
|
||||||
if profile_pic_only:
|
if profile_pic_only:
|
||||||
return
|
return
|
||||||
# Catch some errors
|
# Catch some errors
|
||||||
|
Loading…
Reference in New Issue
Block a user