Nodemcu (esp8266) ile İnternetten Namaz Vakitlerini Çekme
Nodemcu ile nesnelerin interneti projelerinde yeni bir yazıdan herkese merhaba, İnternetten namaz vakitlerini çekebileceğimiz bir api servisi mevcut, biraz uğraştırıcı oldu ama api'yi nodemcu 'ya da çalıştırabildim. Uğraştırıcı olmasının nedeni api 'yi kullanırken bir cookie set etmek gerekiyor olması, neyseki bu sayede nodemcu ile cookie kullanımına da bir örnek niteliğinde olacak bu yazı.
Servisimiz https://www.namazvakitleri.site adresinde yer alıyor, web sitesine girdiğinizde footer (web sitenin en alt kısmında yer alan link barı) linklerinden web api sayfasına ulaşabilirsiniz. Kısa bir kayıt işleminden sonra api-key'imiz mail adresimize ulaşıyor ve hemen kullanmaya başlayabiliyoruz.
Namazvakitleri api de iki tane servis mevcut biri, Türkiye iller listesini veren api servisi, ihtiyacınız olursa onu da kullanabilirsiniz, diğeri de api parametreleriyle belirlenen ile ait sorgunun yapıldığı gün tarihli ezan vakitlerini döndüren api servisi. Sonuçlar json formatında dönüyor, yani yine projemizde Arduino_json kütüphanesini kullanıyor olacağız. Ayrıca websitesinde slowAES koruması olduğu için test cookie bypass için slowAES kütüphanesini Arduino library manager ile indirmeniz gerekiyor.
Eğer servise kayıt olup api-key 'inizi aldıysanız devam edelim, apiyi browserda test edip api-key 'imizin çalıştığından emin oluyoruz, sitede belirtildiğine göre izlenmesi gereken url şu şekilde olmalı :
http://www.namazvakitleri.site/api/api.php?api=vakitler&il=istanbul&api-key=apikeyiniz
apikeyiniz ifadesini epostayla size ulaşan api-key ile değiştirin, görmeniz gereken sonuç şu şekilde :
İl isimlerini girerken türkçe karakter kullanmadan küçük harflerle yazmak gerekiyor, mesela Ağrı için agri, Afyon, afyonkarahisar, kahramanmaras, balikesir gibi..ActiveTimeIndex değeri sunucu saatine göre -Türkiye saatine ayarlanmış- sorgunun yapıldığı anda hangi vakit içerisindeyiz onun sayısal değerini veriyor; imsak için 1, yatsi için 6 değeri geliyor.{"imsak":"06:50:00","gunes":"08:21:00","ogle":"13:17:00","ikindi":"15:41:00","aksam":"18:03:00","yatsi":"19:28:00","tarih":"2023-01-13","iladienqs":"istanbul","activeTimeIndex":6}
Koda gelecek olursak şu şekilde olacak :
/** * @file infinityFree.ino * @author Hakan ÖZMEN (hakkanr@gmail.com) * @brief * the website given this example is hosted on InfinityFree Servers * You can use this example any of website hosted on InfinityFree. * This example get praytimes for Turkey/Istanbul city, * * You should get an apikey from web site by registering apikey form: * http://www.namazvakitleri.site/api/apireg.php * * when you've got an e-mail which contains your api key, put your * apiKey below. For more details about using api please visit : * http://www.namazvakitleri.site/api/index.php * * @version 1.0.0 * @date 2023-02-05 * * @section for more information please visit : * https://www.devrelerim.com/2023/01/nodemcu-namaz-vakitlerini-cekme.html * https://www.youtube.com/HakkanR * https://github.com/HakkanR/slowAES * * @copyright BDS License, all above text must be included any redistribution. * */ #include <Arduino.h> #include <slowAES.h> #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <Arduino_JSON.h> const char *ssid = ""; // Wifi SSID const char *pwd = ""; // Wifi password String apiKey = ""; //apiKey String web = "http://www.namazvakitleri.site/api/api.php?api=vakitler&api-key=" + apiKey + "&il=istanbul"; HTTPClient http; WiFiClient wfc; void setup() { Serial.begin(115200); Serial.print(ssid); Serial.println(" connecting."); WiFi.begin(ssid, pwd); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(" connected."); http.begin(wfc, web); int httpCode = http.GET(); Serial.println(httpCode); String payload = http.getString(); /* getting abc vars */ int loc = payload.indexOf("var a=toNumbers("); String temp = payload.substring(loc, temp.length()); temp.replace("var a=toNumbers(\"", ""); String a = temp.substring(0, 32); temp.replace(a + "\"),b=toNumbers(\"", ""); String b = temp.substring(0, 32); temp.replace(b + "\"),c=toNumbers(\"", ""); String c = temp.substring(0, 32); uint8_t aNums[16]; uint8_t bNums[16]; uint8_t cNums[16]; toNumbers(a.c_str(), aNums); toNumbers(b.c_str(), bNums); toNumbers(c.c_str(), cNums); uint8_t finalCookie[33]; slowAES _slowAES; uint8_t resNums[16]; _slowAES.decrypt(cNums, aNums, bNums, resNums); toHex(resNums, finalCookie); String str = (char *)finalCookie; web = web + "&i=1"; Serial.println(web); http.begin(wfc, web); String fullCookieStr = "__test=" + str; http.addHeader("Cookie", fullCookieStr, true); http.addHeader("Host", "www.namazvakitleri.site", true); http.addHeader("Connection", "Keep-Alive", true); httpCode = http.GET(); Serial.println(httpCode); payload = http.getString(); Serial.println(payload); // and parse the JSON JSONVar jsonData = JSON.parse(payload); if (JSON.typeof(jsonData) == "undefined") { Serial.println("Json data ayıklanamadı."); return; } String imsak = (const char*)(jsonData["imsak"]); String gunes = (const char*)(jsonData["gunes"]); String ogle = (const char*)(jsonData["ogle"]); String ikindi = (const char*)(jsonData["ikindi"]); String aksam = (const char*)(jsonData["aksam"]); String yatsi = (const char*)(jsonData["yatsi"]); Serial.print("imsak : "); Serial.println(imsak); Serial.print("gunes : "); Serial.println(gunes); Serial.print("ogle : "); Serial.println(ogle); Serial.print("ikindi : "); Serial.println(ikindi); Serial.print("aksam : "); Serial.println(aksam); Serial.print("yatsi : "); Serial.println(yatsi); delay(1000000); } void loop() { // nothing goes here! }
Kafanıza takılan herhangi bir şeyi yorumlarda sorabilirsiniz, herkese kolay gelsin.