auth.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import codecs
  2. import datetime
  3. import json
  4. import os.path
  5. import sys
  6. from .logger import log, seperator
  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['__class__'] == 'bytes':
  24. return codecs.decode(json_object['__value__'].encode(), 'base64')
  25. return json_object
  26. def onlogin_callback(api, settings_file):
  27. cache_settings = api.settings
  28. with open(settings_file, 'w') as outfile:
  29. json.dump(cache_settings, outfile, default=to_json)
  30. log('[I] New auth cookie file was made: {0!s}'.format(settings_file), "GREEN")
  31. def login(username, password, show_cookie_expiry, ignore_existing_cookie):
  32. device_id = None
  33. try:
  34. if ignore_existing_cookie:
  35. api = Client(
  36. username, password)
  37. else:
  38. settings_file = username + ".json"
  39. if not os.path.isfile(settings_file):
  40. # settings file does not exist
  41. log('[W] Unable to find auth cookie file: {0!s}'.format(settings_file), "YELLOW")
  42. # login new
  43. api = Client(
  44. username, password,
  45. on_login=lambda x: onlogin_callback(x, settings_file))
  46. else:
  47. with open(settings_file) as file_data:
  48. cached_settings = json.load(file_data, object_hook=from_json)
  49. # log('[I] Using settings file: {0!s}'.format(settings_file), "GREEN")
  50. device_id = cached_settings.get('device_id')
  51. # reuse auth settings
  52. api = Client(
  53. username, password,
  54. settings=cached_settings)
  55. except (ClientCookieExpiredError, ClientLoginRequiredError) as e:
  56. log('[E] ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e), "RED")
  57. # Login expired
  58. # Do relogin but use default ua, keys and such
  59. api = Client(
  60. username, password,
  61. device_id=device_id,
  62. on_login=lambda x: onlogin_callback(x, settings_file))
  63. except ClientLoginError as e:
  64. log('[E] ClientLoginError: {0!s}'.format(e), "RED")
  65. sys.exit(9)
  66. except ClientError as e:
  67. log('[E] ClientError: {0!s}'.format(e), "RED")
  68. sys.exit(9)
  69. except Exception as e:
  70. if (str(e).startswith("unsupported pickle protocol")):
  71. log("[W] This cookie file is not compatible with Python {}.".format(sys.version.split(' ')[0][0]), "YELLOW")
  72. log("[W] Please delete your cookie file '" + username + ".json' and try again.", "YELLOW")
  73. else:
  74. log('[E] Unexpected Exception: {0!s}'.format(e), "RED")
  75. sys.exit(99)
  76. log('[I] Login to "' + api.authenticated_user_name + '" OK!', "GREEN")
  77. if show_cookie_expiry.title() == 'True' and ignore_existing_cookie == False:
  78. cookie_expiry = api.cookie_jar.expires_earliest
  79. log('[I] Login cookie expiry date: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%d at %H:%M:%S')), "GREEN")
  80. return api