auth.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import codecs
  2. import json
  3. import os.path
  4. import logger
  5. try:
  6. from instagram_private_api import (
  7. Client, ClientError, ClientLoginError,
  8. ClientCookieExpiredError, ClientLoginRequiredError,
  9. __version__ as client_version)
  10. except ImportError:
  11. import sys
  12. sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
  13. from instagram_private_api import (
  14. Client, ClientError, ClientLoginError,
  15. ClientCookieExpiredError, ClientLoginRequiredError,
  16. __version__ as client_version)
  17. scriptVersion = "2.1.3"
  18. def to_json(python_object):
  19. if isinstance(python_object, bytes):
  20. return {'__class__': 'bytes',
  21. '__value__': codecs.encode(python_object, 'base64').decode()}
  22. raise TypeError(repr(python_object) + ' is not JSON serializable')
  23. def from_json(json_object):
  24. if '__class__' in json_object and json_object['__class__'] == 'bytes':
  25. return codecs.decode(json_object['__value__'].encode(), 'base64')
  26. return json_object
  27. def onlogin_callback(api, settings_file):
  28. cache_settings = api.settings
  29. with open(settings_file, 'w') as outfile:
  30. json.dump(cache_settings, outfile, default=to_json)
  31. logger.log('[I] New auth cookie file was made: {0!s}'.format(settings_file), "GREEN")
  32. def login(username, password):
  33. logger.log('PYINSTALIVE DOWNLOADER (SCRIPT v{0!s})'.format(scriptVersion), "GREEN")
  34. logger.seperator("GREEN")
  35. device_id = None
  36. try:
  37. settings_file = "credentials.json"
  38. if not os.path.isfile(settings_file):
  39. # settings file does not exist
  40. logger.log('[W] Unable to find auth cookie file: {0!s}'.format(settings_file), "YELLOW")
  41. # login new
  42. api = Client(
  43. username, password,
  44. on_login=lambda x: onlogin_callback(x, settings_file))
  45. else:
  46. with open(settings_file) as file_data:
  47. cached_settings = json.load(file_data, object_hook=from_json)
  48. # logger.log('[I] Using settings file: {0!s}'.format(settings_file), "GREEN")
  49. device_id = cached_settings.get('device_id')
  50. # reuse auth settings
  51. api = Client(
  52. username, password,
  53. settings=cached_settings)
  54. except (ClientCookieExpiredError, ClientLoginRequiredError) as e:
  55. logger.log('[E] ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e), "RED")
  56. # Login expired
  57. # Do relogin but use default ua, keys and such
  58. api = Client(
  59. username, password,
  60. device_id=device_id,
  61. on_login=lambda x: onlogin_callback(x, settings))
  62. except ClientLoginError as e:
  63. logger.log('[E] ClientLoginError: {0!s}'.format(e), "RED")
  64. sys.exit(9)
  65. except ClientError as e:
  66. logger.log('[E] ClientError: {0!s}'.format(e), "RED")
  67. sys.exit(9)
  68. except Exception as e:
  69. logger.log('[E] Unexpected Exception: {0!s}'.format(e), "RED")
  70. sys.exit(99)
  71. # Show when login expires
  72. # cookie_expiry = api.cookie_jar.expires_earliest
  73. # print('[I] Cookie Expiry: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%dT%H:%M:%S')), "WHITE")
  74. logger.log('[I] Login to "' + username + '" OK!', "GREEN")
  75. return api