auth.py 2.8 KB

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