| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- from odoo import models, fields, api
- from odoo.tools import groupby
- import logging
- import markupsafe
- import requests
- import json
- import time
- import random
- import re
- import html
- import base64
- _logger = logging.getLogger(__name__)
- class WhatsAppMessage(models.Model):
- _inherit = 'whatsapp.message'
-
- def _send_message(self, with_commit=False):
- url = ''
- if self.wa_account_id and self.wa_account_id.whatsapp_web_url:
- url = self.wa_account_id.whatsapp_web_url
- _logger.info('WHATSAPP WEB SEND MESSAGE' + url)
- group = ''
-
- if not url:
- super()._send_message(with_commit)
-
- for whatsapp_message in self:
- #verificacion envio a grupo
- #plantilla dada de alta en x_plantillas_whatsapp
- if 'marketing.trace' in self.env:
- marketing_traces = self.env['marketing.trace'].sudo().search([('whatsapp_message_id', '=', whatsapp_message.id)])
- for marketing_trace in marketing_traces:
- if 'x_studio_grupo_whatsapp' in marketing_trace.activity_id and marketing_trace.activity_id.x_studio_grupo_whatsapp:
- group = marketing_trace.activity_id.x_studio_grupo_whatsapp.x_studio_destinatario
- if 'x_notificaciones_whats' in self.env and not group:
- notificaciones = self.env['x_notificaciones_whats'].sudo().search([('x_studio_plantilla_de_whatsapp', '=', whatsapp_message.wa_template_id.id)])
- if notificaciones:
- _logger.info('template encontrado')
- if not group:
- for notificacion in notificaciones:
- if not notificacion.x_studio_partner_unico:
- group = notificacion.x_studio_destinatario
- break
-
- attachment = False
- if whatsapp_message.wa_template_id:
- record = self.env[whatsapp_message.wa_template_id.model].browse(whatsapp_message.mail_message_id.res_id)
- #codigo con base a whatsapp.message y whatsapp.template para generacion de adjuntos
- RecordModel = self.env[whatsapp_message.mail_message_id.model].with_user(whatsapp_message.create_uid)
- from_record = RecordModel.browse(whatsapp_message.mail_message_id.res_id)
- # if retrying message then we need to unlink previous attachment
- # in case of header with report in order to generate it again
- if whatsapp_message.wa_template_id.report_id and whatsapp_message.wa_template_id.header_type == 'document' and whatsapp_message.mail_message_id.attachment_ids:
- whatsapp_message.mail_message_id.attachment_ids.unlink()
- if not attachment and whatsapp_message.wa_template_id.report_id:
- attachment = whatsapp_message.wa_template_id._generate_attachment_from_report(record)
- if not attachment and whatsapp_message.wa_template_id.header_attachment_ids:
- attachment = whatsapp_message.wa_template_id.header_attachment_ids[0]
-
- if attachment and attachment not in whatsapp_message.mail_message_id.attachment_ids:
- whatsapp_message.mail_message_id.attachment_ids = [(4, attachment.id)]
- # no template
- elif whatsapp_message.mail_message_id.attachment_ids:
- attachment = whatsapp_message.mail_message_id.attachment_ids[0]
- #codigo para limpiar body y numero
- body = whatsapp_message.body
- if isinstance(body, markupsafe.Markup):
- text = html.unescape(str(body))
-
- # Reemplazamos las etiquetas BR y P
- text = re.sub(r'<br\s*/?>|<BR\s*/?>', '\n', text)
- text = re.sub(r'<p>|<P>', '\n\n', text)
- text = re.sub(r'</p>|</P>', '', text)
-
- # Eliminamos el resto de etiquetas HTML
- text = re.sub(r'<[^>]+>', '', text)
-
- # Limpiamos múltiples saltos de línea
- text = re.sub(r'\n\s*\n\s*\n', '\n\n', text)
-
- # Limpiamos espacios en blanco al inicio y final
- body = text.strip()
- number = whatsapp_message.mobile_number
- number = number.replace(' ', '').replace('+','')
- if number.startswith("52") and len(number) == 12:
- number = "521" + number[2:]
- # ENVIO DE MENSAJE
- # Headers de la petición, si es necesario
- headers = {
- "Content-Type": "application/json"
- }
- number = group if group else number + '@c.us'
-
- #$wa::sendMessage("521{$fields_data[$settings['borax_whatsapp_mobile']]}@c.us", ['type' => 'MessageMedia', 'args' => [mime_content_type($file), base64_encode(file_get_contents($file)), $filename, $filesize]], ['caption' => $borax_whatsapp_mensaje]);
- parent_message_id = ''
- if whatsapp_message.mail_message_id and whatsapp_message.mail_message_id.parent_id:
- parent_id = whatsapp_message.mail_message_id.parent_id.wa_message_ids
- if parent_id:
- parent_message_id = parent_id[0].msg_uid
- if attachment:
- payload = {
- "method": "sendMessage",
- "args": [number, {'type': 'MessageMedia', 'args': [attachment.mimetype, base64.b64encode(attachment.raw).decode('utf-8'), attachment.name, attachment.file_size]}, {'caption': body}]
- }
- else:
- payload = {
- "method": "sendMessage",
- "args": [number, body, {}]
- }
- if parent_message_id:
- payload['args'][2]['quotedMessageId'] = parent_message_id
- # Realizando la petición POST
- response = requests.post(url, data=json.dumps(payload), headers=headers)
- # Verificando si la respuesta contiene data->id
- if response.status_code == 200:
- response_json = response.json()
- if "_data" in response_json and "id" in response_json["_data"]:
- _logger.info(f"Petición exitosa. ID: {response_json['_data']['id']['id']}")
- whatsapp_message.write({
- 'state': 'sent',
- 'msg_uid': response_json['_data']['id']['_serialized']
- })
- self._cr.commit()
- else:
- _logger.info("La respuesta no contiene 'data->id'.")
- else:
- _logger.info(f"Error en la petición. Código de estado: {response.status_code}")
- time.sleep(random.randint(3, 7))
|