instagrapi 3.2.2__tar.gz → 3.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. {instagrapi-3.2.2 → instagrapi-3.2.3}/PKG-INFO +4 -4
  2. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/password.py +29 -4
  3. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/private.py +3 -0
  4. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi.egg-info/PKG-INFO +4 -4
  5. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi.egg-info/requires.txt +3 -3
  6. {instagrapi-3.2.2 → instagrapi-3.2.3}/pyproject.toml +4 -4
  7. {instagrapi-3.2.2 → instagrapi-3.2.3}/LICENSE +0 -0
  8. {instagrapi-3.2.2 → instagrapi-3.2.3}/README.md +0 -0
  9. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/__init__.py +0 -0
  10. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/config.py +0 -0
  11. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/exceptions.py +0 -0
  12. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/extractors.py +0 -0
  13. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/image_util.py +0 -0
  14. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/__init__.py +0 -0
  15. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/account.py +0 -0
  16. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/album.py +0 -0
  17. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/attestation.py +0 -0
  18. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/auth.py +0 -0
  19. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/bloks.py +0 -0
  20. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/captcha.py +0 -0
  21. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/challenge.py +0 -0
  22. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/clip.py +0 -0
  23. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/collection.py +0 -0
  24. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/comment.py +0 -0
  25. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/crossposting.py +0 -0
  26. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/direct.py +0 -0
  27. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/explore.py +0 -0
  28. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/fbsearch.py +0 -0
  29. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/fundraiser.py +0 -0
  30. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/graphql.py +0 -0
  31. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/hashtag.py +0 -0
  32. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/highlight.py +0 -0
  33. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/igtv.py +0 -0
  34. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/insights.py +0 -0
  35. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/location.py +0 -0
  36. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/media.py +0 -0
  37. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/multiple_accounts.py +0 -0
  38. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/note.py +0 -0
  39. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/notification.py +0 -0
  40. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/photo.py +0 -0
  41. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/public.py +0 -0
  42. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/quicksnap.py +0 -0
  43. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/realtime.py +0 -0
  44. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/share.py +0 -0
  45. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/signup.py +0 -0
  46. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/story.py +0 -0
  47. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/timeline.py +0 -0
  48. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/totp.py +0 -0
  49. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/track.py +0 -0
  50. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/user.py +0 -0
  51. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/mixins/video.py +0 -0
  52. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/LICENSES.txt +0 -0
  53. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/bridge.go +0 -0
  54. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/contracts_test.go +0 -0
  55. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/go.mod +0 -0
  56. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/go.sum +0 -0
  57. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/patches.json +0 -0
  58. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/native/peer_contracts_test.go +0 -0
  59. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/realtime/__init__.py +0 -0
  60. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/realtime/client.py +0 -0
  61. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/realtime/fbns.py +0 -0
  62. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/realtime/mqttot.py +0 -0
  63. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/story.py +0 -0
  64. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/transports.py +0 -0
  65. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/types.py +0 -0
  66. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/__init__.py +0 -0
  67. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/auth.py +0 -0
  68. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/ids.py +0 -0
  69. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/iterators.py +0 -0
  70. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/logging.py +0 -0
  71. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/serialization.py +0 -0
  72. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/timing.py +0 -0
  73. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/upload.py +0 -0
  74. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/validation.py +0 -0
  75. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utils/video.py +0 -0
  76. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utls.py +0 -0
  77. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utls_build.py +0 -0
  78. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/utls_native.py +0 -0
  79. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi/zones.py +0 -0
  80. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi.egg-info/SOURCES.txt +0 -0
  81. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi.egg-info/dependency_links.txt +0 -0
  82. {instagrapi-3.2.2 → instagrapi-3.2.3}/instagrapi.egg-info/top_level.txt +0 -0
  83. {instagrapi-3.2.2 → instagrapi-3.2.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instagrapi
3
- Version: 3.2.2
3
+ Version: 3.2.3
4
4
  Summary: Fast and effective Instagram Private API wrapper
5
5
  Author-email: Mark Subzeroid <143403577+subzeroid@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -46,16 +46,16 @@ Requires-Dist: h2<5,>=4.3; extra == "test"
46
46
  Requires-Dist: mike==2.2.0; extra == "test"
47
47
  Requires-Dist: setuptools==84.2.1; extra == "test"
48
48
  Requires-Dist: markdown-include==0.8.1; extra == "test"
49
- Requires-Dist: mkdocs-material==9.7.7; extra == "test"
49
+ Requires-Dist: mkdocs-material==9.8.0; extra == "test"
50
50
  Requires-Dist: mkdocstrings[python]==1.0.8; extra == "test"
51
51
  Requires-Dist: numpy>=1.25.0; extra == "test"
52
52
  Requires-Dist: pip-audit==2.10.1; extra == "test"
53
53
  Requires-Dist: pre-commit==4.7.0; extra == "test"
54
54
  Requires-Dist: proglog<=1.0.0; extra == "test"
55
55
  Requires-Dist: pytest-xdist==3.8.0; extra == "test"
56
- Requires-Dist: pytest==9.1.1; extra == "test"
56
+ Requires-Dist: pytest==9.2.0; extra == "test"
57
57
  Requires-Dist: python-dotenv>=0.10; extra == "test"
58
- Requires-Dist: ruff==0.17.2; extra == "test"
58
+ Requires-Dist: ruff==0.17.3; extra == "test"
59
59
  Dynamic: license-file
60
60
 
61
61
  # instagrapi
@@ -1,10 +1,13 @@
1
1
  import base64
2
2
  import time
3
3
 
4
+ import requests
4
5
  from Cryptodome.Cipher import AES, PKCS1_v1_5
5
6
  from Cryptodome.PublicKey import RSA
6
7
  from Cryptodome.Random import get_random_bytes
7
8
 
9
+ from instagrapi.exceptions import ClientError
10
+
8
11
 
9
12
  class PasswordMixin:
10
13
  def password_encrypt(self, password):
@@ -36,7 +39,29 @@ class PasswordMixin:
36
39
  return f"#PWD_INSTAGRAM:4:{timestamp}:{payload.decode()}"
37
40
 
38
41
  def password_publickeys(self):
39
- resp = self.public.get("https://i.instagram.com/api/v1/qe/sync/")
40
- publickeyid = int(resp.headers.get("ig-set-password-encryption-key-id"))
41
- publickey = resp.headers.get("ig-set-password-encryption-pub-key")
42
- return publickeyid, publickey
42
+ failure = None
43
+ try:
44
+ # Inspect the first response before retry/challenge handling can replace it.
45
+ self.private_requests_count += 1
46
+ self._send_private_request(
47
+ "launcher/sync/",
48
+ {"id": self.uuid, "server_config_retrieval": "1"},
49
+ login=True,
50
+ headers={"Authorization": self.authorization} if self.authorization else None,
51
+ return_response=True,
52
+ )
53
+ except ClientError as error:
54
+ failure = error
55
+ headers = self.last_response.headers if self.last_response is not None else {}
56
+ publickeyid = headers.get("ig-set-password-encryption-key-id")
57
+ publickey = headers.get("ig-set-password-encryption-pub-key")
58
+ if not publickeyid or not publickey:
59
+ if self.last_response is not None:
60
+ try:
61
+ self.last_response.raise_for_status()
62
+ except requests.HTTPError as error:
63
+ failure = error
64
+ raise ClientError(
65
+ "Instagram did not return the password encryption key", response=self.last_response
66
+ ) from failure
67
+ return int(publickeyid), publickey
@@ -474,6 +474,7 @@ class PrivateRequestMixin:
474
474
  headers=None,
475
475
  extra_sig=None,
476
476
  domain: str = None,
477
+ return_response=False,
477
478
  ):
