搞了一會才弄出了個天氣的外掛程式,主要是根據官方文件的完善,從而能實現查詢天氣的功能。
主函式:(__init__.py)
from nonebot importon_command, commandsession
from nonebot import
on_natural_language, nlpsession, intentcommand
from jieba import
posseg
import
requests
import
time
import
urllib
from lxml import
etree
from .data_source import
get_weather_of_city
@on_command(
'weather
', aliases=('
的天氣', '
天氣預報
', '
查天氣'
))async
defweather(session: commandsession):
city = session.get('
city
', prompt='
你想查詢哪個城市的天氣呢?')
weather_report =await get_weather_of_city(city)
await session.send(weather_report)
@weather.args_parser
async
def_(session: commandsession):
stripped_arg =session.current_arg_text.strip()
# current_arg_text.strip()是用來去掉字串的首位空格
ifsession.is_first_run:
ifstripped_arg:
session.state[
'city
'] =stripped_arg
return
ifnot
stripped_arg:
session.pause(
'要查詢的城市名稱不能為空呢,請重新輸入')
session.state[session.current_key] =stripped_arg
#on_natural_language 裝飾器將函式宣告為乙個自然語言處理器##
如果不傳入 keywords,則響應所有沒有被當作命令處理的訊息
@on_natural_language(keywords=,only_to_me=false)
async
def_(session: nlpsession):
#去掉訊息首尾的空白符
stripped_msg =session.msg_text.strip()
(stripped_msg)
#對訊息進行分詞和詞性標註
words =posseg.lcut(stripped_msg)
city =none
#遍歷 posseg.lcut 返回的列表
for word in
words:
#每個元素是乙個 pair 物件,包含 word 和 flag 兩個屬性,分別表示詞和詞性
if word.flag == 'ns'
:
#ns 詞性表示地名
(word.flag)
city =word.word
break
#返回意圖命令,前兩個引數必填,分別表示置信度和意圖命令名
return intentcommand(90.0, '
weather
', current_arg=city)
具體實現的介面方面的:(data_source.py檔案的)
from urllib.request importurlopen
import
urllib.request
import
requests
import
sysimport
sslimport
importlib
importlib.reload(sys)
import
json
async
def get_weather_of_city(city: str) ->str:
#這裡簡單返回乙個字串
#實際應用中,這裡應該呼叫返回真實資料的天氣 api,並拼接成天氣預報內容
host = '
'url = host +urllib.parse.quote(city)
r =requests.get(url)
jsons =json.loads(r.text)
str = city+'
的天氣:\n
'len =0
for i in jsons['
data
']['
forecast']:
if len < 2:
if len ==0:
str += '
今日:'
if len == 1:
str += '
明日:'
str += i['
date']
str += '
\n天氣:
'str += i['
type']
str += '
\n最'
str += i['
low'
] str += '
\n最'
str += i['
high']
str += '\n'
len += 1
return str
總結:
算是折騰了挺久的吧,總結下遇到的問題。
1.一開始用的阿里雲的免費介面,返回的是json格式,由於一般我們需要查詢的城市格式是utf-8的字串,但是python中預設的是ascii的格式來執行,所以還得先utf-8轉unicode,但是轉換的時候經常會報各種各樣的錯誤。後面換了別的介面,直接用requests庫。在python3中,urllib2庫已經沒有了,用來代替的是urrlib.request庫
2.由於是採用的瀏覽器get方法,所以在查詢的時候城市需要轉換成urlcode,才能拼接到url後面,用的是urllib.parse.quote()這個函式,可以直接轉換。
基於python的終端天氣查詢
開發十年,就只剩下這套架構體系了!網上搜了乙個,最開始準備使用中國天氣網的資料介面,但是需要註冊,也行,註冊就註冊吧。註冊好了,又提示資訊不完整,好吧,填寫姓名 身份證.最後,還要上傳身份證資訊,看到這我不想用它了,緊接著發現,還要填寫使用該介面的伺服器ip。頓時,心中十萬個那個啥呼嘯而過.城市介面...
基於Spring Boot的天氣預報服務
有時,為了提公升整個 的效能,我們會將經常需要訪問資料快取起來,這樣,在下次查詢的時候,能快速的找到這些資料。快取的使用與系統的時效性有著非常大的關係。當我們的系統時效性要求不高時,則選擇使用快取是極好的。當系統要求的時效性比較高時,則並不適合用快取。本文,我們將演示如何通過整合 redis 伺服器...
基於python編寫的天氣抓取程式
以前一直使用中國天氣網的天氣預報元件都挺好,可是自從他們公升級元件後資料載入變得非常不穩定,因為js的阻塞常常導致 開啟速度很慢。為了解決這個問題決定現學現用python編寫乙個抓取程式,每天定時抓取最新的天氣情況並生成靜態js供 呼叫。由於初學python,程式有些地方寫得不是很優雅,還望高手指正...