mckabue commited on
Commit
424902a
·
1 Parent(s): d0ba16d

Refactor Instagram username resolution to improve username validation and response handling

Browse files
Files changed (1) hide show
  1. app.py +13 -6
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 = ["username"]
 
 
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.ok and status == 'ok',
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