def __init__(self, debug=False, IGDataPath=None): self.debug = None self.IGDataPath = None self.username = None self.uuid = None self.waterfall_id = None self.token = None self.userAgent = None self.settings = None self.proxy = None # Full Proxy self.proxyHost = None # Proxy Host and Port self.proxyAuth = None # Proxy User and Pass self.username = '' self.debug = debug self.uuid = SignatureUtils.generateUUID(True) self.waterfall_id = SignatureUtils.generateUUID(True) if IGDataPath is not None: self.IGDataPath = IGDataPath else: self.IGDataPath = os.path.join( os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data'), '' ) self.userAgent = 'Instagram ' + Constants.VERSION + ' Android (18/4.3; 320dpi; 720x1280; Xiaomi; HM 1SW; armani; qcom; en_US)'
def usernameSuggestions(self, email, name): data = json.dumps( OrderedDict([ ('name', SignatureUtils.generateUUID(True)), ('waterfall_id', SignatureUtils.generateUUID(True)), ('email', email), ('_csrftoken', 'missing'), ]) ) return UsernameSuggestionsResponse( self.request('accounts/username_suggestions/', SignatureUtils.generateSignature(data))[1])
def checkEmail(self, email): data = json.dumps( OrderedDict([ ('qe_id', SignatureUtils.generateUUID(True)), ('waterfall_id', SignatureUtils.generateUUID(True)), ('email', email), ('_csrftoken', 'missing'), ]) ) return CheckEmailResponse(self.request('users/check_email/', SignatureUtils.generateSignature(data))[1])
def createAccount(self, username, password, email, name=''): """ Register account. :type username: str :param username: :type password: str :param password: :type email: str :param email: :rtype: object :return: Registration data """ token = self.getCsfrtoken() data = json.dumps( OrderedDict([ ('allow_contacts_sync', 'true'), ('phone_id', self.uuid), ('_csrftoken', token), ('username', username), ('first_name', name), ('guid', self.uuid), ('device_id', SignatureUtils.generateDeviceId( hashlib.md5(username + password).hexdigest())), ('email', email), ('force_sign_up_code', ''), ('waterfall_id', self.waterfall_id), ('qs_stamp', ''), ('password', password), ])) result = self.request('accounts/create/', SignatureUtils.generateSignature(data)) header = result[0] response = AccountCreationResponse(result[1]) if response.isAccountCreated(): self.username_id = response.getUsernameId() self.settings.set('username_id', self.username_id) match = re.search(r'^Set-Cookie: csrftoken=([^;]+)', header, re.MULTILINE) token = match.group(1) if match else '' self.settings.set('token', token) return response
def createAccount(self, username, password, email, name=''): """ Register account. :type username: str :param username: :type password: str :param password: :type email: str :param email: :rtype: object :return: Registration data """ token = self.getCsfrtoken() data = json.dumps( OrderedDict([ ('allow_contacts_sync', 'true'), ('phone_id', self.uuid), ('_csrftoken', token), ('username', username), ('first_name', name), ('guid', self.uuid), ('device_id', SignatureUtils.generateDeviceId(hashlib.md5(username + password).hexdigest())), ('email', email), ('force_sign_up_code', ''), ('waterfall_id', self.waterfall_id), ('qs_stamp', ''), ('password', password), ]) ) result = self.request('accounts/create/', SignatureUtils.generateSignature(data)) header = result[0] response = AccountCreationResponse(result[1]) if response.isAccountCreated(): self.username_id = response.getUsernameId() self.settings.set('username_id', self.username_id) match = re.search(r'^Set-Cookie: csrftoken=([^;]+)', header, re.MULTILINE) token = match.group(1) if match else '' self.settings.set('token', token) return response
def checkUsername(self, username): """ Checks if the username is already taken (exists). :type username: str :param username: :rtype: object :return: Username availability data """ data = json.dumps( OrderedDict([ ('_uuid', self.uuid), ('username', username), ('_csrftoken', 'missing'), ]) ) self.username = username self.settings = Settings(os.path.join(self.IGDataPath, self.username, 'settings-' + username + '.dat')) return CheckUsernameResponse(self.request('users/check_username/', SignatureUtils.generateSignature(data))[1])
def direct_message(self, recipients, text): if not isinstance(recipients, list): recipients = [recipients] string = [] for recipient in recipients: string.append('"' + recipient + '"') recipient_users = ','.join(string) endpoint = Constants.API_URL + 'direct_v2/threads/broadcast/text/' boundary = self.parent.uuid bodies = [ OrderedDict([('type', 'form-data'), ('name', 'recipient_users'), ('data', "[[" + recipient_users + "]]")]), OrderedDict([('type', 'form-data'), ('name', 'client_context'), ('data', SignatureUtils.generateUUID(True))]), OrderedDict([('type', 'form-data'), ('name', 'thread_ids'), ('data', '["0"]')]), OrderedDict([('type', 'form-data'), ('name', 'text'), ('data', '' if text is None else text)]), ] data = self.buildBody(bodies, boundary) headers = [ 'Proxy-Connection: keep-alive', 'Connection: keep-alive', 'Accept: */*', 'Content-type: multipart/form-data; boundary=' + boundary, 'Accept-Language: en-en', ] buffer = BytesIO() ch = pycurl.Curl() ch.setopt(pycurl.URL, endpoint) ch.setopt(pycurl.USERAGENT, self.userAgent) ch.setopt(pycurl.WRITEFUNCTION, buffer.write) ch.setopt(pycurl.FOLLOWLOCATION, True) ch.setopt(pycurl.HEADER, True) ch.setopt(pycurl.VERBOSE, self.parent.debug) ch.setopt(pycurl.SSL_VERIFYPEER, self.verifyPeer) ch.setopt(pycurl.SSL_VERIFYHOST, self.verifyHost) ch.setopt(pycurl.HTTPHEADER, headers) ch.setopt( pycurl.COOKIEFILE, self.parent.IGDataPath + self.parent.username + "-cookies.dat") ch.setopt( pycurl.COOKIEJAR, self.parent.IGDataPath + self.parent.username + "-cookies.dat") ch.setopt(pycurl.POST, True) ch.setopt(pycurl.POSTFIELDS, data) if self.parent.proxy: ch.setopt(pycurl.PROXY, self.parent.proxyHost) if self.parent.proxyAuth: ch.setopt(pycurl.PROXYUSERPWD, self.parent.proxyAuth) ch.perform() resp = buffer.getvalue() header_len = ch.getinfo(pycurl.HEADER_SIZE) header = resp[0:header_len] upload = json.loads(resp[header_len:].decode('utf-8')) ch.close()