iglogin.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import asyncio
  2. import base64
  3. import datetime
  4. import getpass
  5. import logging
  6. import zlib
  7. from mauigpapi import AndroidAPI, AndroidState
  8. from mauigpapi.errors import IGChallengeError, IGLoginTwoFactorRequiredError
  9. from mautrix.util.logging import TraceLogger
  10. async def main():
  11. logging.basicConfig(level=logging.DEBUG)
  12. username = password = twofactor = None
  13. while not username:
  14. username = input("Username: ").strip()
  15. state = AndroidState()
  16. state.device.generate(username + str(datetime.date.today()))
  17. api_log: TraceLogger = logging.getLogger("api")
  18. api = AndroidAPI(state, log=api_log)
  19. try:
  20. print("Getting mobile config...")
  21. await api.get_mobile_config()
  22. while not password:
  23. password = getpass.getpass("Password: ")
  24. try:
  25. try:
  26. try:
  27. print("Logging in...")
  28. await api.login(username, password)
  29. except IGLoginTwoFactorRequiredError as e:
  30. print(e)
  31. print("Enter `r` to re-request SMS")
  32. inf = e.body.two_factor_info
  33. while not twofactor:
  34. twofactor = input("2FA code: ").lower().strip()
  35. if twofactor == "r":
  36. if inf.sms_two_factor_on:
  37. print("Re-requesting SMS code...")
  38. resp = await api.send_two_factor_login_sms(
  39. username, identifier=inf.two_factor_identifier
  40. )
  41. print("SMS code re-requested")
  42. inf = resp.two_factor_info
  43. inf.totp_two_factor_on = False
  44. else:
  45. print("You don't have SMS 2FA on 🤔")
  46. twofactor = None
  47. print("Sending 2FA code...")
  48. await api.two_factor_login(
  49. username,
  50. code=twofactor,
  51. identifier=inf.two_factor_identifier,
  52. is_totp=inf.totp_two_factor_on,
  53. )
  54. print("Fetching current user...")
  55. user = await api.current_user()
  56. except IGChallengeError as e:
  57. print(e)
  58. print("Resetting challenge...")
  59. await api.challenge_auto(reset=True)
  60. print("Fetching current user...")
  61. user = await api.current_user()
  62. except Exception as e:
  63. print("💥", e)
  64. return
  65. if not user or not user.user:
  66. print("Login failed?")
  67. return
  68. print(f"Logged in as @{user.user.username}")
  69. print()
  70. print(
  71. base64.b64encode(zlib.compress(state.json().encode("utf-8"), level=9)).decode("utf-8")
  72. )
  73. print()
  74. finally:
  75. await api.http.close()
  76. if __name__ == "__main__":
  77. asyncio.run(main())