Skip to content

Commit

Permalink
Merge pull request shridarpatil#32 from chechani/master
Browse files Browse the repository at this point in the history
PR for capturing Media Files in Incoming Messages
  • Loading branch information
shridarpatil authored Jun 20, 2023
2 parents 8b5bbb0 + 8f4296f commit fb3cbf6
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
"fieldname": "content_type",
"fieldtype": "Select",
"label": "Content Type",
"options": "\ntext\ndocument"
"options": "\ntext\ndocument\nimage\nvideo\naudio"
},
{
"fieldname": "attach",
Expand All @@ -98,7 +98,7 @@
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2023-03-20 16:07:35.445697",
"modified": "2023-06-15 11:47:06.542923",
"modified_by": "Administrator",
"module": "Frappe Whatsapp",
"name": "WhatsApp Message",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2023-02-23 11:47:47.742678",
"modified": "2023-06-18 20:58:17.268533",
"modified_by": "Administrator",
"module": "Frappe Whatsapp",
"name": "WhatsApp Settings",
Expand Down
182 changes: 114 additions & 68 deletions frappe_whatsapp/utils/webhook.py
Original file line number Diff line number Diff line change
@@ -1,93 +1,139 @@
"""Webhook."""
import frappe
import json

import requests
import time
from frappe.utils import get_site_name
from werkzeug.wrappers import Response
import frappe.utils

settings = frappe.get_doc(
"WhatsApp Settings", "WhatsApp Settings",
)
token = settings.get_password("token")
url = f"{settings.url}/{settings.version}/"
bench_location = frappe.utils.get_bench_path()
site_name = get_site_name(frappe.local.request.host)

@frappe.whitelist(allow_guest=True)
def webhook():
"""Meta webhook."""
if frappe.request.method == "GET":
return get()
return post()
"""Meta webhook."""
if frappe.request.method == "GET":
return get()
return post()


def get():
"""Get."""
hub_challenge = frappe.form_dict.get("hub.challenge")
webhook_verify_token = frappe.db.get_single_value(
"Whatsapp Settings", "webhook_verify_token"
)

if frappe.form_dict.get("hub.verify_token") != webhook_verify_token:
frappe.throw("Verify token does not match")
"""Get."""
hub_challenge = frappe.form_dict.get("hub.challenge")
webhook_verify_token = frappe.db.get_single_value(
"Whatsapp Settings", "webhook_verify_token"
)

return Response(hub_challenge, status=200)
if frappe.form_dict.get("hub.verify_token") != webhook_verify_token:
frappe.throw("Verify token does not match")

return Response(hub_challenge, status=200)

def post():
"""Post."""
data = frappe.local.form_dict
frappe.get_doc({
"doctype": "WhatsApp Notification Log",
"template": "Webhook",
"meta_data": json.dumps(data)
}).insert(ignore_permissions=True)

messages = []
try:
messages = data["entry"][0]["changes"][0]["value"].get("messages", [])
except KeyError:
messages = data["entry"]["changes"][0]["value"].get("messages", [])

if messages:
for message in messages:
if message['type'] == 'text':
frappe.get_doc({
"doctype": "WhatsApp Message",
"type": "Incoming",
"from": message['from'],
"message": message['text']['body']
}).insert(ignore_permissions=True)
else:
changes = None
try:
changes = data["entry"][0]["changes"][0]
except KeyError:
changes = data["entry"]["changes"][0]
update_status(changes)
return
"""Post."""
data = frappe.local.form_dict
frappe.get_doc({
"doctype": "WhatsApp Notification Log",
"template": "Webhook",
"meta_data": json.dumps(data)
}).insert(ignore_permissions=True)

messages = []
try:
messages = data["entry"][0]["changes"][0]["value"].get("messages", [])
except KeyError:
messages = data["entry"]["changes"][0]["value"].get("messages", [])

if messages:
for message in messages:
message_type = message['type']
if message_type == 'text':
frappe.get_doc({
"doctype": "WhatsApp Message",
"type": "Incoming",
"from": message['from'],
"message": message['text']['body']
}).insert(ignore_permissions=True)
elif message_type in ["image", "audio", "video", "document"]:
media_id = message[message_type]["id"]
headers = {
'Authorization': 'Bearer ' + token

}
response = requests.get(f'{url}{media_id}/', headers=headers)

if response.status_code == 200:
media_data = response.json()
media_url = media_data.get("url")
mime_type = media_data.get("mime_type")
file_extension = mime_type.split('/')[1]

media_response = requests.get(media_url, headers=headers)
if media_response.status_code == 200:
file_data = media_response.content

file_path = f"{bench_location}/sites/{site_name}/public/files/"

file_name = f"{frappe.generate_hash(length=10)}.{file_extension}"
file_full_path = file_path + file_name

with open(file_full_path, "wb") as file:
file.write(file_data)

time.sleep(1)

frappe.get_doc({
"doctype": "WhatsApp Message",
"type": "Incoming",
"from": message['from'],
"message": f"/files/{file_name}",
"attach" : f"/files/{file_name}",
"content_type" : message_type
}).insert(ignore_permissions=True)
else:
changes = None
try:
changes = data["entry"][0]["changes"][0]
except KeyError:
changes = data["entry"]["changes"][0]
update_status(changes)
return


def update_status(data):
"""Update status hook."""
if data.get("field") == "message_template_status_update":
update_template_status(data['value'])
"""Update status hook."""
if data.get("field") == "message_template_status_update":
update_template_status(data['value'])

elif data.get("field") == "messages":
update_message_status(data['value'])
elif data.get("field") == "messages":
update_message_status(data['value'])


def update_template_status(data):
"""Update template status."""
frappe.db.sql(
"""UPDATE `tabWhatsApp Templates`
SET status = %(event)s
WHERE id = %(message_template_id)s""",
data
)
"""Update template status."""
frappe.db.sql(
"""UPDATE `tabWhatsApp Templates`
SET status = %(event)s
WHERE id = %(message_template_id)s""",
data
)


def update_message_status(data):
"""Update message status."""
id = data['statuses'][0]['id']
status = data['statuses'][0]['status']
conversation = data['statuses'][0].get('conversation', {}).get('id')
name = frappe.db.get_value("WhatsApp Message", filters={"message_id": id})

doc = frappe.get_doc("WhatsApp Message", name)
doc.status = status
if conversation:
doc.conversation_id = conversation
doc.save(ignore_permissions=True)
"""Update message status."""
id = data['statuses'][0]['id']
status = data['statuses'][0]['status']
conversation = data['statuses'][0].get('conversation', {}).get('id')
name = frappe.db.get_value("WhatsApp Message", filters={"message_id": id})

doc = frappe.get_doc("WhatsApp Message", name)
doc.status = status
if conversation:
doc.conversation_id = conversation
doc.save(ignore_permissions=True)

0 comments on commit fb3cbf6

Please sign in to comment.