Nodemcu Namaz Vakitlerini Çekme | namaz vakitleri api

 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 :

{"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}
İ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.


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.


Yorumlar

Bu blogdaki popüler yayınlar

Arduino DHT11 Kullanımı - Arduino Kod - Arduino Termometre yapımı

Arduino ile voltaj okuma | Arduino ile voltmetre | Arduino ADC örnek Kod

Arduino Oled Ekran Kullanımı | SSD1306 Detaylı Tüm Fonksiyonlar

Arduino 16x2 (2x16) LCD Ekran Kullanımı | 4bit parallel mode - 16x2 LCD ekran pin bağlantıları

Arduino ile Yüksek Voltaj Ölçme | SMPS DC Bara Ölçümü

Arduino UNO güç özellikleri

Arduino LM35 Sıcaklık Sensörü İle Sıcaklık Ölçme

16x2 Lcd Türkçe Karakter Sorunu Çözüldü! Arduino LCD ekrana yazı yazma - Arduino 16x2 Lcd ekran kullanımı

Arduino Röle Modül Kullanımı

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma