Open lorenzobarrio opened 3 years ago
Hi, in order to get to work on ESP8266 I use the RSA fingerprint method. Something like this: http.begin(serverName+ticker1+token,"74:79:EA:92:97:56:A5:C7:94:9B:2C:DD:97:B4:64:15:4F:23:F7:FF"); //HTTPS fingerprint
I built a whole version of this but for an OLED and an ESP8266 instead, are you interested in seeing that code?
I'm not the initial comment, but I would love to see the ESP8266 version you made.
//This code came from https://github.com/Patrick-E-Rankin/ESP32StockTicker
//Librerias:
AsyncWebServer server(80);
//Token del bot de Telegram que muestra el Botfather.
//Id's de los usuarios que pueden interactuar con el bot. //Es posible verificar su id por el monitor serie al enviar un mensaje al bot. const String validSenderIds[SENDER_ID_COUNT] = {"", ""}; //el primero es el correcto mio, el segundo es Fabio. No poner mas que tarda mucho en evaluar si es correcto. //const String validSenderIds[SENDER_ID_COUNT] = {"***"}; //este es el de David. //Creaci贸n de Objetos //Cliente para conexiones seguras. X509List cert(TELEGRAM_CERTIFICATE_ROOT); // Solo para ESP8266
WiFiClientSecure clienteWiFi; // Crea el objeto client como cliente WiFi seguro.//
//Objeto con los m茅todos para comunicarnos por Telegram. UniversalTelegramBot bot(BOT_TOKEN, clienteWiFi); // Crea el objeto bot para comunicar por WiFi (a traves del objeto client) y el bot de Telegram (con su Token).
//* PONER AQUI DATOS WIFI *****//
const char* WIFI_SSID = "*"; const char WIFI_PASSWORD = ""; String tickerUno = "BNB-EUR"; String tickerDos = "BTC-EUR"; //**//
//Comandos aceptados const String COMIENZO = "/start"; const String BNB_EUR = "馃捁Cotiz.BNB-EUR"; const String BTC_EUR = "馃捁Cotiz.BTC-EUR"; const String ACTALARMA_BNB_MIN = "鈿燨N Aviso BNB Min"; const String ACTALARMA_BTC_MIN = "鈿燨N Aviso BTC Min"; const String ACTALARMA_BNB_MAX = "鈿燨N Aviso BNB Max"; const String ACTALARMA_BTC_MAX = "鈿燨N Aviso BTC Max"; const String CANALARMA_BNB_MIN = "OFF Aviso BNB Min"; const String CANALARMA_BTC_MIN = "OFF Aviso BTC Min"; const String CANALARMA_BNB_MAX = "OFF Aviso BNB Max"; const String CANALARMA_BTC_MAX = "OFF Aviso BTC Max"; const String INFORME = "Informe"; // Otras variables. int contadorAux = 0; uint32_t lastCheckTime = 0; //Tiempo en que fue hecha la 煤ltima comprobaci贸n. String tickerAviso = "Ninguno"; bool tickerMin = false; bool tickerMax = false; String serverName = "https://query1.finance.yahoo.com/v8/finance/chart/"; String token = "?interval=1d"; String ticker1 = "Ninguno";
char displayString[30] = ""; //Busca este string en la cadena que devuelve el get a Yahoo finance: //Hay muchos otros valores que se pueden rescatar como valores al cierre, cierre dia anterior, etc.. char priceString[] = "regularMarketPrice\":"; char endPrice[] = ",\""; const char* PARAM_INPUT_1 = "input1"; const char beforeIndex[] = "<!DOCTYPE HTML>
String valorCotiz; bool alarmaUno = false; bool alarmaDos = false; bool alarmaUnoActiva = false; bool alarmaDosActiva = false;
void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); }
/* Esto solo vale para usar los dos procesadores del ESP32 para pedir informacion y
TaskHandle_t Task1;
*/
void setup() { Serial.begin(115200); /*
clienteWiFi.setCACert(TELEGRAM_CERTIFICATE_ROOT); // A帽ade certificado raiz para api.telegram.org
clienteWiFi.setTrustAnchors(&cert); // A帽ade certificado raiz para api.telegram.org
*/
WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100);
// Esto para ESP8266 // Todo esto es para que ESP8266 funcione sin clientWiFi.SetInsecure() // clienteWiFi.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Para ESP32. A帽ade certificado raiz para api.telegram.org // clienteWiFi.setTrustAnchors(&cert); // Para ESP8266. A帽ade certificado raiz para api.telegram.org
// Huella digital de api.telegram.org: https://www.grc.com/fingerprints.htm // const uint8_t fingerprint[20] = { 0xF2,0xAD,0x29,0x9C,0x34,0x48,0xDD,0x8D,0xF4,0xCF,0x52,0x32,0xF6,0x57,0x33,0x68,0x2E,0x81,0xC1,0x90 }; const uint8_t fingerprint[20] = { 0x74,0x79,0xEA,0x92,0x97,0x56,0xA5,0xC7,0x94,0x9B,0x2C,0xDD,0x97,0xB4,0x64,0x15,0x4F,0x23,0xF70,0xFF}; clienteWiFi.setFingerprint(fingerprint); // Hasta aqu铆 para ESP8266
setupWiFi();
//char text[30]; //String IP = WiFi.localIP().toString();
//Esto solo es para utilizar el otro procesador del ESP32 //strcat(text,IP.c_str()); //memcpy(displayString,text,30); //xTaskCreatePinnedToCore(LEDDisplay,"LedDisplay",1000,NULL,1,&Task1,0); //delay(1000);
//Crea la p谩gina web con el cuestionario para preguntar qu茅 ticker escoger.
//No la uso por estar conectado por telegram
server.on("/", HTTP_GET, [] (AsyncWebServerRequest request){
request->send(200, "text/html", beforeIndex+ticker1+afterIndex);
});
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest request) {
String inputMessage;
String inputParam;
// GET input1 value on
void setupWiFi() { Serial.print("Conectando al SSID: "); Serial.println(WIFI_SSID); // Si es placa EsP8266 hacer cliente no seguro para que funcione la libreria Telegram.
clienteWiFi.setInsecure();
//Inicia en modo ESTACION y se conecta a la red WiFi. //WiFi.setSleepMode(WIFI_NONE_SLEEP); // Solo para ESP8266 WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
// Espera mientras no est茅 conectada la red. long tiempoInicialWifi = millis(); while (WiFi.status() != WL_CONNECTED) { //Serial.print("."); //Serial.println(millis()-tiempoInicialWifi); delay(500); // Si tarda mas de 40 segundos en conectar, se resetea el ESP. if (millis() - tiempoInicialWifi > 50000){ //Serial.println("Se har谩 un Reset"); ESP.restart(); } } WiFi.setAutoReconnect(true); WiFi.persistent(false);
IPAddress ip = WiFi.localIP(); // Aqu铆 pongo la ip de este modo (como array) pues poniendo solo ip en el string, sale mal el por el formato ipaddress. //String mensaje = "Conectado a red: " + (String)WIFI_SSID + ", con IP: " + ip[0] + "." + ip[1] + "." + ip[2] + "." + ip[3]; String mensaje = "Conectado a red: " + (String)WIFI_SSID + ", con IP: " + ip.toString(); //Si lleg贸 aqu铆 est谩 conectado a la red WiFi. //Serial.println(); //Serial.print(mensaje); Serial.println(WiFi.localIP()); bot.sendMessage(validSenderIds[0], mensaje, ""); } void handleNewMessages(int numNuevosMensajes) { for (int i=0; i<numNuevosMensajes; i++) //para cada nuevo mensaje. { String chatId = String(bot.messages[i].chat_id); //id del chat que envia el mensaje. String senderId = String(bot.messages[i].from_id); //id del contacto que envia el mensaje. Serial.println("Id del que envi贸 el mensaje: " + senderId); //muestra en el monitor serie el id de quien envi贸 el mensaje. bool validSender = validaUsuario(senderId); //verifica si es de un remitente de la lista de remitentes v谩lidos. if(!validSender) //si no fuera de un remitente v谩lido. { bot.sendMessage(chatId, "Disculpe pero no tiene permiso para su acceso", "HTML"); //envia mensaje que no posee permiso y vuelve sin hacer nada mas. continue; //continua para la proxima interacci贸n del for (va por el pr贸ximo mensaje, no ejecuta el c贸digo abajo) }
String texto = bot.messages[i].text; //texto que lleg贸.
if (texto.equalsIgnoreCase(COMIENZO))
{
Serial.println("start");
handleComienzo(chatId, bot.messages[i].from_name); //muestra las opciones cuando se abre/se inicia el chat.
}
else if (texto.equalsIgnoreCase(BNB_EUR))
{
handleCotizacion(chatId,tickerUno); //Env铆a cotizaci贸n 1.
String mensaje= "Cotizaci贸n: " + String(displayString);
bot.sendMessage(chatId, mensaje, "");
char displayString[30] = "";
}
else if(texto.equalsIgnoreCase(BTC_EUR))
{
handleCotizacion(chatId,tickerDos); //Env铆a cotizaci贸n 2.
String mensaje= "Cotizaci贸n: " + String(displayString);
bot.sendMessage(chatId, mensaje, "");
char displayString[30] = "";
}
else if(texto.equalsIgnoreCase(ACTALARMA_BNB_MIN))
{
handleActivaAlarmaUnoMin(chatId); //Activa una alarma de valores m铆nimos de BNB-EUR
}
else if(texto.equalsIgnoreCase(ACTALARMA_BTC_MIN))
{
handleActivaAlarmaDosMin(chatId); //Activa una alarma de valores minimos de BTC-EUR
}
else if(texto.equalsIgnoreCase(ACTALARMA_BNB_MAX))
{
handleActivaAlarmaUnoMax(chatId); //Activa una alarma de valores m谩ximos de BNB-EUR
}
else if(texto.equalsIgnoreCase(ACTALARMA_BTC_MAX))
{
handleActivaAlarmaDosMax(chatId); //Activa una alarma de valores m谩ximos de BTC-EUR
}
else if (texto.equalsIgnoreCase(CANALARMA_BNB_MIN))
{
handleCancelaAlarmaUnoMin(chatId); //Cancela la alarma de valores de BNB-EUR
}
else if (texto.equalsIgnoreCase(CANALARMA_BTC_MIN))
{
handleCancelaAlarmaDosMin(chatId); //Cancela las alarma de valores de BTC-EUR
}
else if (texto.equalsIgnoreCase(INFORME))
{
handleInforme(chatId); //Env铆a un informe de las cotizaciones y alarmas.
}
else if (texto.indexOf("B")==0)
{
int longNum = texto.length();
valorMinimo = texto.substring(1,longNum).toInt();
valorMaximo = 0;
String mensaje="Nuevo valor m铆nimo " + String(valorMinimo);
bot.sendMessage(chatId, mensaje,"");
}
else if (texto.indexOf("A")==0)
{
int longNum = texto.length();
valorMaximo = texto.substring(1,longNum).toInt();
valorMinimo = 0;
String mensaje="Nuevo valor m谩ximo " + String(valorMaximo);
bot.sendMessage(chatId, mensaje,"");
}
else
{
//handleNotFound(chatId); //muestra mensaje que la opci贸n no es v谩lida y muestra todas las opciones.
}
} }
void handleCotizacion(String chatId, String ticker1)
{
if((WiFi.status()== WL_CONNECTED) && (ticker1 != "Ninguno")){
//if(WiFi.status()== WL_CONNECTED){
HTTPClient http;
String serverPath = serverName + ticker1 + token;
//Serial.println(serverPath);
//http.begin(serverPath.c_str(),"74:79:EA:92:97:56:A5:C7:94:9B:2C:DD:97:B4:64:15:4F:23:F7:FF");
http.begin(serverPath.c_str());
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
//Serial.print("Codigo Respuesta HTTP: ");
//Serial.println(httpResponseCode);
String payload = http.getString();
int tmp = payload.indexOf(priceString);
int tmp2 = payload.indexOf(endPrice,(tmp+20));
char text[30] = "";
strcat(text,ticker1.c_str());
strcat(text," ");
strcat(text, payload.substring((tmp+20), tmp2).c_str());
strcat(text," ");
memcpy(displayString,text,30);
valorCotiz = payload.substring((tmp+20), tmp2).c_str();
//Serial.println(displayString);
}
else {
Serial.print("Codigo Error: ");
Serial.println(httpResponseCode);
}
http.end();
} }
void handleActivaAlarmaUnoMin(String chatId) { alarmaUno=true; String mensaje = " Se progamar谩 un aviso si el valor baja,para BNB-EUR,de: " + String(valorMinimo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerUno; tickerMin=true; tickerMax=false; alarmaUnoActiva = false; } void handleActivaAlarmaDosMin(String chatId) { alarmaDos=true; String mensaje = " Se progamar谩 un aviso si el valor baja, para BTC-EUR, de: " + String(valorMinimo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerDos; tickerMin=true; tickerMax=false; alarmaUnoActiva = false; }
void handleActivaAlarmaUnoMax(String chatId) { alarmaUno=true; String mensaje = " Se progamar谩 un aviso si el valor sube,para BNB-EUR,de: " + String(valorMaximo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerUno; tickerMax=true; tickerMin=false; alarmaUnoActiva = false; } void handleActivaAlarmaDosMax(String chatId) { alarmaDos=true; String mensaje = " Se progamar谩 un aviso si el valor sube, para BTC-EUR, de: " + String(valorMaximo) + "."; bot.sendMessage(chatId, mensaje, ""); tickerAviso=tickerDos; tickerMax=true; tickerMin=false; alarmaDosActiva = false; }
void handleCancelaAlarmaUnoMin(String ChatId) { alarmaUno=false; alarmaUnoActiva=false; tickerAviso="Ninguno"; tickerMax=false; tickerMin=false; }
void handleCancelaAlarmaDosMin(String ChatId) { alarmaDos=false; alarmaDosActiva=false; tickerAviso="Ninguno"; tickerMax=false; tickerMin=false; }
void handleInforme (String chatId)
{
String mensaje = " 路 Informe situaci贸n 路\n";
handleCotizacion(chatId,"BNB-EUR");
mensaje += "路馃捁Cotiz.BNB-EUR: " + String(valorCotiz) + ".\n";
char displayString[30] = "";
handleCotizacion(chatId,"BTC-EUR");
mensaje += "路馃捁Cotiz.BTC-EUR: " + String(valorCotiz) + ".\n";
mensaje += "路鈿燰alor en observaci贸n: ";
mensaje += tickerAviso + "\n";
mensaje += "路鈿燰alor m铆nimo a: " + String(valorMinimo) + ".\n";
mensaje += "路鈿燰alor m谩ximo a: " + String(valorMaximo) + ".\n";
bot.sendMessage(chatId, mensaje, "");
}
bool validaUsuario(String senderId) { // Para cada id de usuario que puede interactuar con este bot. for(int i=0; i<SENDER_ID_COUNT; i++) { //Si el id del remitente forma parte de los valores dentro del array devolvemos que es v谩lido. if(senderId == validSenderIds[i]) { return true; } } // Si lleg贸 aqu铆 significa que verific贸 todos los id's y no lo encontr贸 en el array. return false; }
void handleComienzo(String chatId, String fromName) { // Muestra Hola y el nombre del contacto seguido de los mensajes v谩lidos. String mensaje = "Hola, " + fromName + ".\n"; mensaje += getCommands(); bot.sendMessage(chatId, mensaje, "HTML"); //Serial.println("Start"); enviaTeclado(chatId); }
String getCommands() { //String con la lista de mensajes que son v谩lidos y explicaci贸n sobre qu茅 hacer. String mensaje = " 路 Los comandos disponibles son:\n\n"; mensaje += "" + BNB_EUR + ": Cotizaci贸n Bicencoin-Euro.\n"; mensaje += "" + BTC_EUR + ": Cotizacion Bitcoin-Euro.\n"; mensaje += "" + ACTALARMA_BNB_MIN + ": 鈿燗ctiva alarmas BNB min.\n"; mensaje += "" + ACTALARMA_BTC_MIN + ": 鈿燗ctiva alarmas BTC min.\n"; mensaje += "" + ACTALARMA_BNB_MAX + ": 鈿燗ctiva alarmas BNB max.\n"; mensaje += "" + ACTALARMA_BTC_MAX + ": 鈿燗ctiva alarmas BTC max.\n"; mensaje += "" + CANALARMA_BNB_MIN + ": Cancela alarmas BNB min.\n"; mensaje += "" + CANALARMA_BTC_MIN + ": Cancela alarmas BTC min.\n"; mensaje += "" + INFORME + ": Informe Global.\n"; mensaje += "Para activar un valor m铆nimo escribe 'B' seguido del valor que desees m铆nimo.\n"; return mensaje; }
void compruebaValoresAlarmas(String chatId, String tickerAviso)
{
if (tickerMin){
handleCotizacion(chatId, tickerAviso);
if (tickerAviso == tickerUno){
if (alarmaUno && !alarmaUnoActiva){
if (valorCotiz.toInt() <= valorMinimo){
//Serial.println("minimo");
String mensaje = "鈿燗larma de valor m铆nimo BNB-EUR";
bot.sendMessage(chatId, mensaje,"");
alarmaUnoActiva=true;
}
}
}
if (tickerAviso == tickerDos){
if (alarmaDos && !alarmaDosActiva){
if (valorCotiz.toInt() <= valorMinimo){
String mensaje = "鈿燗larma de valor m铆nimo BTC-EUR";
bot.sendMessage(chatId, mensaje,"");
alarmaDosActiva= true;
}
}
}
}
if (tickerMax){
handleCotizacion(chatId, tickerAviso);
if (tickerAviso == tickerUno){
if (alarmaUno && !alarmaUnoActiva){
if (valorCotiz.toInt() >= valorMaximo){
//Serial.println("maximo");
String mensaje = "鈿燗larma de valor m谩ximo BNB-EUR";
bot.sendMessage(chatId, mensaje,"");
alarmaUnoActiva=true;
}
}
}
if (tickerAviso == tickerDos){
if (alarmaDos && !alarmaDosActiva){
if (valorCotiz.toInt() >= valorMaximo){
String mensaje = "鈿燗larma de valor m谩ximo BTC-EUR";
bot.sendMessage(chatId, mensaje,"");
alarmaDosActiva= true;
}
}
}
}
}
void loop() {
// Comprueba si la WiFi est谩 activa, sino la reconecta. Si tarda mas de 200 vueltas de programa sin reconectar, reinicia ESP. if((WiFi.status() !=WL_CONNECTED) && (contadorAux<200)){ //Serial.print("Wifi desconectada"); //Serial.println(contadorAux++); contadorAux++; WiFi.reconnect(); delay(3000); } if ((WiFi.status() !=WL_CONNECTED) && (contadorAux>=300)){ //Serial.println("Se har谩 un Reset"); ESP.restart(); } if ((WiFi.status() == WL_CONNECTED) && (contadorAux>0)){ contadorAux = 0; //Serial.println("Wifi CONECTADA"); }
// Esto era para que al reiniciarse envie el teclado de botones pero para eso ya est谩 la funcion /start. / if (inicio){ enviaTeclado(); inicio=false; } /
//Tiempo ahora desde el inicio. uint32_t ahora = millis(); //Si el tiempo pasado desde la 煤ltima comprobaci贸n fue mayor que el intervalo establecido. if (ahora - lastCheckTime > intervalo1Seg) { //Coloca el tiempo de 煤ltima comprobaci贸n como actual y comprueba si hay mensajes nuevos. lastCheckTime = ahora; int numNuevosMensajes = bot.getUpdates(bot.last_message_received + 1); handleNewMessages(numNuevosMensajes); //Serial.print("nuevos mensajes:"); //Serial.print(numNuevosMensajes); } if (alarmaUno || alarmaDos){ compruebaValoresAlarmas(validSenderIds[0], tickerAviso); } }
void enviaTeclado(String chatId) { // sendMessageWithReplyKeyboard botones debajo de zona de escritura. String keyboardJson = "[[\"馃捁Cotiz.BNB-EUR\",\"馃捁Cotiz.BTC-EUR\"],"; keyboardJson += "[ \"鈿燨N Aviso BNB Min\", \"鈿燨N Aviso BTC Min\" ],"; keyboardJson += "[ \"鈿燨N Aviso BNB Max\", \"鈿燨N Aviso BTC Max\" ],"; keyboardJson += "[ \"OFF Aviso BNB\", \"OFF Aviso BTC\" ],"; keyboardJson += "[ \"Informe\"]]"; bot.sendMessageWithReplyKeyboard(chatId, "Selecciona tu petici贸n:", "", keyboardJson, true); }
Well it looks like the RSA fingerprint was updated. But here it is @lorenzobarrio and @eqamppp https://github.com/Patrick-E-Rankin/ESP8266-STOCK-CRYPTO-OLED
The code works perfectly in ESP32. I did it changes and creates another with Telegram instead LED matrix, and it works really good. As you say it is simple but it works. Normally I use Telegram with ESP8266 with WiFi.Insecure, but in this case, yahoo needs https that I think is my problem!!. If I use it doesnt work the GET metoth in yahoo, and if I use WiFisecure with a hipotetic cert, doesnt work the connection with Telegram.....Someone has something in his mind to solve this situation!!!! Good day!!