در مطلب قبلی در مورد خواندن داده های به فرمت json صحبت کردیم و توضیح دادیم که چگونه از url داده های به فرمت json را بخوانیم و پردازش کنیم. در این مطلب می خواهیم از طریق api متن باز سایت OpenWeather، وضعیت اب و هوا را بر اساس نام شهر، پیدا کنیم. اولین کاری که باید انجام دهید، ثبت نام در سایت OpenWeather.org است. پس از آن باید از طریق این لینک درخواست API KEY کنید. از این API KEY درون برنامه برای انجام احراز هویت (Authentication) استفاده می شود.

OpenWeather.org اطلاعات مختلفی از وضعیت آب و هوا را در اختیار کاربران قرار می دهد و می توانیم از طریق اطلاعات مختلفی مانند نام شهر (Tehran) یا نام شهر و کد کشور (Tehran,Ir) و یا از طریق طول و عرض جغرافیایی (longitude and latitude) می توانیم اطلاعات را بدست آوریم. در صفحه API های سایت می توانید انواع اطلاعات قابل بدست آمدن در مورد وضعیت آب و هوا را ببینید. در این مطلب می خواهیم بر اساس نام شهر، وضعیت فعلی آب و هوا (current weather data) را پیدا کنیم، پس باید به این لینک بروید.

مطابق شکل زیر در صفحه وضعیت فعلی آب و هوا می بینید که می توانیم از روش های مختلفی مانند نام شهر، شناسه (یا ID) شهر و ناحیه جغرافیایی، وضعیت فعلی آب و هوا را پیدا کنیم. همچنین همانطور که در شکل زیر می بینید برای هر نوع از این روش ها یک لینک با رشته کوئری هایی منحصر به فرد وجود دارد. به طور مثال برای دریافت از طریق نام شهر، باید از لینک زیر استفاده کنید. نکته مهمی که وجود دارد این است که حتما باید API KEY دریافتی را از طریق کلید appid به تمامی لینک ها اضافه شود، پس فرمت کلی لینک دریافت وضعیت آب و هوا از طریق نام شهر به یکی از صورت های زیر خواهد بود.

خواندن داده های وضعیت آب و هوا گام اول آماده سازی لینک دریافت داده های وضعیت آب و هوا است که به فرمت json نمایش داده می شوند. به طور مثال فرض کنید می خواهیم وضعیت فعلی شهر تهران را بدست آوریم پس با توجه به اولین فرمت لینک بالا و با در اختیار داشتن API KEY باید لینک را به صورت زیر آماده کنیم. لطفا به جای YOUR_API_KEY رشته API KEY خودتان را جایگزین کنید.

کد زیر نمونه ای از داده های برگشتی برای شهر تهران را نشان می دهد. همانطور که می بینید اطلاعات مختلفی نشان داده می شود که ما در حد این مطلب تنها وضعیت اب و هوا و درجه حرارت را می خواهیم نمایش دهیم.

ابتدا باید سه ماژول زیر را به برنامه ضمیمه کنید. از متد ()encodeurl از ماژول urlib3 برای ایجاد رشته کوئری و الحاق آن به لینک دریافت داده ها استفاده می شود. این متد یک دیکششنری را شامل نام کلید و مقدار انتسابی به کلید را دریافت می کند. بنابراین برای این مطلب دو کلید q و appid لازم است که به صورت رشته کوئری به لینک به فرمت کلی ?https://api.openweathermap.org/data/2.5/weather اضافه شود. از متد ()urlopen از ماژول urlib برای باز کردن و خواندن آدرس url استفاده می کنیم. در نهایت از متد ()loads از ماژول json برای تبدیل داده های json به نوع دیشکنری استفاده می شود.

توجه کنید که در خط ۶ در انتهای آدرس https://api.openweathermap.org/data/2.5/weather علامت ? وجود دارد. عدم قرار دادن علامت ? باعث بروز خطا در دریافت اطلاعات می شود. دلیل آن این است که فرمت کلی رشته کوئری (یا query string) به صورت key1=value1&key2=value2? است. در کد بالا تابعی به نام getWeatherInfoByCityName وجود دارد که نام یک شهر را دریافت می کند و سپس در خط ۹ دیشکنری که شامل کلید های q و appid است را همراه با مقادیر لازم ایجاد می کند. حتما API KEY خود را در متغیر api_key ذخیره کنید. سپس درون تابع و توسط متد ()encodeurl فرمت کلی آدرس آماده شده است. پس از آن این ادرس از طریق متغیری به نام url به متد ()urlopen ارسال می شود تا نتیجه برگشت داده شود که می تواند شامل داده های json یا خطای ۴۰۴ باشد.

از تمامی اطلاعاتی که برگشت داده می شود، می خواهیم درجه حرارت به فارنهایت و توضیح وضعیت فعلی هوا (مثلا clear یا few clouds) را پیدا کنیم. پیش از این و توسط متد ()loads از ماژول json اطلاعات json دریافتی به نوع دیشکنری تبدیل شده اند، پس می توانیم به کلید های آن دسترسی داشته باشیم. لطفا برای درک دسترسی به مقادیر از طریق نام کلید ها، با دقت فرمت json خروجی که در بالا نوشته شده است را مطالعه کنید تا متوجه شوید. در نهایت مثلا نام شهر tehran را ارسال کرده ایم و سپس در خط آخر اطلاعات برگشتی را نمایش داده ایم.