igmapper 1.1.0__tar.gz → 1.2.0__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: igmapper
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Unofficial Instagram API to request available data
5
5
  Author: lucasoal
6
6
  License: MIT
@@ -2,7 +2,8 @@ import json
2
2
  import subprocess
3
3
  import urllib.parse
4
4
 
5
- from .models import FeedData, ProfileData, CommentsData
5
+ import requests
6
+
6
7
  from .session import InstagramSession
7
8
 
8
9
 
@@ -10,6 +11,7 @@ class InstaClient:
10
11
  def __init__(self, csrftoken, ds_user_id, sessionid, proxy=None, use_curl=False):
11
12
  self.state = InstagramSession(csrftoken, ds_user_id, sessionid, proxy=proxy)
12
13
  self.use_curl = use_curl
14
+ self.csrftoken = csrftoken
13
15
 
14
16
  def _execute_request(self, method, url, params=None, data=None, extra_headers=None):
15
17
  headers = {}
@@ -20,7 +22,9 @@ class InstaClient:
20
22
  url = f"{url}?{urllib.parse.urlencode(params)}"
21
23
 
22
24
  if not self.use_curl:
23
- return self.state.request_on_session(method, url, data=data, headers=headers if headers else None)
25
+ return self.state.request_on_session(
26
+ method, url, data=data, headers=headers if headers else None
27
+ )
24
28
 
25
29
  return self._curl_request(method, url, data=data, extra_headers=headers)
26
30
 
@@ -72,72 +76,72 @@ class InstaClient:
72
76
  status = 200 if result.returncode == 0 else 500
73
77
  return MockResponse(result.stdout, status)
74
78
 
75
- def get_profile_info(self, username: str, return_raw: bool = False):
79
+ def get_profile_info(self, username: str, lsd=None, doc_id=None):
80
+ # 1º - FUNCIONA COM TODOS PERFIS, MENOS BUSINESS
76
81
  url = "https://www.instagram.com/api/v1/users/web_profile_info/"
77
82
  res = self._execute_request("GET", url, params={"username": username})
78
83
 
79
84
  if res.status_code == 200:
80
85
  data = res.json()
81
86
  if data.get("status") != "fail" and data.get("data", {}).get("user"):
82
- return data if return_raw else ProfileData.parse_instagram_json(data)
87
+ return data
88
+
89
+ # 2º - USANDO GRAPHQL (caso o 1 dê errado, pode ser perfil business)
90
+ user_id = self.get_feed(username)["user"].get("pk", None)
91
+ url = "https://www.instagram.com/api/graphql"
92
+ headers = {
93
+ "Content-Type": "application/x-www-form-urlencoded",
94
+ "x-csrftoken": self.csrftoken,
95
+ "x-fb-lsd": lsd,
96
+ }
97
+ payload_vars = {
98
+ "enable_integrity_filters": True,
99
+ "id": user_id,
100
+ "__relay_internal__pv__PolarisCASB976ProfileEnabledrelayprovider": False,
101
+ "__relay_internal__pv__PolarisCannesGuardianExperienceEnabledrelayprovider": True,
102
+ "__relay_internal__pv__PolarisLongformEnabledrelayprovider": False,
103
+ "__relay_internal__pv__PolarisRepostsConsumptionEnabledrelayprovider": True,
104
+ "__relay_internal__pv__PolarisShortDramaEnabledrelayprovider": False,
105
+ "__relay_internal__pv__PolarisWebSchoolsEnabledrelayprovider": False,
106
+ }
107
+ payload = urllib.parse.urlencode(
108
+ {"doc_id": doc_id, "lsd": lsd, "variables": json.dumps(payload_vars)}
109
+ )
83
110
 
84
- feed_url = f"https://www.instagram.com/api/v1/feed/user/{username}/username/"
85
- feed_res = self._execute_request("GET", feed_url, params={"count": 1})
111
+ res = requests.post(url, headers=headers, data=payload)
86
112
 
87
- if feed_res.status_code == 200:
88
- feed_data = feed_res.json()
89
- if feed_data.get("user"):
90
- return feed_data if return_raw else ProfileData.parse_instagram_json(feed_data)
113
+ if res.status_code == 200:
114
+ data = res.json()
115
+ if data.get("status") != "fail":
116
+ return data
91
117
 
92
118
  return None
93
119
 
94
- def get_feed(self, username: str, max_id: str = "", return_raw: bool = False):
120
+ def get_feed(self, username: str, max_id: str = ""):
95
121
  url = f"https://www.instagram.com/api/v1/feed/user/{username}/username/"
96
122
  params = {"count": 33, "max_id": max_id}
97
123
 
98
- response = self._execute_request("GET", url, params=params)
99
-
100
- if response.status_code != 200:
101
- return None
124
+ res = self._execute_request("GET", url, params=params)
102
125
 
103
- data = response.json()
104
-
105
- if return_raw:
106
- return data
107
-
108
- items = data.get("items", [])
109
- posts = [FeedData.parse_item(item) for item in items]
126
+ if res.status_code == 200:
127
+ data = res.json()
128
+ if data.get("status") != "fail":
129
+ return data
110
130
 
111
- return FeedData(
112
- posts=posts,
113
- next_max_id=data.get("next_max_id"),
114
- num_results=data.get("num_results", 0),
115
- more_available=data.get("more_available", False),
116
- )
131
+ return None
117
132
 
118
- def get_comments(self, media_id: str, next_min_id: str = None, return_raw: bool = False):
133
+ def get_comments(self, media_id: str, next_min_id: str = None):
119
134
  url = f"https://www.instagram.com/api/v1/media/{media_id}/comments/"
120
135
 
121
136
  params = {"can_support_threading": "true"}
122
137
  if next_min_id:
123
138
  params["min_id"] = next_min_id
124
139
 
125
- response = self._execute_request("GET", url, params=params)
126
-
127
- if response.status_code != 200:
128
- return None
129
-
130
- data = response.json()
131
-
132
- if return_raw:
133
- return data
140
+ res = self._execute_request("GET", url, params=params)
134
141
 
135
- comments_data = data.get("comments", [])
136
- comments = [CommentsData.parse_item(item) for item in comments_data]
142
+ if res.status_code == 200:
143
+ data = res.json()
144
+ if data.get("status") != "fail":
145
+ return data
137
146
 
138
- return CommentsData(
139
- comments=comments,
140
- next_max_id=data.get("next_min_id"),
141
- num_results=len(comments),
142
- more_available=data.get("has_more_comments", False),
143
- )
147
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: igmapper
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Unofficial Instagram API to request available data
5
5
  Author: lucasoal
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "igmapper"
7
- version = "1.1.0"
7
+ version = "1.2.0"
8
8
  description = "Unofficial Instagram API to request available data"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes