Невозможно запустить WhatsApp на сервисе веб-приложений Azure

Вопросы и ответы

Мне нужна помощь. У меня есть код на 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 может возникать по нескольким причинам:

  1. Неверный токен доступа: Убедитесь, что токен доступа, который вы используете, схож с тем, что работает локально. Даже если вы не видите различий, всегда полезно перечитать и точно проверить.

  2. Различия в окружении: Azure Web App может иметь различные настройки окружения по сравнению с вашим локальным окружением. Убедитесь, что все необходимые переменные окружения были правильно сконфигурированы в Azure.

  3. Проблемы с настройкой .env файла: Azure может не считывать .env файл так же, как это происходит локально. Поэтому необходимо убедиться, что переменные окружения настроены в Azure через портал или Azure CLI.

  4. Проблемы с версией API или правами доступа: Убедитесь, что учетные данные, связанные с вашим приложением на Facebook, имеют соответствующие разрешения для отправки сообщений.

Решения

  1. Проверка токена доступа:

    • Проверьте, что вы используете правильный токен доступа в Azure. Вы можете вывести токен в логах для проверки (убедитесь, что вы не оставляете его в общедоступном доступе).
  2. Настройка переменных окружения:

    • На портале Azure перейдите в настройки вашего Web App.
    • В разделе "Конфигурация" убедитесь, что все переменные окружения, такие как meta_access_token, meta_version, и meta_phone_number_id, настроены и имеют правильные значения.
  3. Логирование ответов и ошибок:

    • Добавьте более детализированное логирование перед отправкой запроса. Это поможет вам понять, что именно отправляется в запросе:
      logging.info(f"URL: {url}")
      logging.info(f"Headers: {headers}")
      logging.info(f"Data: {data}")
  4. Тестирование с использованием Postman или cURL:

    • Используйте инструмент, такой как Postman или cURL, для отправки запроса к API WhatsApp с теми же параметрами, что и в коде, чтобы проверить, действительно ли токен работает.
  5. Флаги и настройки API в Facebook:

    • Убедитесь, что у вашего приложения на Facebook есть необходимые настройки, чтобы разрешить отправку сообщений через WhatsApp. Возможно, вам нужно будет проверить настройки "WhatsApp Business API".
  6. Проверка прав доступа к API:
    • Удостоверьтесь, что токен доступа имеет необходимые разрешения для доступа к WhatsApp, не забывайте, что токены могут иметь ограничения по времени и доступу.

Резюме

После применения всех вышеперечисленных шагов попробуйте отправить сообщение снова. Если ошибка 401 все еще возникает, возможно, стоит пересоздать токен доступа через консоль разработчика Facebook и убедиться, что вы используете его в коде.

Если у вас есть дополнительные вопросы или возникают другие ошибки, пожалуйста, сообщите об этом!

Оцените материал
Добавить комментарий

Капча загружается...