11from typing import Union , BinaryIO
22from ..models .message import *
3+ from requests_toolbelt import MultipartEncoder
4+ import mimetypes
5+ import requests
36
47class MessageService :
58 def __init__ (self , client ):
69 self .client = client
710
811 def send_text (self , instance_id : str , message : TextMessage , instance_token : str ):
12+ # Preparar os dados como JSON
13+ data = {
14+ 'number' : message .number ,
15+ 'text' : message .text
16+ }
17+
18+ if hasattr (message , 'delay' ) and message .delay is not None :
19+ data ['delay' ] = message .delay
20+
21+ # Usar o método post do cliente que já trata JSON corretamente
922 return self .client .post (
1023 f'message/sendText/{ instance_id } ' ,
11- data = message . __dict__ ,
24+ data = data ,
1225 instance_token = instance_token
1326 )
1427
1528 def send_media (self , instance_id : str , message : MediaMessage , instance_token : str , file : Union [BinaryIO , str ] = None ):
16- payload = {
17- 'data' : message .__dict__ ,
18- 'instance_token' : instance_token
29+ # Preparar os dados do formulário
30+ fields = {
31+ 'number' : (None , message .number , 'text/plain' ),
32+ 'mediatype' : (None , message .mediatype , 'text/plain' ),
33+ 'mimetype' : (None , message .mimetype , 'text/plain' ),
34+ 'caption' : (None , message .caption , 'text/plain' ),
35+ 'fileName' : (None , message .fileName , 'text/plain' ),
1936 }
2037
38+ # Adicionar delay apenas se existir
39+ if hasattr (message , 'delay' ) and message .delay is not None :
40+ fields ['delay' ] = (None , str (message .delay ), 'text/plain; type=number' )
41+
42+ # Adicionar o arquivo se fornecido
2143 if file :
2244 if isinstance (file , str ):
23- with open (file , 'rb' ) as f :
24- payload [ 'files ' ] = { 'file' : f }
45+ mime_type = mimetypes . guess_type (file )[ 0 ] or 'application/octet-stream'
46+ fields [ 'file ' ] = ( 'file' , open ( file , 'rb' ), mime_type )
2547 else :
26- payload ['files' ] = {'file' : file }
27-
28- return self .client .post (
29- f'message/sendMedia/{ instance_id } ' ,
30- ** payload
48+ fields ['file' ] = ('file' , file , 'application/octet-stream' )
49+
50+ # Criar o multipart encoder
51+ multipart = MultipartEncoder (fields = fields )
52+
53+ # Preparar os headers
54+ headers = self .client ._get_headers (instance_token )
55+ headers ['Content-Type' ] = multipart .content_type
56+
57+ # Fazer a requisição diretamente
58+ url = f'{ self .client .base_url } /message/sendMedia/{ instance_id } '
59+ response = requests .post (
60+ url ,
61+ headers = headers ,
62+ data = multipart
3163 )
64+
65+ return response .json ()
3266
3367 def send_ptv (self , instance_id : str , message : dict , instance_token : str , file : Union [BinaryIO , str ] = None ):
34- payload = {
35- 'data' : message ,
36- 'instance_token' : instance_token
37- }
68+ fields = {}
69+
70+ # Adiciona todos os campos do message como text/plain
71+ for key , value in message .items ():
72+ if key == 'delay' and value is not None :
73+ fields [key ] = (None , str (value ), 'text/plain; type=number' )
74+ else :
75+ fields [key ] = (None , str (value ), 'text/plain' )
3876
3977 if file :
4078 if isinstance (file , str ):
41- with open (file , 'rb' ) as f :
42- payload [ 'files ' ] = { 'file' : f }
79+ mime_type = mimetypes . guess_type (file )[ 0 ] or 'application/octet-stream'
80+ fields [ 'file ' ] = ( 'file' , open ( file , 'rb' ), mime_type )
4381 else :
44- payload ['files' ] = {'file' : file }
45-
46- return self .client .post (
47- f'message/sendPtv/{ instance_id } ' ,
48- ** payload
49- )
82+ fields ['file' ] = ('file' , file , 'application/octet-stream' )
83+
84+ multipart = MultipartEncoder (fields = fields )
85+ headers = self .client ._get_headers (instance_token )
86+ headers ['Content-Type' ] = multipart .content_type
87+
88+ url = f'{ self .client .base_url } /message/sendPtv/{ instance_id } '
89+ response = requests .post (url , headers = headers , data = multipart )
90+ return response .json ()
5091
5192 def send_whatsapp_audio (self , instance_id : str , message : dict , instance_token : str , file : Union [BinaryIO , str ] = None ):
52- payload = {
53- 'data' : message ,
54- 'instance_token' : instance_token
55- }
93+ fields = {}
94+
95+ # Adiciona todos os campos do message como text/plain
96+ for key , value in message .items ():
97+ if key == 'delay' and value is not None :
98+ fields [key ] = (None , str (value ), 'text/plain; type=number' )
99+ else :
100+ fields [key ] = (None , str (value ), 'text/plain' )
56101
57102 if file :
58103 if isinstance (file , str ):
59- with open (file , 'rb' ) as f :
60- payload [ 'files ' ] = { 'file' : f }
104+ mime_type = mimetypes . guess_type (file )[ 0 ] or 'application/octet-stream'
105+ fields [ 'file ' ] = ( 'file' , open ( file , 'rb' ), mime_type )
61106 else :
62- payload ['files' ] = {'file' : file }
63-
64- return self .client .post (
65- f'message/sendWhatsAppAudio/{ instance_id } ' ,
66- ** payload
67- )
107+ fields ['file' ] = ('file' , file , 'application/octet-stream' )
108+
109+ multipart = MultipartEncoder (fields = fields )
110+ headers = self .client ._get_headers (instance_token )
111+ headers ['Content-Type' ] = multipart .content_type
112+
113+ url = f'{ self .client .base_url } /message/sendWhatsAppAudio/{ instance_id } '
114+ response = requests .post (url , headers = headers , data = multipart )
115+ return response .json ()
68116
69117 def send_status (self , instance_id : str , message : StatusMessage , instance_token : str ):
70118 return self .client .post (
@@ -73,17 +121,39 @@ def send_status(self, instance_id: str, message: StatusMessage, instance_token:
73121 instance_token = instance_token
74122 )
75123
76- def send_sticker (self , instance_id : str , message : dict , instance_token : str ):
77- return self .client .post (
78- f'message/sendSticker/{ instance_id } ' ,
79- data = message ,
80- instance_token = instance_token
81- )
124+ def send_sticker (self , instance_id : str , message : dict , instance_token : str , file : Union [BinaryIO , str ] = None ):
125+ fields = {}
126+
127+ # Adiciona todos os campos do message como text/plain
128+ for key , value in message .items ():
129+ if key == 'delay' and value is not None :
130+ fields [key ] = (None , str (value ), 'text/plain; type=number' )
131+ else :
132+ fields [key ] = (None , str (value ), 'text/plain' )
133+
134+ if file :
135+ if isinstance (file , str ):
136+ mime_type = mimetypes .guess_type (file )[0 ] or 'application/octet-stream'
137+ fields ['file' ] = ('file' , open (file , 'rb' ), mime_type )
138+ else :
139+ fields ['file' ] = ('file' , file , 'application/octet-stream' )
140+
141+ multipart = MultipartEncoder (fields = fields )
142+ headers = self .client ._get_headers (instance_token )
143+ headers ['Content-Type' ] = multipart .content_type
144+
145+ url = f'{ self .client .base_url } /message/sendSticker/{ instance_id } '
146+ response = requests .post (url , headers = headers , data = multipart )
147+ return response .json ()
82148
83149 def send_location (self , instance_id : str , message : LocationMessage , instance_token : str ):
150+ data = message .__dict__ .copy ()
151+ if 'delay' in data and data ['delay' ] is not None :
152+ data ['delay' ] = int (data ['delay' ])
153+
84154 return self .client .post (
85155 f'message/sendLocation/{ instance_id } ' ,
86- data = message . __dict__ ,
156+ data = data ,
87157 instance_token = instance_token
88158 )
89159
@@ -102,22 +172,34 @@ def send_reaction(self, instance_id: str, message: ReactionMessage, instance_tok
102172 )
103173
104174 def send_poll (self , instance_id : str , message : PollMessage , instance_token : str ):
175+ data = message .__dict__ .copy ()
176+ if 'delay' in data and data ['delay' ] is not None :
177+ data ['delay' ] = int (data ['delay' ])
178+
105179 return self .client .post (
106180 f'message/sendPoll/{ instance_id } ' ,
107- data = message . __dict__ ,
181+ data = data ,
108182 instance_token = instance_token
109183 )
110184
111185 def send_list (self , instance_id : str , message : ListMessage , instance_token : str ):
186+ data = message .__dict__ .copy ()
187+ if 'delay' in data and data ['delay' ] is not None :
188+ data ['delay' ] = int (data ['delay' ])
189+
112190 return self .client .post (
113191 f'message/sendList/{ instance_id } ' ,
114- data = message . __dict__ ,
192+ data = data ,
115193 instance_token = instance_token
116194 )
117195
118196 def send_buttons (self , instance_id : str , message : ButtonMessage , instance_token : str ):
197+ data = message .__dict__ .copy ()
198+ if 'delay' in data and data ['delay' ] is not None :
199+ data ['delay' ] = int (data ['delay' ])
200+
119201 return self .client .post (
120202 f'message/sendButtons/{ instance_id } ' ,
121- data = message . __dict__ ,
203+ data = data ,
122204 instance_token = instance_token
123205 )
0 commit comments