ESP8266 NodeMCU: отправка сообщений в WhatsApp
В этом руководстве вы узнаете, как отправлять сообщения в свою учетную запись WhatsApp с помощью платы ESP8266 NodeMCU. подробно рассмотрим пример программы.
ESP8266 NodeMCU: отправка сообщений в WhatsApp
29.04.2024 в 13:35   1596 7
Версия для печати

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

article-logo

Что такое WhatsApp

whatsapp-logo

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

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

CallMeBot WhatsApp API

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

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

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

Получение КЛЮЧА API CallMeBot

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

  1. Добавьте номер телефона +34 644 31 95 65 к вашим Телефонным контактам. (Назовите это по своему усмотрению);
  2. Отправьте новому созданному Контакту следующее сообщение: “I allow callmebot to send me messages” (с помощью WhatsApp).;
  3. Подождите, пока не получите сообщение “API Activated for your phone number. Your APIKEY is XXXXXX” от бота.

callmebot-api-key

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

CallMeBot API

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

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

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

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

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

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

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

Перейдите в раздел СкетчПодключить библиотекуУправлять библиотеками и найдите библиотеку URLEncode Масаюки Сугахары, как показано ниже.

library-manger

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

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


#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 с помощью API CallMeBot очень проста. Вам просто нужно сделать 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. Номер телефона должен быть в международном формате (включая знак +).


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

Send Message ()

Мы создаем функцию 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.

serial_monitor

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

recive-message

Подведение итогов

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



Источник: https://randomnerdtutorials.com/esp8266-nodemcu-send-messages-whatsapp/
Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Программирование | Добавил: :, (17.12.2022)
Просмотров: 1596 | Комментарии: 7 | Теги: nodemcu, CallMeBot, URLEncode, Arduino IDE, WhatsApp, ESP8266 | Рейтинг: 0.0/0
Поделиться:
Всего комментариев: 7
avatar
0
Михаил • 18:38, 22.02.2023
Здравствуйте. У меня плата Arduino MEGA, использую модуль ESP-01 для связи. Хотелось бы подключить возможность передачи сообщений в WhatsAPP. Использую Ваш скетч, но ругается на библиотеки. Вообще-то всё верно, он и должен ругаться. Вопрос такой: какие библиотеки Вы мне посоветуете подключить в моём варианте подключения?
Заранее спасибо. С уважением, Михаил
PS.Извините, первоначально не в ту тему написал
avatar
0
ALT • 10:22, 24.02.2023
Честно говоря, с такой связкой никогда не работал, но как минимум я бы заменил вот эти библиотеки
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
на
#include <WiFi.h>
#include <HTTPClient.h>
Насколько знаю версии для esp8266 на их основе сделаны. Так что различия в использовании должны быть минимальны
avatar
0
Михаил • 18:41, 24.02.2023
Спасибо большое. Обязательно попробую Ваш совет реализовать. Отпишусь обязательно, вдруг не я один такой...
avatar
0
Михаил • 16:16, 02.03.2023
Попробовал по Вашему совету подключить библиотеки WiFi.h и HTTPClient.h И вот что получилось:
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

#include <b64.h>
#include <ArduinoHttpClient.h>

#include <UrlEncode.h>

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

String phoneNumber = "***********";
String apiKey = "********";

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);

Транслятор изругался на строку HTTPClient http;
Вот такими нехорошими строками:
WhatsAPP_Message.ino: In function 'void sendMessage(String)':
WhatsAPP_Message:22:2: error: 'HTTPClient' was not declared in this scope
WhatsAPP_Message.ino:22:2: note: suggested alternative: 'HttpClient'
WhatsAPP_Message:23:2: error: 'http' was not declared in this scope
exit status 1
'HTTPClient' was not declared in this scope

Пробовал 2 библиотеки: ArduinoHttpClient.h и HttpClient.h
Ругается одинаково...
Может что-нибудь ещё подскажете?
avatar
0
ALT • 17:39, 05.03.2023
Вам же прямым текстом написано

Код
WhatsAPP_Message:22:2: error: 'HTTPClient' was not declared in this scope
WhatsAPP_Message.ino:22:2: note: suggested alternative: 'HttpClient'
Библиотека не знает такой класс как HTTPClient, зато знает класс HttpClient и это скорее всего то, что вам нужно. Регистр букв в Arduino IDE имеет значение
avatar
0
Михаил • 17:58, 06.03.2023
Да, Вы были правы, как только изменил обращение на HttpClient, как ругаться стал совсем по другому ;). Теперь требует указать порт:
HttpClient(Client& aClient, const IPAddress& aServerAddress, uint16_t aServerPort = kHttpPort);
И вот ещё интересные сообщения появились:
WhatsAPP_Message:24:7: error: 'class HttpClient' has no member named 'begin'
WhatsAPP_Message:27:7: error: 'class HttpClient' has no member named 'addHeader'; did you mean 'sendHeader'?
WhatsAPP_Message:30:30: error: 'class HttpClient' has no member named 'POST'
WhatsAPP_Message:41:7: error: 'class HttpClient' has no member named 'end'; did you mean 'read'?
Это вообще для меня тёмный лес...
avatar
0
Михаил • 18:00, 06.03.2023
Да, забыл уточнить, пытался подсунуть стандартный порт 8080, ошибка не ушла, осталось то же сообщение.
avatar