Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Hava Durumu için Web Servisi


Ractamainus

Öne çıkan mesajlar

istediğim lokasyonun hava durumu bilgilerini çekebileceğim, güvenilir ve uptime'ı yüksek (bu önemli), hızlı bir web servisi biliyor musunuz? xml, json.. ne olursa olsun, bir standart olsun da.

mümkünse bedava ama paralıya da razıyım (yani umarım razı ederim). hele bir siz dökülüverin de..

yahu her yer bu konuda web servisi kaynar diye düşünürdüm. bulamadım.

karışıklık olmasın; ben işleyecek veri istiyorum. gadget tarzı bir şey değil.
Link to comment
Sosyal ağlarda paylaş

  • Genel Yönetici
Benim bir openbox menu scriptim vardı vaktinde hazırladığım, dur bir onu bulayım.

(arandı burada)

...

İşte! Scripye kendimce birkaç değişiklik yapmıştım ama neresine hatırlamıyorum, orijinalini de bulamadım şimdi.

gweather.py


#!/usr/bin/python

import sys
import urllib
from string import maketrans
#from xml.sax import make_parser, handler
from xml.sax import handler, parseString
class ElementProcesser(handler.ContentHandler):

def startElement(self, name, attrs):

if name == "city":
print "<separator label='" + attrs[data] + "' />"
elif name == "current_conditions":
print "<separator label='Current condidtions' />"
elif name == "condition":
print "<item label='Weather: " + attrs[data] + "' />"
elif name == "humidity":
print "<item label='" + attrs[data] + "' />"
elif name == "wind_condition":
print "<item label='" + attrs[data] + "' />"
elif name == "day_of_week":
print "<separator label='" + self.getDayOfWeek(attrs[data]) + "' />"

#Celsius
elif name == "temp_c":
print "<item label='Temperature " + attrs[data] + " C' />"
#elif name == "low":
# print "<item label='Minimum " + attrs[data] + " C' />"
#elif name == "high":
# print "<item label='Maximum " + attrs[data] + " C' />"

#Fahrenheit
#elif name == "temp_f":
#print "<item label='Temperature " + attrs[data] + " F' />"
#elif name == "low":
#print "<item label='Minimun " + attrs[data] + " F' />"
#elif name == "high":
#print "<item label='Maximun " + attrs[data] + " F' />"


def endElement(self, name):

if name == "current_conditions":
print "<separator label='Forecast' />"


def startDocument(self):
print '<openbox_pipe_menu>'

def endDocument(self):
print '</openbox_pipe_menu>'

def getDayOfWeek(self,day):

#English
if day == "Mon":
return "Monday"
elif day == "Tue":
return "Tuesday"
elif day == "Wed":
return "Wednesday"
elif day == "Thu":
return "Thursday"
elif day == "Sat":
return "Saturday"
elif day == "Sun":
return "Sunday"

else:
return day

# You should use your local version of google to have the messages in your language and metric system
f = urllib.urlopen("http://www.google.com/ig/api?weather=istanbul")
xml = f.read()
f.close()

#Avoid problems with non english characters
trans=maketrans("xe1xe9xedxf3xfa","aeiou")
xml = xml.translate(trans)

#parser.parse("http://www.google.es/ig/api?weather="+sys.argv[1])
parseString(xml,ElementProcesser())




Umarın işine yarar, xml olarak alıyordu şu sayfadan: http://www.google.com/ig/api?weather=istanbul
Link to comment
Sosyal ağlarda paylaş

firefox'un ubiquity diye bir eklentisi var. burada ctrl + space ile ubiquity açıp "weather x" komutuyla istediğin yerin hava durumunu, rüzgar yönü ve hızını, nem oranın görebilirsin. http://labs.mozilla.com/2008/08/introducing-ubiquity/


browser'dan bağımsız versiyonu için: http://www.launchy.net/
Link to comment
Sosyal ağlarda paylaş

gerge, çok sağol. muhtemelen o servisi kullanacağım. google'ın resmen böyle bir api duyurmaması biraz kıl bir şey.. yarın öbür gün xml'de bir değişiklik olma ihtimali korkutuyor ama.. "google yapmaz yaaa" havalarındayım biraz. yahoo'nun weather api varmış, şimdi baktım ama saçma bir çıktı veriyor. sevmedim.

bu arada google için bir kaç ipucu;
ingilizce ve fahrenheit olarak:
http://www.google.com/ig/api?weather=istanbul,turkey&hl=en-us
ingilizce ve celsius:
http://www.google.com/ig/api?weather=istanbul,turkey&hl=en-gb
türkçe ve celsius:
http://www.google.com/ig/api?weather=istanbul,turkey&hl=tr

