123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import json
- import codecs
- import datetime
- import os.path
- import logging
- import argparse
- import json
- import codecs
- from socket import timeout, error as SocketError
- from ssl import SSLError
- from urllib2 import URLError
- from httplib import HTTPException
- try:
- from instagram_private_api import (
- Client, ClientError, ClientLoginError,
- ClientCookieExpiredError, ClientLoginRequiredError,
- __version__ as client_version)
- except ImportError:
- import sys
- sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
- from instagram_private_api import (
- Client, ClientError, ClientLoginError,
- ClientCookieExpiredError, ClientLoginRequiredError,
- __version__ as client_version)
- from instagram_private_api_extensions import live
- import sys, os, time, json
- def download():
- try:
- user_res = api.username_info(args.record)
- user_id = user_res['user']['pk']
- except Exception as e:
- print('[E] Could not get user information, exiting . . .')
- print('[E] ' + str(e))
- print(seperator)
- exit()
- try:
- print('[I] Checking broadcast for ' + args.record + ' . . .')
- broadcast = api.user_broadcast(user_id)
- if (broadcast is None):
- raise Exception('No broadcast available')
- except Exception as e:
- print('[E] Could not get broadcast information, exiting . . .')
- print('[E] ' + str(e))
- print(seperator)
- exit()
- try:
- dl = live.Downloader(
- mpd=broadcast['dash_playback_url'],
- output_dir='{}_output_{}/'.format(args.record, broadcast['id']),
- user_agent=api.user_agent)
- except Exception as e:
- print('[E] Could not start broadcast recording, exiting . . .')
- print('[E] ' + str(e))
- print(seperator)
- exit()
- try:
- print('[I] Starting broadcast recording . . .')
- dl.run()
- except KeyboardInterrupt:
- print('')
- print('[I] Aborting broadcast recording . . .')
- if not dl.is_aborted:
- dl.stop()
- finally:
- t = time.time()
- print('[I] Stitching downloaded files into video . . .')
- dl.stitch(args.record + "_" + str(broadcast['id']) + "_" + str(int(t)) + '.mp4')
- print('[I] Successfully stitched downloaded files, exiting . . .')
- print(seperator)
- exit()
- def to_json(python_object):
- if isinstance(python_object, bytes):
- return {'__class__': 'bytes',
- '__value__': codecs.encode(python_object, 'base64').decode()}
- raise TypeError(repr(python_object) + ' is not JSON serializable')
- def from_json(json_object):
- if '__class__' in json_object and json_object['__class__'] == 'bytes':
- return codecs.decode(json_object['__value__'].encode(), 'base64')
- return json_object
- def onlogin_callback(api, new_settings_file):
- cache_settings = api.settings
- with open(new_settings_file, 'w') as outfile:
- json.dump(cache_settings, outfile, default=to_json)
- print('SAVED: {0!s}'.format(new_settings_file))
- if __name__ == '__main__':
- logging.basicConfig()
- logger = logging.getLogger('instagram_private_api')
- logger.setLevel(logging.WARNING)
- # Example command:
- # python examples/savesettings_logincallback.py -u "yyy" -p "zzz" -settings "test_credentials.json"
- parser = argparse.ArgumentParser(description='login callback and save settings demo')
- parser.add_argument('-settings', '--settings', dest='settings_file_path', type=str, required=True)
- parser.add_argument('-u', '--username', dest='username', type=str, required=True)
- parser.add_argument('-p', '--password', dest='password', type=str, required=True)
- parser.add_argument('-r', '--record', dest='record', type=str, required=True)
- global args
- global clear
- global seperator
- seperator = '=-' * 35
- clear = lambda: os.system('clear')
- args = parser.parse_args()
- #clear()
- print('PYINSTALIVE DOWNLOADER (API v{0!s})'.format(client_version))
- print(seperator)
- device_id = None
- try:
- settings_file = args.settings_file_path
- if not os.path.isfile(settings_file):
- # settings file does not exist
- print('[E] Unable to find file: {0!s}'.format(settings_file))
- # login new
- api = Client(
- args.username, args.password,
- on_login=lambda x: onlogin_callback(x, args.settings_file_path))
- else:
- with open(settings_file) as file_data:
- cached_settings = json.load(file_data, object_hook=from_json)
- print('[I] Reusing settings: {0!s}'.format(settings_file))
- device_id = cached_settings.get('device_id')
- # reuse auth settings
- api = Client(
- args.username, args.password,
- settings=cached_settings)
- except (ClientCookieExpiredError, ClientLoginRequiredError) as e:
- print('[E] ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e))
- # Login expired
- # Do relogin but use default ua, keys and such
- api = Client(
- args.username, args.password,
- device_id=device_id,
- on_login=lambda x: onlogin_callback(x, args.settings_file_path))
- except ClientLoginError as e:
- print('[E] ClientLoginError {0!s}'.format(e))
- print(seperator)
- exit(9)
- except ClientError as e:
- print('[E] ClientError {0!s} (Code: {1:d}, Response: {2!s})'.format(e.msg, e.code, e.error_response))
- print(seperator)
- exit(9)
- except Exception as e:
- print('[E] Unexpected Exception: {0!s}'.format(e))
- print(seperator)
- exit(99)
- # Show when login expires
- cookie_expiry = api.cookie_jar.expires_earliest
- print('[I] Cookie Expiry: {0!s}'.format(datetime.datetime.fromtimestamp(cookie_expiry).strftime('%Y-%m-%dT%H:%M:%SZ')))
- print('[I] Successfully logged in, starting recorder . . .')
- download()
|