Refactor Instagram username resolution to improve username validation and response handling
Browse files
app.py
CHANGED
@@ -62,24 +62,31 @@ def resolve_instagram_username(username: str, logger: Callable[[str, str], None]
|
|
62 |
pattern = r'^(?!.*\.\.)(?!.*\._)(?!.*_\.)(?![\.])[a-zA-Z0-9](?!.*\.$)[a-zA-Z0-9._]{0,28}[a-zA-Z0-9]$'
|
63 |
return re.match(pattern, username) is not None
|
64 |
def resolve() -> bool:
|
65 |
-
restricted_usernames = [
|
|
|
|
|
66 |
if username.lower() in restricted_usernames:
|
67 |
raise Exception(f'"{username}" is not allowed')
|
68 |
if not is_valid_instagram_username(username):
|
69 |
raise Exception(f'"{username}" is not a valid instagram username')
|
70 |
-
response = requests.get("https://www.instagram.com/")
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
x_ig_app_id = get_json_value(response.text, "X-IG-App-ID", "\d+")
|
72 |
user_data_response = requests.get(
|
73 |
url=f"https://www.instagram.com/api/v1/users/web_profile_info/?username={username}",
|
74 |
headers={
|
75 |
"x-ig-app-id": x_ig_app_id,
|
76 |
-
}
|
|
|
77 |
logger("user_data_response:status", user_data_response.status_code)
|
78 |
-
logger("user_data_response:text", user_data_response.text)
|
79 |
-
status = (user_data_response.json() or {}).get('status')
|
80 |
return (
|
81 |
username,
|
82 |
-
user_data_response.
|
83 |
f"https://www.instagram.com/{username}/")
|
84 |
return resolve
|
85 |
|
|
|
62 |
pattern = r'^(?!.*\.\.)(?!.*\._)(?!.*_\.)(?![\.])[a-zA-Z0-9](?!.*\.$)[a-zA-Z0-9._]{0,28}[a-zA-Z0-9]$'
|
63 |
return re.match(pattern, username) is not None
|
64 |
def resolve() -> bool:
|
65 |
+
restricted_usernames = [
|
66 |
+
# "username", "we", "instagram"
|
67 |
+
]
|
68 |
if username.lower() in restricted_usernames:
|
69 |
raise Exception(f'"{username}" is not allowed')
|
70 |
if not is_valid_instagram_username(username):
|
71 |
raise Exception(f'"{username}" is not a valid instagram username')
|
72 |
+
response = requests.get(f"https://www.instagram.com/{username}/", allow_redirects = False)
|
73 |
+
_username = get_json_value(response.text, "username", "\w+") or ""
|
74 |
+
if _username.lower().strip() == username.lower().strip():
|
75 |
+
return (
|
76 |
+
username,
|
77 |
+
True,
|
78 |
+
f"https://www.instagram.com/{username}/")
|
79 |
x_ig_app_id = get_json_value(response.text, "X-IG-App-ID", "\d+")
|
80 |
user_data_response = requests.get(
|
81 |
url=f"https://www.instagram.com/api/v1/users/web_profile_info/?username={username}",
|
82 |
headers={
|
83 |
"x-ig-app-id": x_ig_app_id,
|
84 |
+
},
|
85 |
+
allow_redirects = False)
|
86 |
logger("user_data_response:status", user_data_response.status_code)
|
|
|
|
|
87 |
return (
|
88 |
username,
|
89 |
+
user_data_response.status_code == 200 and (user_data_response.json() or {}).get('status') == 'ok',
|
90 |
f"https://www.instagram.com/{username}/")
|
91 |
return resolve
|
92 |
|