auth.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import codecs
  2. import datetime
  3. import json
  4. import os.path
  5. import sys
  6. from .logger import log_seperator, supports_color, log_info_blue, log_info_green, log_warn, log_error, log_whiteline, log_plain
  7. try:
  8. from instagram_private_api import (
  9. Client, ClientError, ClientLoginError,
  10. ClientCookieExpiredError, ClientLoginRequiredError)
  11. except ImportError:
  12. import sys
  13. sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
  14. from instagram_private_api import (
  15. Client, ClientError, ClientLoginError,
  16. ClientCookieExpiredError, ClientLoginRequiredError)
  17. def to_json(python_object):
  18. if isinstance(python_object, bytes):
  19. return {'__class__': 'bytes',
  20. '__value__': codecs.encode(python_object, 'base64').decode()}
  21. raise TypeError(repr(python_object) + ' is not JSON serializable')
  22. def from_json(json_object):
  23. if '__class__' in json_object and json_object.get('__class__') == 'bytes':
  24. return codecs.decode(json_object.get('__value__').encode(), 'base64')
  25. return json_object
  26. def onlogin_callback(api, cookie_file):
  27. cache_settings = api.settings
  28. with open(cookie_file, 'w') as outfile:
  29. json.dump(cache_settings, outfile, default=to_json)
  30. log_info_green('New cookie file was made: {0!s}'.format(cookie_file))
  31. log_seperator()
  32. def login(username, password, show_cookie_expiry, force_use_login_args):
  33. device_id = None
  34. try:
  35. if force_use_login_args:
  36. log_info_blue("Overriding configuration file login with -u and -p arguments...")
  37. log_seperator()
  38. cookie_file = "{}.json".format(username)
  39. if not os.path.isfile(cookie_file):
  40. # settings file does not exist
  41. log_warn('Unable to find cookie file: {0!s}'.format(cookie_file))
  42. log_info_green('Creating a new cookie file...')
  43. # login new
  44. api = Client(
  45. username, password,
  46. on_login=lambda x: onlogin_callback(x, cookie_file))
  47. else:
  48. with open(cookie_file) as file_data:
  49. cached_settings = json.load(file_data, object_hook=from_json)
  50. # log_info_green('Using settings file: {0!s}'.format(cookie_file))
  51. device_id = cached_settings.get('device_id')
  52. # reuse auth cached_settings
  53. api = Client(
  54. username, password,
  55. settings=cached_settings)
  56. except (ClientCookieExpiredError) as e:
  57. log_warn('The current cookie file for "{:s}" has expired, creating a new one...'.format(username))
  58. # Login expired
  59. # Do relogin but use default ua, keys and such
  60. try:
  61. api = Client(
  62. username, password,
  63. device_id=device_id,
  64. on_login=lambda x: onlogin_callback(x, cookie_file))
  65. except Exception as ee:
  66. log_seperator()
  67. log_error('An error occurred while trying to create a new cookie file: {:s}'.format(str(ee)))
  68. if "getaddrinfo failed" in str(ee):
  69. log_error('Could not resolve host, check your internet connection.')
  70. elif "timed out" in str(ee):
  71. log_error('The connection timed out, check your internet connection.')
  72. elif "bad_password" in str(ee):
  73. log_error('The password you entered is incorrect. Please try again.')
  74. else:
  75. log_error('{:s}'.format(ee.message))
  76. log_seperator()
  77. exit(1)
  78. except ClientLoginError as e:
  79. log_seperator()
  80. log_error('Could not login: {:s}.'.format(json.loads(e.error_response).get("error_title", "Error title not available.")))
  81. log_error('{:s}'.format(json.loads(e.error_response).get("message", "Not available")))
  82. log_error('{:s}'.format(e.error_response))
  83. log_seperator()
  84. sys.exit(9)
  85. except ClientError as e:
  86. log_seperator()
  87. try:
  88. log_error('Unexpected exception: {0!s}'.format(e.msg))
  89. log_error('Message: {1!s}'.format(json.loads(e.error_response).get("message", "Additional error information not available.")))
  90. log_error('Code: {2:d}'.format(e.code))
  91. log_error('Full response:\n{3!s}'.format(e.error_response))
  92. log_whiteline()
  93. except Exception as ee:
  94. log_error('An error occurred while trying to handle a previous exception.')
  95. log_error('1: {:s}'.format(str(e)))
  96. log_error('2: {:s}'.format(str(ee)))
  97. if "getaddrinfo failed" in str(ee):
  98. log_error('Could not resolve host, check your internet connection.')
  99. if "timed out" in str(ee):
  100. log_error('The connection timed out, check your internet connection.')
  101. log_seperator()
  102. sys.exit(9)
  103. except Exception as e:
  104. if (str(e).startswith("unsupported pickle protocol")):
  105. log_warn("This cookie file is not compatible with Python {}.".format(sys.version.split(' ')[0][0]))
  106. log_warn("Please delete your cookie file '{}.json' and try again.".format(username))
  107. else:
  108. log_seperator()
  109. log_error('Unexpected exception: {0!s}'.format(e))
  110. log_seperator()
  111. sys.exit(99)
  112. except KeyboardInterrupt as e:
  113. log_seperator()
  114. log_warn("The user authentication has been aborted.")
  115. log_seperator()
  116. sys.exit(0)
  117. log_info_green('Successfully logged into user "{:s}".'.format(str(api.authenticated_user_name)))
  118. if show_cookie_expiry.title() == 'True' and not force_use_login_args:
  119. try:
  120. cookie_expiry = api.cookie_jar.auth_expires
  121. log_info_green('Cookie file expiry date: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%d at %I:%M:%S %p')))
  122. except AttributeError as e:
  123. log_warn('An error occurred while getting the cookie file expiry date: {0!s}'.format(e))
  124. log_seperator()
  125. return api