gutshot sana da teşekkürler ama aradığım şey ubiquity değil. kendisinden haberdarım zaten =) launchy'i de kullanıyorum ^^
Link to comment
Sosyal ağlarda paylaş

  • Genel Yönetici
Accuweather ile BBC Weather'a bak. Onların da var buna benzer şeyleri. KDE'de ikisini de kullanan plasmoidler var. Sıralarıyla: yaWP ve LCD Weather Station. Belki kaynak kodlarından alarak birşeyler hazırlayabilirsin kendine. Bunlar daha güvenli olabilir, ben KDE 4 çıktığından beri LCD'yi kullanıyorum, daha yüzüstü bırakmadı.
Link to comment
Sosyal ağlarda paylaş


(güneş x ay)²/dünya

formül bu dasaaa ^^

bbc weather, şöyle bir çıktı veriyor. format rss sonuçta, güzel. ama lokasyon isimlerini sorgulayamıyoruz. url içinde numerik olarak biz göndereceğiz (istanbul 74 gibi..). bu yöntemi pek beğenmedim. en azından hala google'ın ki bu konuda daha iyi.

accuweather.com ise api'sini kapalı tutmuş. "süper bir fikrin mi var? bizle iletişim kur" kafalarında.. ilgimi çekmedi açıkçası.

weather.com'a baktım. o da private bir api sağlıyor ama benim reklamımı da göstereceksin diyor. o da ilgimi çekmedi o yüzden.

"bunları deli gibi niye yazıyorsun buraya" demeyin. işi düşenlere kaynak olsun diye. ya da deli diyin ya ne biliyim..
Link to comment
Sosyal ağlarda paylaş

  • 2 hafta sonra ...
google xml'i için bir parser yazmıştım. fonksiyonel olarak tamamen çalışıyor ama bir kaç dil seçeneği falan daha ekleyecektim. ne zamandır öyle bekliyor, bakamadım daha sonra açıkçası. daha fazla bekletmenin bir anlamı yok, ben kullanacağım zaman bir kaç düzenleme daha yaparım. lakin bu haliyle paylaşıyım istedim:

dll şurada: http://madyalman.googlepages.com/GoogleWeather.dll

öncelikle parse ettiği xml şu: http://www.google.com/ig/api?weather=istanbul&hl=tr

kullanımı şöyle:

WeatherReporter wr = new WeatherReporter("İstanbul,turkey");

Console.WriteLine(wr.Information.City);
Console.WriteLine(wr.Current.TempC);
Console.WriteLine(wr.Current.TempF);
Console.WriteLine(wr.Current.Humidity);
Console.WriteLine(wr.Current.Condition);
Console.WriteLine(wr.Current.WindCondition);
Console.WriteLine(wr.Forecasts[0].TempLow);
Console.WriteLine(wr.Forecasts[0].TempHigh); Console.WriteLine(wr.Current.WindConditionConverted);

gibi..

bu da kod:

kaynak kodu

