#!/usr/bin/env python3 # -- coding:utf-8 -- # @Author: markushammered@gmail.com # @Development Tool: PyCharm # @Create Time: 2021/12/18 # @File Name: webservice.py import socket import threading from core.logger import Logger from core.read_config import read_config from core.information import WeatherInfo from core.language import Language from lib.buildGUIClass import InsertLog gui_log = InsertLog() try: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', 7898)) server.listen(5) except OSError as e: Logger.critical(e) gui_log.insert(e) language = Language() def build_html(): """ 构建html主体 :return: """ settings = read_config() city = settings[3]['city-name'] mode = settings[1]['mode'] match mode: case 'dev': dev_weather = WeatherInfo().dev_version() dates = dev_weather[0] day_weathers = dev_weather[1] night_weathers = dev_weather[2] highest_temps = dev_weather[3] lowest_temps = dev_weather[4] icons = dev_weather[5] sunset = dev_weather[6] sunrise = dev_weather[7] humidity = dev_weather[8] wind_speed = dev_weather[9] wind_scale = dev_weather[10] wind_dir = dev_weather[11] uv_index = dev_weather[12] cloud = dev_weather[13] pressure = dev_weather[14] vis = dev_weather[15] html = f""" QWeather|网页查看天气服务

地区:{city}


| 日期   | 天气   | 最低温度   | 最高温度  
今天 {day_weathers[0]}/{night_weathers[0]} {lowest_temps[0]}℃ {highest_temps[0]}℃
{dates[1]} {day_weathers[1]}/{night_weathers[1]} {lowest_temps[1]}℃ {highest_temps[1]}℃
{dates[2]} {day_weathers[2]}/{night_weathers[2]} {lowest_temps[2]}℃ {highest_temps[2]}℃
{dates[3]} {day_weathers[3]}/{night_weathers[3]} {lowest_temps[3]}℃ {highest_temps[3]}℃
{dates[4]} {day_weathers[4]}/{night_weathers[4]} {lowest_temps[4]}℃ {highest_temps[4]}℃
{dates[5]} {day_weathers[5]}/{night_weathers[5]} {lowest_temps[5]}℃ {highest_temps[5]}℃
{dates[6]} {day_weathers[6]}/{night_weathers[6]} {lowest_temps[6]}℃ {highest_temps[6]}℃
 
风速/级/向 湿度 紫外线
{wind_speed}m/s  {wind_scale}  {wind_dir}  {humidity}%  {uv_index} 
 
能见度 压强 云量
{vis}km  {pressure}hPa  {cloud}% 
 
Sunrise   Sunset
 {sunrise}  ---------------  {sunset} 



QWeather  ·  Github Repo
""" return html case 'free': dev_weather = WeatherInfo().free_version() dates = dev_weather[0] day_weathers = dev_weather[1] night_weathers = dev_weather[2] highest_temps = dev_weather[3] lowest_temps = dev_weather[4] icons = dev_weather[5] sunset = dev_weather[6] sunrise = dev_weather[7] humidity = dev_weather[8] wind_speed = dev_weather[9] wind_scale = dev_weather[10] wind_dir = dev_weather[11] uv_index = dev_weather[12] cloud = dev_weather[13] pressure = dev_weather[14] vis = dev_weather[15] html = f""" QWeather|网页查看天气服务

地区:{city}


| 日期   | 天气   | 最低温度   | 最高温度  
今天 {day_weathers[0]}/{night_weathers[0]} {lowest_temps[0]}℃ {highest_temps[0]}℃
{dates[1]} {day_weathers[1]}/{night_weathers[1]} {lowest_temps[1]}℃ {highest_temps[1]}℃
{dates[2]} {day_weathers[2]}/{night_weathers[2]} {lowest_temps[2]}℃ {highest_temps[2]}℃
 
风速/风级/风向 相对湿度 紫外线
{wind_speed}m/s  {wind_scale}  {wind_dir}  {humidity}%  {uv_index} 
 
能见度 压强 云量
{vis}km  {pressure}hPa  {cloud}% 
 
Sunrise   Sunset
 {sunrise}  ---------------  {sunset} 



QWeather  ·  Github Repo
""" return html case _: return "You hadn't selected a mode" def process_requests(c, a): """ 处理请求 :param c: connection :param a: address :return: """ try: data = str(c.recv(1024)).split(':')[0][6:][:-17] html = build_html() if data == '/': # 判断用户请求的目标是否为根目录, 如果是则返回html; 如果不是则继续判断 c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8')) c.send(html.encode('utf-8')) Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') try: with open(f'./{data}', 'rb') as f: c.send('HTTP/1.1 200 OK\r\n\r\n'.encode('utf-8')) c.send(f.read()) Logger.info(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') gui_log.insert(f'{language["get_resource"]} {data} {language["get_resource_from"]} {a[0]}:{a[1]}') except FileNotFoundError: with open('./res/basic-resources/404.html', 'r') as not_found: c.send(f'HTTP/1.1 404 Not Found\r\n\r\n{not_found.read()}'.encode('utf-8')) except BrokenPipeError: Logger.error(f'{language["connection_speed_too_fast"]}') gui_log.insert(f'{language["connection_speed_too_fast"]}') finally: c.close() return def accept_requests(): """ 接受请求 :return: """ while True: c, a = server.accept() threading.Thread(target=process_requests, args=(c, a,)).start()