478
479
  self.last_response = None
479
480
  self.last_json = last_json = {} # for Sentry context in traceback
@@ -533,6 +534,8 @@ class PrivateRequestMixin:
533
534
  self.mid = mid
534
535
  self.request_log(response)
535
536
  self.last_response = response
537
+ if return_response:
538
+ return response
536
539
  response.raise_for_status()
537
540
  # last_json - for Sentry context in traceback
538
541
  self.last_json = last_json = response.json()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instagrapi
3
- Version: 3.2.2
3
+ Version: 3.2.3
4
4
  Summary: Fast and effective Instagram Private API wrapper
5
5
  Author-email: Mark Subzeroid <143403577+subzeroid@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -46,16 +46,16 @@ Requires-Dist: h2<5,>=4.3; extra == "test"
46
46
  Requires-Dist: mike==2.2.0; extra == "test"
47
47
  Requires-Dist: setuptools==84.2.1; extra == "test"
48
48
  Requires-Dist: markdown-include==0.8.1; extra == "test"
49
- Requires-Dist: mkdocs-material==9.7.7; extra == "test"
49
+ Requires-Dist: mkdocs-material==9.8.0; extra == "test"
50
50
  Requires-Dist: mkdocstrings[python]==1.0.8; extra == "test"
51
51
  Requires-Dist: numpy>=1.25.0; extra == "test"
