回 帖 发 新 帖 刷新版面

主题:获取天气信息的代码

获取天气信息的代码


2019年1月6日,我发了个利用新浪的天气API获取气象预报的代码,但现在新浪的这个API取不到数据了,不知
其原因,所以下面另外发个获取气象预报的代码。
新建一个工程,在窗体上添加2个按纽,Command1的标题为“天气预报”,Command2的标题为“城市
代码”;再添加2个文本框,Text1用于输入城市名或者省名,Text2用于显示获取到的信息。再添加1个
计时器,用于获取实时天气数据,其Interval=60000(1分钟)。
代码如下:


Dim MyHTTP As Object, t As Integer


Private Sub Form_Load()
Set MyHTTP = CreateObject("Microsoft.XMLHTTP")
weather
End Sub


Private Sub Command1_Click()
weather
End Sub


Private Sub weather() '由城市名查天气
Dim arry(22) As String, st As String, i As Integer, j As Integer, k As Integer

With MyHTTP
  .open "POST", "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName", False
  .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  .send ("theCityName=" & Text1) 'Text1是城市名,中国城市用中文(不要输入“市”字),外国城市用英文
End With

st = MyHTTP.responseText
i = 1

Do
  i = InStr(i, st, "<string>") + 8: If i = 8 Then Exit Do
  j = InStr(i, st, "</string>") - i
  If j > 0 Then arry(k) = Mid(st, i, j) & vbCrLf
  k = k + 1
Loop Until k > 22
Text2 = Join(arry)

st = Replace(Mid(arry(6), InStr(arry(6), " ") + 1), vbCrLf, "") & ";"
i = InStr(arry(10), "气温") + 3
j = InStr(i, arry(10), ";") - i + 1
st = st & Mid(arry(10), i, j)
i = InStr(j, arry(10), "风力") + 3
j = InStr(i, arry(10), ";") - i
st = st & Mid(arry(10), i, j)
Me.Caption = st
End Sub


Private Sub Command2_Click() '由省名查各城市代码
Dim arry() As String, st As String, i As Integer, j As Integer, k As Integer

With MyHTTP
  .open "POST", "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportCity", False
  .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  .send ("byProvinceName=" & Text1) 'Text1是省名,但不要“省”字,如“江苏省”输入“江苏”即可
End With

st = MyHTTP.responseText
i = 1

Do
  i = InStr(i, st, "<string>") + 8: If i = 8 Then Exit Do
  j = InStr(i, st, "</string>") - i
  ReDim Preserve arry(k)
  arry(k) = Mid(st, i, j) & vbCrLf
  k = k + 1
Loop

Text2 = Join(arry)
End Sub


Private Sub Timer1_Timer() '每30分钟获取一次天气数据
t = t + 1: If t = 30 Then t = 0: weather
End Sub


Private Sub Form_Unload(Cancel As Integer)
Set MyHTTP = Nothing
End Sub


简要说明:

一、由城市名查天气
weather()过程根据输入的城市名(国外城市可用英文)或城市代码(不输入默认为上海)可查询当
天的天气实况和生活指数,以及明、后天的天气概况。
输入参数:theCityName=城市名,如城市名有重复,则使用城市代码。如:“上海”或“58367”。
返回数据:其中有23个String,各String的意义如下:
String(0):省份
String(1):城市
String(2):城市代码
String(3):城市图片
String(4):最后更新时间
String(5):当天的最低和最高气温
String(6):当天的天气状况
String(7):当天的风向和风级
String(8):当天的天气趋势图
String(9):当天的天气趋势图
String(10):当前天气实况,包括:气温、风向/风级、湿度、紫外线强度
String(11):当前的各种指数,包括:感冒指数、运动指数、过敏指数、穿衣指数、洗车指数、紫外线指数
String(12):第二天的最低和最高气温
String(13):第二天的天气状况
String(14):第二天的风向和风级
String(15):第二天的天气趋势图
String(16):第二天的天气趋势图
String(17):第三天的最低和最高气温
String(18):第三天的天气状况
String(19):第三天的风向和风级
String(20):第三天的天气趋势图
String(21):第三天的天气趋势图
String(22):被查询的城市或地区的介绍
一维数组arry包含了这23个字符串,你应该根据需要舍取,并在其它的控件上显示出来,请自行设
计。
weather()过程中,最后一小节的代码是为了当窗体最小化时,在系统的任务栏上显示当时天气的3
项主要数据:天气状况、气温、风向和风级。你还可以使窗体的WindowState=1,并将本程序设置为自
启动,这样,只要一开机,就可以在任务栏上看到当时的天气状况。


二、由省名查各城市代码
Command2_Click()过程,根据输入的省名(不要输入“省”字,如“江苏省”输入“江苏”即可)
可查询该省所有城市的城市代码。有的省的县级市也列出了城市代码,有的省则没有列出县级市,不明
白其原因。
输入参数:byProvinceName=省名
返回数据:其中String的个数每个省都不相同。String的前半部分为城市名,后半部分(括号内)
为城市代码。


三、实时天气数据
Timer1_Timer()过程设置为每30分钟获取一次实时天气数据,你可以根据需要更改,但数值改小意
义不大,因为气象台不会很频繁地发布天气数据。并且,这个天气API对于免费用户有访问次数的限制,
24小时之内不得超过50次。


以上代码在Win7旗舰版上通过,未在其它版本验证。

回复列表 (共1个回复)

沙发

424 要求对象,什么意思啊?

我来回复

您尚未登录,请登录后再回复。点此登录或注册