基於NoneBot的天氣查詢外掛程式

2022-09-06 12:00:25 字數 3363 閱讀 3148

搞了一會才弄出了個天氣的外掛程式,主要是根據官方文件的完善,從而能實現查詢天氣的功能。

主函式:(__init__.py)

from nonebot import

on_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()

print

(stripped_msg)

#對訊息進行分詞和詞性標註

words =posseg.lcut(stripped_msg)

city =none

#遍歷 posseg.lcut 返回的列表

for word in

words:

#每個元素是乙個 pair 物件,包含 word 和 flag 兩個屬性,分別表示詞和詞性

if word.flag == 'ns'

:

#ns 詞性表示地名

print

(word.flag)

city =word.word

break

#返回意圖命令,前兩個引數必填,分別表示置信度和意圖命令名

return intentcommand(90.0, '

weather

', current_arg=city)

具體實現的介面方面的:(data_source.py檔案的)

from urllib.request import

urlopen

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,程式有些地方寫得不是很優雅,還望高手指正...