52
52
  Requires-Dist: pip-audit==2.10.1; extra == "test"
53
53
  Requires-Dist: pre-commit==4.7.0; extra == "test"
54
54
  Requires-Dist: proglog<=1.0.0; extra == "test"
55
55
  Requires-Dist: pytest-xdist==3.8.0; extra == "test"
56
- Requires-Dist: pytest==9.1.1; extra == "test"
56
+ Requires-Dist: pytest==9.2.0; extra == "test"
57
57
  Requires-Dist: python-dotenv>=0.10; extra == "test"
58
- Requires-Dist: ruff==0.17.2; extra == "test"
58
+ Requires-Dist: ruff==0.17.3; extra == "test"
59
59
  Dynamic: license-file
60
60
 
61
61
  # instagrapi
@@ -23,16 +23,16 @@ h2<5,>=4.3
23
23
  mike==2.2.0
24
24
  setuptools==84.2.1
25
25
  markdown-include==0.8.1
26
- mkdocs-material==9.7.7
26
+ mkdocs-material==9.8.0
27
27
  mkdocstrings[python]==1.0.8
28
28
  numpy>=1.25.0
29
29
  pip-audit==2.10.1
30
30
  pre-commit==4.7.0
31
31
  proglog<=1.0.0
32
32
  pytest-xdist==3.8.0
33
- pytest==9.1.1
33
+ pytest==9.2.0
34
34
  python-dotenv>=0.10
35
- ruff==0.17.2
35
+ ruff==0.17.3
36
36
 
37
37
  [video]
38
38
  decorator<6.0,>=4.0.2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "instagrapi"
7
- version = "3.2.2"
7
+ version = "3.2.3"
8
8
  authors = [
9
9
  {name = "Mark Subzeroid", email = "143403577+subzeroid@users.noreply.github.com"}
10
10
  ]
@@ -92,7 +92,7 @@ test = [
92
92
  # https://github.com/jimporter/mike/issues/148
93
93
  "setuptools==84.2.1",
94
94
  "markdown-include==0.8.1",
95
- "mkdocs-material==9.7.7",
95
+ "mkdocs-material==9.8.0",
96
96
  # 1.0.7 supports pymdown-extensions 12.2 and requires Python >=3.11.
97
97
  "mkdocstrings[python]==1.0.8",
98
98
  "numpy>=1.25.0",
@@ -100,9 +100,9 @@ test = [
100
100
  "pre-commit==4.7.0",
101
101
  "proglog<=1.0.0",
102
102
  "pytest-xdist==3.8.0",
103
- "pytest==9.1.1",
103
+ "pytest==9.2.0",
104
104
  "python-dotenv>=0.10",
105
- "ruff==0.17.2",
105
+ "ruff==0.17.3",
106
106
  ]
107
107
 
108
108
  [tool.setuptools]
File without changes
File without changes
File without changes