Как получать события webhooks в django?
У меня зарегистрирован webhook и есть php-файл, который получает сообщение и сбрасывает его в текстовый файл. Я хочу добиться того же самого в django, но функция никогда не вызывается, когда событие срабатывает
код php ''
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = file_get_contents('php://input');
$data = json_decode($input, true);
file_put_contents('messages_log.txt', print_r($data, true), FILE_APPEND);
$formatted_output = '';
$timestamp = date('d-M-Y-H:i');
if (isset($data['data']['message']['body_message']['content']) && !empty($data['data']['message']['body_message']['content'])) {
$content = $data['data']['message']['body_message']['content'];
$from_contact = isset($data['data']['message']['from_contact']) ? $data['data']['message']['from_contact'] : 'Unknown';
$formatted_output = sprintf("%s :: %s --> %s", $timestamp, $from_contact, $content);
} else {
$messages = isset($data['data']['data']['messages'][0]) ? $data['data']['data']['messages'][0] : null;
if ($messages) {
$message = isset($messages['message']) ? $messages['message'] : [];
$content = isset($message['conversation']) ? $message['conversation'] : '';
$from_contact = isset($messages['verifiedBizName']) ? $messages['verifiedBizName'] : '';
if (!empty($content) && !empty($from_contact)) {
$formatted_output = sprintf("%s :: %s --> %s", $timestamp, $from_contact, $content);
}
}
}
if (!empty($formatted_output)) {
file_put_contents('formatted
_messages_log.txt', $formatted_output . PHP_EOL, FILE_APPEND);
}
http_response_code(200);
echo json_encode(['status' => 'received']);
} else {
http_response_code(405);
echo json_encode(['status' => 'Method Not Allowed']);
}
?>
'''
Всякий раз, когда я получаю или отправляю сообщение из whatsapp, оно попадает сюда в "messages_log.txt"
Код django на языке Python (views.py)
import os
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
@csrf_exempt # Exempt from CSRF checks as it's a webhook
def home(request):
with open('jimmy', 'w') as file:
file.write(f"acid\n")
if request.method == 'POST':
raw_data = request.body.decode('utf-8')
try:
data = json.loads(raw_data)
except json.JSONDecodeError:
return JsonResponse({'status': 'Invalid JSON'}, status=400)
file_path = os.path.join(os.getcwd(), 'messages_log.txt')
with open(file_path, 'a') as file:
file.write(f"{json.dumps(data, indent=4)}\n")
return JsonResponse({'status': 'received'}, status=200)
# Respond with a 405 Method Not Allowed for non-POST requests
return JsonResponse({'status': 'Method Not Allowed'}, status=405)
Он никогда не получал никаких событий Whatsapp. Я попробовал отправить материал вручную по url. вот так
import requests
import json
url = 'test' # Replace with your actual URL
# Sample JSON payload to simulate the webhook event
payload = {
"data": {
"message": {
"body_message": {
"content": "This is a test message"
},
"from_contact": "Test Contact"
},
"data": {
"messages": [
{
"message": {
"conversation": "Fallback message content"
},
"verifiedBizName": "Test Business"
}
]
}
}
}
json_payload = json.dumps(payload)
response = requests.post(url, headers={'Content-Type': 'application/json'}, data=json_payload)
print(f"Status Code: {response.status_code}")
try:
response_json = response.json()
print(f"Response JSON: {response_json}")
except requests.exceptions.JSONDecodeError:
print("Response content is not JSON:")
print(response.text)
Вы получаете сообщение, но само событие Whatsapp не получает. Php получает сообщение и полученное сообщение выглядит следующим образом
Array
(
[instance_id] => XXXXXXXXXXXXX
[data] => Array
(
[event] => contacts.update
[data] => Array
(
[0] => Array
(
[id] => 123123123@s.whatsapp.net
[imgUrl] => changed
)
)
)
Не знаю, почему я не могу получить Whatsapp даже на python
Это был довольно странный опыт
Для регистрации вебхука компании необходимо зарегистрировать URL таким образом
Так что для PHP-сайта я заменил эту часть "https%3A%2F%2Fwebhook.site%2F" на свой php-сайт, и он заработал.
Я связался со службой поддержки, и они сказали, что для django вам нужно создать url вашего сайта со слизью "1b25464d6833784f96eef4xxxxxxxx", например mywebiste.com/webhook/1b25464d6833784f96eef4xxxxxxxxxx, чтобы он работал, тогда как в php это просто mywebsite.com/webhook.php