@@ -85,7 +85,7 @@ def setProxy(self, proxy=None):
8585
8686 if proxy is not None :
8787 print ('Set proxy!' )
88- proxies = {'http' : 'http://' + proxy , 'https' : 'http://' + proxy }
88+ proxies = {'http' : proxy , 'https' : proxy }
8989 self .s .proxies .update (proxies )
9090
9191 def login (self , force = False ):
@@ -388,7 +388,63 @@ def configureTimelineAlbum(self, media, albumInternalMetadata, captionText='', l
388388 except :
389389 pass
390390 return False
391-
391+
392+ def direct_message (self , text , recipients ):
393+ if type (recipients ) != type ([]):
394+ recipients = [str (recipients )]
395+ recipient_users = '"",""' .join (str (r ) for r in recipients )
396+ endpoint = 'direct_v2/threads/broadcast/text/'
397+ boundary = self .uuid
398+ bodies = [
399+ {
400+ 'type' : 'form-data' ,
401+ 'name' : 'recipient_users' ,
402+ 'data' : '[["{}"]]' .format (recipient_users ),
403+ },
404+ {
405+ 'type' : 'form-data' ,
406+ 'name' : 'client_context' ,
407+ 'data' : self .uuid ,
408+ },
409+ {
410+ 'type' : 'form-data' ,
411+ 'name' : 'thread' ,
412+ 'data' : '["0"]' ,
413+ },
414+ {
415+ 'type' : 'form-data' ,
416+ 'name' : 'text' ,
417+ 'data' : text or '' ,
418+ },
419+ ]
420+ data = self .buildBody (bodies ,boundary )
421+ self .s .headers .update (
422+ {
423+ 'User-Agent' : self .USER_AGENT ,
424+ 'Proxy-Connection' : 'keep-alive' ,
425+ 'Connection' : 'keep-alive' ,
426+ 'Accept' : '*/*' ,
427+ 'Content-Type' : 'multipart/form-data; boundary={}' .format (boundary ),
428+ 'Accept-Language' : 'en-en' ,
429+ }
430+ )
431+ #self.SendRequest(endpoint,post=data) #overwrites 'Content-type' header and boundary is missed
432+ response = self .s .post (self .API_URL + endpoint , data = data )
433+
434+ if response .status_code == 200 :
435+ self .LastResponse = response
436+ self .LastJson = json .loads (response .text )
437+ return True
438+ else :
439+ print ("Request return " + str (response .status_code ) + " error!" )
440+ # for debugging
441+ try :
442+ self .LastResponse = response
443+ self .LastJson = json .loads (response .text )
444+ except :
445+ pass
446+ return False
447+
392448 def direct_share (self , media_id , recipients , text = None ):
393449 if not isinstance (position , list ):
394450 recipients = [str (recipients )]
@@ -727,6 +783,20 @@ def unlike(self, mediaId):
727783 'media_id' : mediaId })
728784 return self .SendRequest ('media/' + str (mediaId ) + '/unlike/' , self .generateSignature (data ))
729785
786+ def save (self , mediaId ):
787+ data = json .dumps ({'_uuid' : self .uuid ,
788+ '_uid' : self .username_id ,
789+ '_csrftoken' : self .token ,
790+ 'media_id' : mediaId })
791+ return self .SendRequest ('media/' + str (mediaId ) + '/save/' , self .generateSignature (data ))
792+
793+ def unsave (self , mediaId ):
794+ data = json .dumps ({'_uuid' : self .uuid ,
795+ '_uid' : self .username_id ,
796+ '_csrftoken' : self .token ,
797+ 'media_id' : mediaId })
798+ return self .SendRequest ('media/' + str (mediaId ) + '/unsave/' , self .generateSignature (data ))
799+
730800 def getMediaComments (self , mediaId , max_id = '' ):
731801 return self .SendRequest ('media/' + mediaId + '/comments/?max_id=' + max_id )
732802
@@ -827,6 +897,37 @@ def generateUUID(self, type):
827897 def generateUploadId (self ):
828898 return str (calendar .timegm (datetime .utcnow ().utctimetuple ()))
829899
900+ def createBroadcast (self , previewWidth = 1080 , previewHeight = 1920 , broadcastMessage = '' ):
901+ data = json .dumps ({'_uuid' : self .uuid ,
902+ '_uid' : self .username_id ,
903+ 'preview_height' : previewHeight ,
904+ 'preview_width' : previewWidth ,
905+ 'broadcast_message' : broadcastMessage ,
906+ 'broadcast_type' : 'RTMP' ,
907+ 'internal_only' : 0 ,
908+ '_csrftoken' : self .token })
909+ return self .SendRequest ('live/create/' , self .generateSignature (data ))
910+
911+ def startBroadcast (self , broadcastId , sendNotification = False ):
912+ data = json .dumps ({'_uuid' : self .uuid ,
913+ '_uid' : self .username_id ,
914+ 'should_send_notifications' : int (sendNotification ),
915+ '_csrftoken' : self .token })
916+ return self .SendRequest ('live/' + str (broadcastId ) + '/start' , self .generateSignature (data ))
917+
918+ def stopBroadcast (self , broadcastId ):
919+ data = json .dumps ({'_uuid' : self .uuid ,
920+ '_uid' : self .username_id ,
921+ '_csrftoken' : self .token })
922+ return self .SendRequest ('live/' + str (broadcastId ) + '/end_broadcast/' , self .generateSignature (data ))
923+
924+ def addBroadcastToLive (self , broadcastId ):
925+ # broadcast has to be ended first!
926+ data = json .dumps ({'_uuid' : self .uuid ,
927+ '_uid' : self .username_id ,
928+ '_csrftoken' : self .token })
929+ return self .SendRequest ('live/' + str (broadcastId ) + '/add_to_post_live/' , self .generateSignature (data ))
930+
830931 def buildBody (self , bodies , boundary ):
831932 body = u''
832933 for b in bodies :
0 commit comments