Мне нужна помощь. У меня есть код на Python, который отправляет шаблонное сообщение в WhatsApp для подтверждения определенной рутины. Код работает хорошо локально или через Dockerfile (по локальному хосту), но не работает, когда я загружаю его в контейнер веб-приложения Azure.
Я получаю ошибку 401 “неавторизовано”. Это странно, поскольку я использую тот же ключ (локально сохраненный в .env и в модуле учетных данных на веб-приложениях Azure).
Мне не совсем ясно, в чем проблема. Я отправил тот же код в Azure Repo через Git. Код точно такой же, как и в моем VS Code.
Я просмотрел все мета-документации, но не смог найти никаких проблем, касающихся дополнительных настроек для служб веб-приложений Azure.
Сообщение об ошибке:
2024-09-16T01:13:44.2660099Z ERROR:root:Запрос не удался из-за: 401 Client Error: Unauthorized for url: https://graph.facebook.com/v20.0/42XXXXXXXX04/messages {добавлены XXX вручную по соображениям безопасности}.
Вот мой код (я использую пример “hello world” для справки. Мой код использует свой собственный пользовательский шаблон, который работает хорошо. Этот шаблон по умолчанию также не работает в веб-приложении Azure):
def get_text_message_input_template(recipient_number):
return json.dumps(
{
"messaging_product": "whatsapp",
"to": recipient_number,
"type": "template",
"template": {
"name": "hello_world",
"language": {"code": "en_US"}
}
}
)
def send_message_whatsapp(data):
current_function = inspect.currentframe().f_code.co_name
logging.info(current_function)
auth = f'Bearer {connection_keys.meta_access_token}'
headers = {
"Authorization": auth,
"Content-Type": "application/json"
}
url = f"https://graph.facebook.com/{connection_keys.meta_version}/{connection_keys.meta_phone_number_id}/messages"
try:
response = requests.post(
url, data=data, headers=headers, timeout=10
) # 10 секунд тайм-аут в качестве примера
response.raise_for_status() # Вызывает HTTPError, если HTTP-запрос вернул код состояния, неуспешный
except requests.Timeout:
logging.error("Произошел тайм-аут при отправке сообщения")
print(f'Ошибка WhatsApp {e}')
return jsonify({"status": "error", "message": "Тайм-аут запроса"}), 408
except (
requests.RequestException
) as e: # Это перехватит любое общее исключение запроса
logging.error(f"Запрос не удался из-за: {e}")
print(f'Ошибка WhatsApp {e}')
return jsonify({"status": "error", "message": "Не удалось отправить сообщение"}), 500
else:
# Обработка ответа как обычно
log_http_response(response)
return response
Ответ
Конечно! Вот полное решение вашей проблемы с отправкой сообщений WhatsApp из Azure Web App Service.
Причины возникновения ошибки 401 Unauthorized
Ошибка 401 Unauthorized может возникать по нескольким причинам:
-
Неверный токен доступа: Убедитесь, что токен доступа, который вы используете, схож с тем, что работает локально. Даже если вы не видите различий, всегда полезно перечитать и точно проверить.
-
Различия в окружении: Azure Web App может иметь различные настройки окружения по сравнению с вашим локальным окружением. Убедитесь, что все необходимые переменные окружения были правильно сконфигурированы в Azure.
-
Проблемы с настройкой .env файла: Azure может не считывать .env файл так же, как это происходит локально. Поэтому необходимо убедиться, что переменные окружения настроены в Azure через портал или Azure CLI.
- Проблемы с версией API или правами доступа: Убедитесь, что учетные данные, связанные с вашим приложением на Facebook, имеют соответствующие разрешения для отправки сообщений.
Решения
-
Проверка токена доступа:
- Проверьте, что вы используете правильный токен доступа в Azure. Вы можете вывести токен в логах для проверки (убедитесь, что вы не оставляете его в общедоступном доступе).
-
Настройка переменных окружения:
- На портале Azure перейдите в настройки вашего Web App.
- В разделе "Конфигурация" убедитесь, что все переменные окружения, такие как
meta_access_token
,meta_version
, иmeta_phone_number_id
, настроены и имеют правильные значения.
-
Логирование ответов и ошибок:
- Добавьте более детализированное логирование перед отправкой запроса. Это поможет вам понять, что именно отправляется в запросе:
logging.info(f"URL: {url}") logging.info(f"Headers: {headers}") logging.info(f"Data: {data}")
- Добавьте более детализированное логирование перед отправкой запроса. Это поможет вам понять, что именно отправляется в запросе:
-
Тестирование с использованием Postman или cURL:
- Используйте инструмент, такой как Postman или cURL, для отправки запроса к API WhatsApp с теми же параметрами, что и в коде, чтобы проверить, действительно ли токен работает.
-
Флаги и настройки API в Facebook:
- Убедитесь, что у вашего приложения на Facebook есть необходимые настройки, чтобы разрешить отправку сообщений через WhatsApp. Возможно, вам нужно будет проверить настройки "WhatsApp Business API".
- Проверка прав доступа к API:
- Удостоверьтесь, что токен доступа имеет необходимые разрешения для доступа к WhatsApp, не забывайте, что токены могут иметь ограничения по времени и доступу.
Резюме
После применения всех вышеперечисленных шагов попробуйте отправить сообщение снова. Если ошибка 401 все еще возникает, возможно, стоит пересоздать токен доступа через консоль разработчика Facebook и убедиться, что вы используете его в коде.
Если у вас есть дополнительные вопросы или возникают другие ошибки, пожалуйста, сообщите об этом!