public class WeatherReporter
{
string xmlUrl = @"http://www.google.com/ig/api?weather=";
string xmlError = String.Empty;
ForecastInformation information;
CurrentConditions current;
ForecastConditions temp;
List forecasts;

public ForecastInformation Information
{
get { return information; }
}

public CurrentConditions Current
{
get { return current; }
}

public List Forecasts
{
get { return forecasts; }
}

public string XmlError
{
get { return xmlError; }
}

///
/// Gets weather conditions from Google.
/// Language: Turkish.
/// Unit: Celsius.
///

/// The name of a city like "istanbul" or "istanbul,turkey".
public WeatherReporter(string location)
{
GetWeather(xmlUrl + location + @"&hl=tr");
}

///
/// Gets weather conditions from Google.
/// Unit is dependant to language.
///

/// The name of a city like "istanbul" or "istanbul,turkey".
/// Sets the language of values.
public WeatherReporter(string location, Language lang)
{
GetWeather(GetUrlByLang(location, lang));
}

///
/// Gets weather conditions from Google.
///

///
///
///
public WeatherReporter(string location, Language lang, Unit unit)
{
GetWeather(GetUrlByLang(location, lang), unit);
}

private void GetWeather(string url)
{
GetXmlData(url);
}

private void GetWeather(string url, Unit unit)
{
GetXmlData(url);

if (String.IsNullOrEmpty(XmlError))
{
Unit xmlUnit;
switch (information.UnitSystem)
{
case "SI":
xmlUnit = Unit.SI;
break;
case "US":
xmlUnit = Unit.US;
break;
default:
xmlUnit = Unit.SI;
break;
}

if (xmlUnit != unit)
{
Regex getNumber = new Regex(@"[+-]?d+");
Match matchedNumber = getNumber.Match(current.WindCondition);
current.WindConditionConverted = ConvertVelocityTo(unit, matchedNumber.Value).ToString();

for (int i = 0; i < forecasts.Count; i++)
{
ConvertForecastFields(i, unit);
}
}
}
}

private void GetXmlData(string url)
{
try
{
WebRequest request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse response = request.GetResponse();

string respEncode = response.ContentType.Split('=')[1];
Encoding encode = Encoding.GetEncoding(respEncode);
Stream stream = response.GetResponseStream();
StreamReader sReader = new StreamReader(stream, encode);

string textXml = sReader.ReadToEnd();
XElement root = XElement.Parse(textXml);

var queryInformation = from el in root.Element("weather").Descendants("forecast_information")
select new ForecastInformation
{
City = el.Element("city").Attribute("data").Value,
PostalCode = el.Element("postal_code").Attribute("data").Value,
LatitudeE6 = el.Element("latitude_e6").Attribute("data").Value,
LongitudeE6 = el.Element("longitude_e6").Attribute("data").Value,
ForecastDate = el.Element("forecast_date").Attribute("data").Value,
CurrentDateTime = el.Element("current_date_time").Attribute("data").Value,
UnitSystem = el.Element("unit_system").Attribute("data").Value
};
information = queryInformation.FirstOrDefault();

var queryCurrent = from el in root.Element("weather").Descendants("current_conditions")
select new CurrentConditions
{
Condition = el.Element("condition").Attribute("data").Value,
TempF = el.Element("temp_f").Attribute("data").Value,
TempC = el.Element("temp_c").Attribute("data").Value,
Humidity = el.Element("humidity").Attribute("data").Value,
Icon = el.Element("icon").Attribute("data").Value,
WindCondition = el.Element("wind_condition").Attribute("data").Value
};
current = queryCurrent.FirstOrDefault();

List queryForecast = (from el in root.Element("weather").Descendants("forecast_conditions")
select new ForecastConditions
{
Day = el.Element("day_of_week").Attribute("data").Value,
TempLow = el.Element("low").Attribute("data").Value,
TempHigh = el.Element("high").Attribute("data").Value,
Icon = el.Element("icon").Attribute("data").Value,
Condition = el.Element("condition").Attribute("data").Value
}).ToList();
forecasts = queryForecast;
}
catch (Exception ex)
{
xmlError = ex.ToString();
}
}

private string GetUrlByLang(string location, Language lang)
{
string langValue = String.Empty;
switch (lang)
{
case Language.EnGb:
langValue = "en-gb";
break;
case Language.EnUs:
langValue = "en-us";
break;
case Language.Fr:
langValue = "fr";
break;
case Language.Tr:
langValue = "tr";
break;
}
return xmlUrl + location + @"&hl=" + langValue;
}

private void ConvertForecastFields(int i, Unit unit)
{
temp = forecasts[i];
temp.TempLow = ConvertTemperatureTo(unit, temp.TempLow).ToString();
temp.TempHigh = ConvertTemperatureTo(unit, temp.TempHigh).ToString();
forecasts[i] = temp;
}

private static double ConvertTemperatureTo(Unit unit, string temperature)
{
double convertedTemp = Double.Parse(temperature);
if (unit == Unit.SI)
return Math.Round((convertedTemp - 32) * 5 / 9);
else if (unit == Unit.US)
return Math.Round((convertedTemp * 9 / 5) + 32);
else
return 1000;
}

private static double ConvertVelocityTo(Unit unit, string velocity)
{
double convertedTemp = Double.Parse(velocity);
if (unit == Unit.SI)
return Math.Round(convertedTemp * 1.60934271339163);
else if (unit == Unit.US)
return Math.Round(convertedTemp * 0.621371689);
else
return 1000;
}

public enum Language { EnGb, EnUs, Fr, Tr };
public enum Unit { SI, US };

public struct ForecastInformation
{
public string City;
public string PostalCode;
public string LatitudeE6;
public string LongitudeE6;
public string ForecastDate;
public string CurrentDateTime;
public string UnitSystem;
}

public struct CurrentConditions
{
public string Condition;
public string TempF;
public string TempC;
public string Humidity;
public string Icon;
public string WindCondition;
public string WindConditionConverted;
}

public struct ForecastConditions
{
public string Day;
public string TempLow;
public string TempHigh;
public string Icon;
public string Condition;
}
}



smileys smile upon me
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...