阿里云的云市场提供大量的免费接口,并且可以使用多种语言调用接口,如:python,java,php等。
使用接口前,需要购买接口,然后就可以使用阿里云提供的AppCode去请求对应的接口。
下面开始使用python调用天气预告接口,查询想要的城市的近十几天的天气情况:
使用的包
import json
import requests
使用接口
调用接口需要重要的三个参数,其中AppCode最重要,在点击购买接口后会得到属于你自己的AppCode。
url = 'http://saweather.market.alicloudapi.com/day15'
Header = {
# "Authorization":"APPCODE 自己的AppCode",
"Authorization": "APPCODE 7b9862e5b4bc4906a1d6f87e0f417ebd",
"Type":"application/json; charset=utf-8",
}
payload = {
'area': "深圳"
}
response = requests.get(url, params=payload, headers=Header)
print(response)
执行上面代码后,就是完成接口的调用。需要注意打印的response
的结果,通过此结果可以知道访问是否成功。若返回的结果位
,则接口调用成功,否则失败。
失败原因可能是:
area
拼写错误;获取到的数据:(可复制到纯文本文件查看完整的数据)
{
"showapi_res_error": "",
"showapi_res_id": "e3b0d76a3ecf426f9a11e65b9c9d941c",
"showapi_res_code": 0,
"showapi_res_body": {
"ret_code": 0,
"area": "深圳",
"showapi_fee_code": -1,
"areaid": "101280601",
"dayList": [
{
"night_weather_code": "00",
"day_weather": "多云",
"night_weather": "晴",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "3-4级",
"day_weather_code": "01",
"daytime": "20190911",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/01.png",
"night_air_temperature": "28",
"day_air_temperature": "33",
"day_wind_direction": "西南风",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/00.png"
},
{
"night_weather_code": "04",
"day_weather": "晴",
"night_weather": "雷阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "00",
"daytime": "20190912",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/00.png",
"night_air_temperature": "28",
"day_air_temperature": "34",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/04.png"
},
{
"night_weather_code": "04",
"day_weather": "雷阵雨",
"night_weather": "雷阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "04",
"daytime": "20190913",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/04.png",
"night_air_temperature": "28",
"day_air_temperature": "35",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/04.png"
},
{
"night_weather_code": "04",
"day_weather": "雷阵雨",
"night_weather": "雷阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "04",
"daytime": "20190914",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/04.png",
"night_air_temperature": "27",
"day_air_temperature": "34",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/04.png"
},
{
"night_weather_code": "03",
"day_weather": "雷阵雨",
"night_weather": "阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "04",
"daytime": "20190915",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/04.png",
"night_air_temperature": "27",
"day_air_temperature": "33",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/03.png"
},
{
"night_weather_code": "03",
"day_weather": "阵雨",
"night_weather": "阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "03",
"daytime": "20190916",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/03.png",
"night_air_temperature": "27",
"day_air_temperature": "33",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/03.png"
},
{
"night_weather_code": "03",
"day_weather": "阵雨",
"night_weather": "阵雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "03",
"daytime": "20190917",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/03.png",
"night_air_temperature": "27",
"day_air_temperature": "32",
"day_wind_direction": "无持续风向",
"night_wind_direction": "无持续风向",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/03.png"
},
{
"night_weather_code": "301",
"day_weather": "阵雨",
"night_weather": "雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "03",
"daytime": "20190918",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/03.png",
"night_air_temperature": "26",
"day_air_temperature": "33",
"day_wind_direction": "无持续风向",
"night_wind_direction": "西风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/301.png"
},
{
"night_weather_code": "02",
"day_weather": "雨",
"night_weather": "阴",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "301",
"daytime": "20190919",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/301.png",
"night_air_temperature": "25",
"day_air_temperature": "31",
"day_wind_direction": "东南风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/02.png"
},
{
"night_weather_code": "02",
"day_weather": "阴",
"night_weather": "阴",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "02",
"daytime": "20190920",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/02.png",
"night_air_temperature": "24",
"day_air_temperature": "31",
"day_wind_direction": "北风",
"night_wind_direction": "西北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/02.png"
},
{
"night_weather_code": "01",
"day_weather": "雨",
"night_weather": "多云",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "301",
"daytime": "20190921",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/301.png",
"night_air_temperature": "26",
"day_air_temperature": "29",
"day_wind_direction": "北风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/01.png"
},
{
"night_weather_code": "301",
"day_weather": "多云",
"night_weather": "雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "01",
"daytime": "20190922",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/01.png",
"night_air_temperature": "26",
"day_air_temperature": "29",
"day_wind_direction": "北风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/301.png"
},
{
"night_weather_code": "01",
"day_weather": "雨",
"night_weather": "多云",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "301",
"daytime": "20190923",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/301.png",
"night_air_temperature": "24",
"day_air_temperature": "29",
"day_wind_direction": "北风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/01.png"
},
{
"night_weather_code": "301",
"day_weather": "雨",
"night_weather": "雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "301",
"daytime": "20190924",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/301.png",
"night_air_temperature": "24",
"day_air_temperature": "25",
"day_wind_direction": "北风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/301.png"
},
{
"night_weather_code": "301",
"day_weather": "雨",
"night_weather": "雨",
"night_wind_power": "0-3级",
"areaid": "101280601",
"day_wind_power": "0-3级",
"day_weather_code": "301",
"daytime": "20190925",
"area": "深圳",
"day_weather_pic": "http://app1.showapi.com/weather/icon/day/301.png",
"night_air_temperature": "24",
"day_air_temperature": "26",
"day_wind_direction": "北风",
"night_wind_direction": "北风",
"night_weather_pic": "http://app1.showapi.com/weather/icon/night/301.png"
}
]
}
}
通过上面的步骤,已经能实现简单的接口访问,若想要任意输入城市进行查询,并且获得查询到的所有结果,还需要进一步完善代码。
import tornado
# 项目的文件结构
MyTornadoPro
├─App
│ └─__init__.py
│ └─ settings.py
│ └─ urls.py
│ └─ views.py
├─templates
│ └─ weather.html
└─manage.py
__init__.py
import tornado.web
from App.urls import patterns
from App.settings import app_settings
# 创建应用,并设置了路由规则
def make_app():
return tornado.web.Application(
handlers=patterns,
**app_settings,
)
settings.py
import tornado.web
from App.urls import patterns
from App.settings import app_settings
# 创建应用,并设置了路由规则
import os
from tornado.options import define, options
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
define('port', default=8080, type=int)
define('debug', default=True, type=bool)
app_settings = {
"debug": options.debug,
"template_path": os.path.join(BASE_DIR, 'templates'),
"static_path": os.path.join(BASE_DIR, 'static'),
}
```
urls.py
# urls.py: 存放路由配置
from tornado.web import url
from App.views import *
patterns = [
url(r'/weather/', WeatherIndex),
url(r'/weatherinfo/', WeatherHandler, name="wea"),
]
views.py
class WeatherIndex(tornado.web.RequestHandler):
def get(self):
self.render("weather.html")
class WeatherHandler(tornado.web.RequestHandler):
def get(self):
url = 'http://saweather.market.alicloudapi.com/day15'
Header = {
"Authorization": "APPCODE 7b9862e5b4bc4906a1d6f87e0f417ebd",
"Type": "application/json; charset=utf-8",
}
city = self.get_argument("city")
payload = {
'area': '{}'.format(city)}
response = requests.get(url, params=payload, headers=Header)
cityinfo_dict = json.loads(response.content)['showapi_res_body']
self.write(json.dumps(cityinfo_dict))
tempalte
文件夹中
<html lang="en">
<head>
<meta charset="UTF-8">
<title>天气查询title>
<script type="text/javascript" src="https://libs.baidu.com/jquery/1.11.3/jquery.min.js">script>
<style>
* {
margin: 0;
padding: 0;
font-size: 14px;
}
h1 {
font-size: 38px;
margin-bottom: 10px;
margin-top: 4px;
}
#all {
text-align: center;
width: 100%;
background-color: white;
/*height: 800px;*/
/*border: 1px solid black;*/
}
li {
list-style: none;
height: 40px;
}
.city_title {
font-size: 35px;
line-height: 40px;
margin-right: 50px;
}
#weatherList {
margin: 0 auto;
width: 500px;
height: 260px;
border: 1px solid gray;
border-radius: 4px;
mso-border-shadow: yes;
}
input {
width: 300px;
height: 28px;
}
button {
width: 60px;
height: 32px;
}
.point {
position: relative;
width: 40px;
height: 40px;
border-radius: 5px;
border: 1px solid gainsboro;
font-size: 30px;
top: 60px;
display: none;
}
.point label {
font-size: 30px;
margin: -6px -4px 0px 0px;
}
.point_left {
float: left;
}
.point_right {
float: right;
}
style>
head>
<body>
<div id="all">
<h1>天气查询h1>
<input type="text" name="city" placeholder="请输入查询城市名称">
<button>确定button>
<br>
<br>
<div id="weatherList" style="z-index: 2">
<br>
<br>
<div class="point point_right" onclick="rightpoint()">
<label>>label>
div>
<div class="point point_left" onclick="leftpoint()">
<label><label>
div>
<p>p>
<br>
<ul id="day">
ul>
<ul id="night">
ul>
div>
div>
<script>
//查询城市的近十天天气信息
var days = [];
var day_num = 0;
//点击提交后,使用ajax与后台数据交互,succss参数是后天返回的结果
$("button").click(function () {
//对输入的内容进行判断
let city_content = document.getElementsByName("city")[0].value;
var re = "^[/u4e00-/u9fa5]+$"; //只允许输入中文
if (city_content === "") {
alert("请填写查询城市!")
} else if (re.match(city_content)) {
alert("城市名字有误!")
} else {
//使用ajax提交数据到后台,并接收返回的数据
$.ajax(
{
type: "get",
dataType: "json",
url: "/weatherinfo/",
data: {
"city": $("input")[0].value}, //提交到后台的数据
success: function (data) {
//data是后台返回数据
if (data['ret_code'] == -1) {
//查找不到时执行
alert("城市查看不到!")
} else {
days = data['dayList'];
change(day_num);
document.getElementsByName("city")[0].value = "";
// console.log(data);
}
}
}
);
}
}
);
//切换日期的天气
function change(num) {
//白天
var day_air = days[num]['day_air_temperature']; //气温
var day_weather = days[num]['day_weather']; //天气
var day_wind_power = days[num]['day_wind_power']; //风力
var day_wind_direction = days[num]['day_wind_direction']; //风向
//夜晚
var night_air = days[num]['night_air_temperature']; //气温
var night_weather = days[num]['night_weather']; //天气
var night_wind_power = days[num]['night_wind_power']; //风力
var night_wind_direction = days[num]['night_wind_direction']; //风向
//创建对象
let day = $("#day");
let label = $("label");
let night = $("#night");
let p = $("p");
let list = $("#weatherList");
//清空节点内容
p.empty();
day.empty();
night.empty(); //添加节点时,需要先清楚指定节点中的内容
//添加内容
var date = days[num]['daytime'];
var date_text = " " + date.slice(0, 4) + " 年 " + parseInt(date.slice(4, 6)) + " 月 + parseInt(date.slice(6, 8)) + " 日";
var text = night_air + "~" + day_air;
var text_line2 = "- 白天: "
+ day_weather + " 风向: " + day_wind_direction + " 风力等级: " + day_wind_power + "
按照上面的项目结构创建文件后,便完成实现接口后处理数据的后台代码,在Pycharm中打开控制台,输入python manage.py
执行tornado框架。在后台获取到响应数据后,通过ajax
传到前端显示数据。