فهرست منبع

Add script to generate session data

Tulir Asokan 2 سال پیش
والد
کامیت
608f7e553c
1فایلهای تغییر یافته به همراه81 افزوده شده و 0 حذف شده
  1. 81 0
      mauigpapi/scripts/iglogin.py

+ 81 - 0
mauigpapi/scripts/iglogin.py

@@ -0,0 +1,81 @@
+import asyncio
+import base64
+import datetime
+import getpass
+import logging
+import zlib
+
+from mauigpapi import AndroidAPI, AndroidState
+from mauigpapi.errors import IGChallengeError, IGLoginTwoFactorRequiredError
+from mautrix.util.logging import TraceLogger
+
+
+async def main():
+    logging.basicConfig(level=logging.DEBUG)
+    username = password = twofactor = None
+    while not username:
+        username = input("Username: ").strip()
+    state = AndroidState()
+    state.device.generate(username + str(datetime.date.today()))
+    api_log: TraceLogger = logging.getLogger("api")
+    api = AndroidAPI(state, log=api_log)
+    try:
+        print("Getting mobile config...")
+        await api.get_mobile_config()
+        while not password:
+            password = getpass.getpass("Password: ")
+        try:
+            try:
+                try:
+                    print("Logging in...")
+                    await api.login(username, password)
+                except IGLoginTwoFactorRequiredError as e:
+                    print(e)
+                    print("Enter `r` to re-request SMS")
+                    inf = e.body.two_factor_info
+                    while not twofactor:
+                        twofactor = input("2FA code: ").lower().strip()
+                        if twofactor == "r":
+                            if inf.sms_two_factor_on:
+                                print("Re-requesting SMS code...")
+                                await api.send_two_factor_login_sms(
+                                    username, identifier=inf.two_factor_identifier
+                                )
+                                print("SMS code re-requested")
+                                inf.totp_two_factor_on = False
+                            else:
+                                print("You don't have SMS 2FA on 🤔")
+                            twofactor = None
+                    print("Sending 2FA code...")
+                    await api.two_factor_login(
+                        username,
+                        code=twofactor,
+                        identifier=inf.two_factor_identifier,
+                        is_totp=inf.totp_two_factor_on,
+                    )
+                print("Fetching current user...")
+                user = await api.current_user()
+            except IGChallengeError as e:
+                print(e)
+                print("Resetting challenge...")
+                await api.challenge_auto(reset=True)
+                print("Fetching current user...")
+                user = await api.current_user()
+        except Exception as e:
+            print("💥", e)
+            return
+        if not user or not user.user:
+            print("Login failed?")
+            return
+        print(f"Logged in as @{user.user.username}")
+        print()
+        print(
+            base64.b64encode(zlib.compress(state.json().encode("utf-8"), level=9)).decode("utf-8")
+        )
+        print()
+    finally:
+        await api.http.close()
+
+
+if __name__ == "__main__":
+    asyncio.run(main())