ESP8266 NodeMCU: отправка сообщений в WhatsApp

В этом руководстве вы узнаете, как отправлять сообщения в свою учётную запись WhatsApp с платы ESP8266 NodeMCU. Это может быть полезно для получения уведомлений от ESP8266 с показаниями датчиков, предупреждающих сообщений, когда показания датчика выше или ниже определённого порога, при обнаружении движения и во многих других приложениях. Мы будем программировать ESP8266 с помощью Arduino IDE, а для отправки сообщений будем использовать бесплатный API под названием CallMeBot.

ESP8266 NodeMCU отправка сообщений в WhatsApp Arduino IDE

У нас есть аналогичное руководство для платы ESP32:

Знакомство с WhatsApp

Логотип WhatsApp

«WhatsApp Messenger, или просто WhatsApp, — это международно доступный американский бесплатный кроссплатформенный централизованный сервис мгновенного обмена сообщениями и передачи голоса по IP, принадлежащий Meta Platforms.» Он позволяет отправлять сообщения, используя интернет-соединение вашего телефона, поэтому вы можете избежать платы за SMS.

WhatsApp бесплатен и доступен для Android и iOS. Установите WhatsApp на свой смартфон, если у вас его ещё нет.

CallMeBot WhatsApp API

Для отправки сообщений в свою учётную запись WhatsApp с ESP8266 мы будем использовать бесплатный API-сервис под названием CallMeBot. Вы можете узнать больше о CallMeBot по следующей ссылке:

По сути, он работает как шлюз, который позволяет отправлять сообщения самому себе. Это может быть полезно для отправки предупреждающих сообщений с ESP8266.

Всю информацию о том, как отправлять сообщения с помощью API, можно найти здесь.

Получение API-ключа CallMeBot

Прежде чем начать использовать API, вам необходимо получить API-ключ CallMeBot для WhatsApp. Следуйте приведённым ниже инструкциям (проверьте эту ссылку для получения инструкций на официальном сайте).

  1. Добавьте номер телефона +34 621 331 709 в свои контакты. (Назовите его как хотите) — пожалуйста, перепроверьте номер на сайте CallMeBot, так как он иногда меняется.

  2. Отправьте следующее сообщение: «I allow callmebot to send me messages» на новый созданный контакт (конечно, через WhatsApp).

  3. Подождите, пока вы не получите сообщение «API Activated for your phone number. Your APIKEY is XXXXXX» от бота.

Получение API-ключа CallMeBot

Примечание: Если вы не получите API-ключ в течение 2 минут, попробуйте снова через 24 часа. Сообщение WhatsApp от бота будет содержать API-ключ, необходимый для отправки сообщений с помощью API.

CallMeBot API

Для отправки сообщения с помощью CallMeBot API вам нужно выполнить POST-запрос на следующий URL (но с вашей информацией):

https://api.callmebot.com/whatsapp.php?phone=[phone_number]&text=[message]&apikey=[your_apikey]
  • [phone_number]: номер телефона, связанный с вашей учётной записью WhatsApp, в международном формате;

  • [message]: сообщение, которое нужно отправить, должно быть URL-закодировано.

  • [your_apikey]: API-ключ, который вы получили в процессе активации в предыдущем разделе.

Для ознакомления с официальной документацией вы можете перейти по следующей ссылке: https://www.callmebot.com/blog/free-api-whatsapp-messages/

Установка библиотеки URLEncode

Как мы видели ранее, сообщение, которое нужно отправить, должно быть URL-закодировано. URL-кодирование преобразует символы в формат, который можно передавать через Интернет. URL-адреса могут быть отправлены через Интернет только с использованием набора символов ASCII.

Это позволит нам включать такие символы, как ç, ª, º, à, ü в наши сообщения. Вы можете узнать больше о URL-кодировании здесь.

Вы можете закодировать сообщение самостоятельно или использовать библиотеку, что гораздо проще. Мы будем использовать библиотеку UrlEncode, которую можно установить в Arduino IDE.

Перейдите в Sketch > Include Library > Manage Libraries и найдите библиотеку URLEncode от Masayuki Sugahara, как показано ниже.

Установка библиотеки URL Encode в Arduino IDE

Отправка сообщений в WhatsApp — код ESP8266

Следующий пример кода отправляет сообщение в вашу учётную запись WhatsApp при первой загрузке ESP8266. Это простой пример, показывающий, как отправлять сообщения. После того как вы поймёте, как это работает, идея состоит в том, чтобы интегрировать его в ваши собственные проекты.

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-send-messages-whatsapp/

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files.

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
*/

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <UrlEncode.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// +international_country_code + phone number
// Portugal +351, example: +351912345678
String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER";
String apiKey = "REPLACE_WITH_API_KEY";

void sendMessage(String message){

  // Data to send with HTTP POST
  String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
  WiFiClient client;
  HTTPClient http;
  http.begin(client, url);

  // Specify content-type header
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");

  // Send HTTP POST request
  int httpResponseCode = http.POST(url);
  if (httpResponseCode == 200){
    Serial.print("Message sent successfully");
  }
  else{
    Serial.println("Error sending the message");
    Serial.print("HTTP response code: ");
    Serial.println(httpResponseCode);
  }

  // Free resources
  http.end();
}

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // Send Message to WhatsAPP
  sendMessage("Hello from ESP8266!");
}

void loop() {

}

Просмотреть исходный код

Как работает код

Отправка сообщения в WhatsApp с помощью CallMeBot API очень проста. Вам просто нужно выполнить HTTP POST-запрос.

Сначала подключите необходимые библиотеки:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <UrlEncode.h>

Вставьте свои сетевые учётные данные в следующие переменные:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Вставьте свой номер телефона и API-ключ. Номер телефона должен быть в международном формате (включая знак +).

String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER";
String apiKey = "REPLACE_WITH_YOUR_API_KEY";

sendMessage()

Мы создаём функцию sendMessage(), которую вы можете вызывать позже для отправки сообщений в WhatsApp. Эта функция принимает в качестве аргумента сообщение, которое вы хотите отправить.

void sendMessage(String message){

Внутри функции мы формируем URL для запроса с вашей информацией, номером телефона, API-ключом и сообщением.

Как мы видели ранее, сообщение должно быть URL-закодировано. Мы подключили библиотеку UrlEncode для этого. Она содержит функцию urlEncode(), которая кодирует любое сообщение, переданное в качестве аргумента (urlEncode(message)).

String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);

Создайте и запустите HTTPClient на этом URL:

HTTPClient http;
http.begin(url);

Укажите тип контента:

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

Наконец, отправьте HTTP POST-запрос. Следующая строка отправляет запрос и сохраняет код ответа:

int httpResponseCode = http.POST(url);

Если код ответа равен 200, это означает, что POST-запрос был успешным. В противном случае что-то пошло не так.

// Send HTTP POST request
int httpResponseCode = http.POST(url);
if (httpResponseCode == 200){
  Serial.print("Message sent successfully");
}
else{
  Serial.println("Error sending the message");
  Serial.print("HTTP response code: ");
  Serial.println(httpResponseCode);
}

Наконец, освободите ресурсы:

// Free resources
http.end();

setup()

В setup() инициализируйте монитор последовательного порта для целей отладки.

Serial.begin(115200);

Подключитесь к вашей локальной сети и выведите IP-адрес платы.

WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());

Затем мы можем отправить сообщение в WhatsApp, просто вызвав функцию sendMessage(). В данном случае мы отправляем сообщение Hello from ESP8266!

// Send Message to WhatsAPP
sendMessage("Hello from ESP8266!");

Демонстрация

После ввода ваших сетевых учётных данных, номера телефона и API-ключа вы можете загрузить код на свою плату.

После загрузки откройте монитор последовательного порта со скоростью передачи данных 115200 бод и нажмите кнопку RST на плате. Она должна успешно подключиться к вашей сети и отправить сообщение в WhatsApp.

ESP8266 отправка сообщения в WhatsApp - монитор последовательного порта

Перейдите в свою учётную запись WhatsApp. Через несколько секунд вы должны получить сообщение от ESP8266.

WhatsApp получение сообщения от ESP8266

Заключение

В этом руководстве вы узнали, как использовать CallMeBot API с ESP8266 для отправки сообщений в свою учётную запись WhatsApp. Это может быть полезно для регулярной отправки показаний датчиков в ваш почтовый ящик, отправки уведомления при обнаружении движения, отправки предупреждающего сообщения, когда показание датчика выше или ниже определённого порога, и во многих других приложениях.

У нас также есть руководства для других типов сообщений (электронная почта и сообщения Telegram):

Мы надеемся, что это руководство окажется для вас полезным.

Узнайте больше о ESP8266 с помощью наших ресурсов:

Спасибо за чтение.