26 Commits

Author SHA1 Message Date
星光-k
5436cba3d0 Update install.sh 2025-01-18 09:38:47 +08:00
星光-k
70d1b3d710 Delete webui/1 2025-01-18 09:11:52 +08:00
星光-k
6fa3fe1407 Add files via upload 2025-01-18 01:11:29 +00:00
星光-k
cd6fc91cda Create 1 2025-01-18 09:10:49 +08:00
星光-k
60272f75ea Delete app directory 2025-01-18 09:09:51 +08:00
星光-k
faf0e2f505 Add files via upload 2025-01-18 01:09:34 +00:00
星光-k
863e9b2f5d Add files via upload 2025-01-17 02:40:52 +00:00
星光-k
d523a31006 Add files via upload 2025-01-17 02:40:26 +00:00
星光-k
9d4895fca4 Add files via upload 2025-01-17 02:02:59 +00:00
星光-k
e7f71c699e Add files via upload 2025-01-17 02:02:07 +00:00
星光-k
419f44be7e Add files via upload 2025-01-17 02:01:40 +00:00
星光-k
6c90e54728 Update clean.py 2025-01-17 07:08:49 +08:00
星光-k
e70b05a529 Update main.py 2025-01-17 07:08:17 +08:00
星光-k
d8c12f7ad3 Update weather.py 2025-01-17 07:07:49 +08:00
星光-k
8eb21afb19 更新 weather.py 2025-01-16 20:15:21 +00:00
星光-k
7bc892d06b 更新 weather.py 2025-01-16 20:06:11 +00:00
星光-k
ca67499854 更新 weather.py 2025-01-16 19:17:51 +00:00
星光-k
0b5623d5f6 更新 main.py 2025-01-16 19:17:20 +00:00
星光-k
7a71514224 Add files via upload 2025-01-16 12:09:19 +00:00
星光-k
fac4c591fb 更新 install.sh 2025-01-16 11:55:34 +00:00
星光-k
95e6bb12be Add files via upload 2025-01-16 11:54:01 +00:00
星光-k
57ea23a6fa Update app.py 2025-01-16 19:53:20 +08:00
星光-k
5262d729fb Add files via upload 2025-01-16 11:52:16 +00:00
星光-k
428d056e58 Create index.html 2025-01-16 19:51:13 +08:00
星光-k
066d9676f3 Add files via upload 2025-01-16 11:50:31 +00:00
星光-k
54bb2ccf21 Create app.py 2025-01-16 19:50:01 +08:00
9 changed files with 1431 additions and 66 deletions

View File

@@ -48,7 +48,7 @@ def clear_screen():
logging.info(e)
except KeyboardInterrupt:
logging.info("按下了 Ctrl+C,正在退出")
logging.info("检测到键盘中断,正在退出")
epd2in13_V4.epdconfig.module_exit(cleanup=True)
exit()

View File

@@ -18,6 +18,8 @@ USE_CN_GIT=false
USE_PISUGAR_WIFI_CONF=false
# 检查是否安装pisugar-power-manager
USE_PISUGAR_POWER_MANAGER=false
# 检查是否安装webui
#INSTALL_WEBUI=false
# 解析命令行参数
while [ "$#" -gt 0 ]; do
@@ -37,6 +39,9 @@ while [ "$#" -gt 0 ]; do
--pisugar-power-manager)
USE_PISUGAR_POWER_MANAGER=true
;;
# --webui)
# INSTALL_WEBUI=true
# ;;
--version)
if [ -z "$2" ]; then
echo "错误: --version 参数后需要跟版本号"
@@ -121,25 +126,14 @@ is_raspberry_pi() {
fi
}
# 定义链接变量
DEBIAN_MIRROR="http://deb.debian.org/debian/"
DEBIAN_SECURITY_MIRROR="http://security.debian.org/"
PISUGAR_WIFI_CONF_URL="https://cdn.pisugar.com/PiSugar-wificonfig/script/install.sh"
PISUGAR_POWER_MANAGER_URL="https://cdn.pisugar.com/release/pisugar-power-manager.sh"
PIPY_MIRROR="https://pypi.org/simple"
# 修改 Raspberry Pi 特定源链接
RASPBERRY_PI_SOURCE_DEBIAN11="https://archive.raspberrypi.org/debian/"
RASPBERRY_PI_SOURCE_DEBIAN12="https://archive.raspberrypi.com/debian/"
# 如果使用中国镜像源,则更新链接变量
if [ "$USE_CN_MIRROR" = true ]; then
DEBIAN_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/debian/"
# 使用中国镜像源
DEBIAN_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/debian"
DEBIAN_SECURITY_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/debian-security"
PIPY_MIRROR="https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
# 使用中国镜像源时Raspberry Pi 特定源链接保持不变
RASPBERRY_PI_SOURCE_DEBIAN11="https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/"
RASPBERRY_PI_SOURCE_DEBIAN12="https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/"
fi
RASPBERRY_PI_SOURCE_DEBIAN11="https://mirrors.tuna.tsinghua.edu.cn/raspberrypi"
RASPBERRY_PI_SOURCE_DEBIAN12="https://mirrors.tuna.tsinghua.edu.cn/raspberrypi"
# 定义仓库链接变量
INK_SCREEN_CLOCK_REPO_URL="https://github.com/kxgx/2.13-Ink-screen-clock"
@@ -155,6 +149,7 @@ update_sources_list() {
local raspberry_pi_source_in_use=$(grep -oP 'deb\s+\K.+' /etc/apt/sources.list.d/raspi.list | head -1)
# 检查并替换 Debian 源
if [ "$USE_CN_MIRROR" = true ]; then
if [ "$debian_mirror_in_use" != "$DEBIAN_MIRROR" ]; then
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
{
@@ -196,12 +191,13 @@ update_sources_list() {
else
echo "Raspberry Pi 源链接已更新,跳过替换" >&2
fi
fi
}
# 安装包函数
install_packages() {
echo "正在更新源列表"
if ! sudo apt-get -q -y update; then
if ! sudo apt-get -q update; then
echo "更新源列表失败" >&2
exit 1
fi
@@ -215,7 +211,7 @@ install_packages() {
# 安装pip包函数
install_pip_packages() {
echo "正在安装pip软件包"
if ! sudo pip3 install -i "$PIPY_MIRROR" spidev borax pillow requests; then
if ! sudo pip3 install -i "$PIPY_MIRROR" spidev borax pillow requests Flask; then
echo "pip软件包安装失败如果是最新版系统或是非lite系统" >&2
echo "请手动运行sudo pip3 install -i "$PIPY_MIRROR" spidev borax pillow requests --break-system-packages" >&2
exit 1
@@ -294,6 +290,86 @@ install_pisugar-wifi-conf() {
fi
}
# 如果指定了--webui参数则添加Nginx配置
install_webui() {
if [ "$INSTALL_WEBUI" = true ]; then
WEBUI_FILE="/root/2.13-Ink-screen-clock/webui"
NGINX_WEBUI_FILE="/var/www/html"
echo "正在安装并配置webui"
echo "正在安装软件包"
if ! sudo apt-get update && sudo apt-get -q -y install nginx php7.4-fpm; then
echo "软件包安装失败" >&2
exit 1
fi
echo "正在复制webui文件"
if ! sudo cp -r "$WEBUI_FILE" "$NGINX_WEBUI_FILE"; then
echo "webui文件复制失败" >&2
exit 1
fi
echo "正在修改nginx配置文件"
# 定义Nginx主配置文件的路径
NGINX_CONFIG_PATH="/etc/nginx/nginx.conf"
NGINX_CONFIG_BAK="$NGINX_CONFIG_PATH.bak"
# 备份现有的Nginx配置文件
cp "$NGINX_CONFIG_PATH" "$NGINX_CONFIG_BAK"
echo "已备份现有Nginx配置文件到 $NGINX_CONFIG_BAK"
# 定义文件路径变量
WEBROOT_PATH="$NGINX_WEBUI_FILE"
CGI_BIN_PATH="$WEBROOT_PATH/cgi-bin"
CGI_PASS="127.0.0.1:9000" # 根据您的CGI服务器配置
# 定义要添加的服务器配置
SERVER_CONFIG="
server {
listen 80;
server_name 0.0.0.0;
location / {
root $WEBROOT_PATH;
index index.html index.htm;
}
location /save.py {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 根据您的PHP版本进行调整
fastcgi_param SCRIPT_FILENAME \$document_root/save.py;
add_header X-Robots-Tag \"noindex,noarchive,nosnippet,nofollow\";
auth_basic \"Restricted Content\";
auth_basic_user_file /etc/nginx/.htpasswd; # 确保您有.htpasswd文件用于基本认证
}
}
"
# 检查是否已经存在类似的server配置
if ! grep -q 'server_name 0.0.0.0;' "$NGINX_CONFIG_PATH"; then
# 如果不存在将配置添加到http块中
awk -v config="$SERVER_CONFIG" '
/http {/ {
print
print config
next
}
1
' "$NGINX_CONFIG_PATH" > temp && mv temp "$NGINX_CONFIG_PATH"
else
echo "服务器配置已存在,未进行修改"
fi
# 测试Nginx配置
nginx -t
# 如果配置测试成功则重启Nginx
if [ $? -eq 0 ]; then
systemctl restart nginx
echo "Nginx配置已成功应用并重启"
else
echo "Nginx配置测试失败请检查配置文件"
fi
fi
}
# 主逻辑
# 检测是否是Debian系统
if [ -f /etc/debian_version ]; then
@@ -317,6 +393,7 @@ if [ -f /etc/debian_version ]; then
install_packages
install_pip_packages
setup_service
#install_webui
install_pisugar-wifi-conf
install_pisugar-power-manager
;;
@@ -326,6 +403,7 @@ if [ -f /etc/debian_version ]; then
install_packages
install_pip_packages
setup_service
#install_webui
install_pisugar-wifi-conf
install_pisugar-power-manager
;;

View File

@@ -86,7 +86,7 @@ def Bottom_edge(): #在图片中添加底边内容
local_addr= Get_ipv4_address() #获取当前IP地址
draw.text((10,107),"IP:"+local_addr,font = font05,fill =255)#显示当前IP地址
def Weather(): #在图片中添加天气内容
Weather_json = open('weather.json','r')
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
@@ -157,7 +157,7 @@ def Partial_refresh():#局刷函数
local_addr=local_addr1
Local_strong_brush() #局部强刷
'''天气局部更新函数'''
Weather_json = open('weather.json','r')
Weather_json = open('/root/2.13-Ink-screen-clock/bin/weather.json','r')
Weather_data = Weather_json.read()
Weather_json.close()
Weather_text=json.loads(Weather_data)
@@ -229,10 +229,10 @@ try:
epd.init()
epd.Clear(0xFF)
epd.sleep()
except IOError as e:
except OSError as e:
logging.info(e)
except KeyboardInterrupt:
logging.info("检测到键盘中断,正在优雅地退出")
logging.info("检测到键盘中断,正在清理并退出")
epd.init()
epd.Clear(0xFF) # 清除屏幕内容
epd.sleep() # 使屏幕进入休眠状态
@@ -252,4 +252,4 @@ epd.init()
epd.Clear(0xFF) # 清除屏幕内容
epd.sleep() # 使屏幕进入休眠状态
epd2in13_V4.epdconfig.module_exit() # 清理资源
exit()
exit()

View File

@@ -1,8 +1,10 @@
#!/bin/bash
f_name=main.py
f1_name=weather.py
f2_name=app.py
dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
logdir="${dir%/*}/log"
appdir="${dir%/*}/app"
# 确保日志目录存在
mkdir -p "${logdir}"
pid=`ps -ef |grep $dir/$f_name | grep -v grep |awk '{print $2}'`
@@ -12,3 +14,4 @@ do
done
nohup /usr/bin/python3 -u $dir/$f_name > $logdir/info.log 2>&1 &
nohup /usr/bin/python3 -u $dir/$f1_name > $logdir/info-wenter.log 2>&1 &
nohup /usr/bin/python3 -u $appdir/$f2_name > $logdir/info-app.log 2>&1 &

View File

@@ -17,49 +17,48 @@ if os.path.exists(libdir):
sys.path.append(libdir) # 将引入文件添加到环境变量
def get_area_id(city_name):
"""从city.js中检索AREAID"""
"""从city.js中检索AREAID,无限重试直到成功"""
url = "https://j.i8tq.com/weather2020/search/city.js"
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 直接打印原始数据
logging.debug("Raw data from city.js: %s", response.text)
# 预处理返回的数据去除非JSON部分
city_data_text = response.text.strip()
city_data_text = city_data_text.split('var city_data = ')[-1].rstrip(';')
if city_data_text:
city_data = json.loads(city_data_text)
# 遍历数据结构,查找城市名称
for province, cities in city_data.items():
for city, districts in cities.items():
for district, info in districts.items():
if info['NAMECN'] == city_name:
return info['AREAID']
logging.error("城市名称 '%s' 在城市数据中未找到,将使用默认城市信息", city_name)
else:
logging.error("从city.js接收到的数据为空")
except requests.RequestException as e:
logging.error("检索城市数据时发生网络错误: %s", e)
except json.JSONDecodeError as e:
logging.error("解析城市数据时发生JSON解码错误: %s", e)
return None
while True:
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 直接打印原始数据
logging.debug("Raw data from city.js: %s", response.text)
# 预处理返回的数据去除非JSON部分
city_data_text = response.text.strip()
city_data_text = city_data_text.split('var city_data = ')[-1].rstrip(';')
if city_data_text:
city_data = json.loads(city_data_text)
# 遍历数据结构,查找城市名称
for province, cities in city_data.items():
for city, districts in cities.items():
for district, info in districts.items():
if info['NAMECN'] == city_name:
return info['AREAID']
logging.error("城市名称 '%s' 在城市数据中未找到,将使用默认城市信息", city_name)
else:
logging.error("从city.js接收到的数据为空")
except (requests.RequestException, json.JSONDecodeError) as e:
logging.error("检索或解析城市数据时发生错误: %s", e)
time.sleep(5) # 重试前等待5秒
def get_current_city():
"""获取当前城市名称"""
"""获取当前城市名称,无限重试直到成功"""
url = "http://ip-api.com/json/?lang=zh-CN"
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
data = response.json()
if data['status'] == 'success':
return data['city']
else:
logging.error("获取当前城市失败: %s", data['message'])
except requests.RequestException as e:
logging.error("检索当前城市时出现网络错误: %s", e)
except json.JSONDecodeError as e:
logging.error("解析当前城市数据时出现JSON解码错误: %s", e)
return None
while True:
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
data = response.json()
if data['status'] == 'success':
return data['city']
else:
logging.error("获取当前城市失败: %s", data['message'])
except (requests.RequestException, json.JSONDecodeError) as e:
logging.error("检索或解析当前城市时出现错误: %s", e)
time.sleep(5) # 重试前等待5秒
# 注意:无限重试可能会在特定情况下导致程序无法终止,请确保在实际使用中考虑适当的退出条件或限制重试次数。
def getWeath(city='101060101'):
headers = {
@@ -76,7 +75,7 @@ def getWeath(city='101060101'):
response.raise_for_status() # 检查请求是否成功
response.encoding = 'utf-8'
Weath = response.text[11:]
fileHandle = open('weather.json', 'w')
fileHandle = open('/root/2.13-Ink-screen-clock/bin/weather.json', 'w')
fileHandle.write(str(Weath))
fileHandle.close()
Timer(180, getWeath).start() # 定时器函数,间隔三分钟下载文件至本地
@@ -91,10 +90,10 @@ try:
except IOError as e:
logging.info(e)
except KeyboardInterrupt:
logging.info("检测到键盘中断,正在优雅地退出")
logging.info("检测到键盘中断,正在退出")
except Exception as e:
logging.error("发生了意外错误: %s", e)
exit()
# 脚本正常结束后的清理操作
exit()
exit()

9
webui/default.min.css vendored Normal file
View File

@@ -0,0 +1,9 @@
/*!
Theme: Default
Description: Original highlight.js style
Author: (c) Ivan Sagalaev <maniac@softwaremaniacs.org>
Maintainer: @highlightjs/core-team
Website: https://highlightjs.org/
License: see project LICENSE
Touched: 2021
*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

1213
webui/highlight.min.js vendored Normal file

File diff suppressed because one or more lines are too long

40
webui/index.html Normal file
View File

@@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ace-editor@1.4.12/css/ace.min.css">
<script src="https://cdn.jsdelivr.net/npm/ace-editor@1.4.12/js/ace.min.js"></script>
<meta charset="UTF-8">
<title>编辑 main.py</title>
<style>
#editor {
width: 100%;
height: 500px;
font-family: monospace;
font-size: 16px;
}
</style>
</head>
<body>
<h1>编辑 main.py</h1>
<form action="/save.py" method="post">
<div id="editor"><?php echo file_get_contents('/root/2.13-Ink-screen-clock/bin/main.py'); ?></div>
<input type="hidden" name="content" id="hidden-content">
<br>
<input type="submit" value="保存">
</form>
<script>
// 初始化 Ace Editor
var editor = ace.edit("editor");
editor.setTheme("ace/theme/monokai");
editor.getSession().setMode("ace/mode/python");
editor.setValue(<?php echo json_encode(file_get_contents($filePath)); ?>);
// 在表单提交前将编辑器内容赋值给隐藏的textarea
document.querySelector('form').addEventListener('submit', function() {
document.getElementById('hidden-content').value = editor.getValue();
});
</script>
</body>
</form>
</body>
</html>

23
webui/save.py Normal file
View File

@@ -0,0 +1,23 @@
#!/usr/bin/env python3
import os
import sys
# 设置文件路径
file_path = '/root/2.13-Ink-screen-clock/bin/main.py'
# 读取POST数据
content_length = int(os.environ.get('CONTENT_LENGTH', 0))
content = sys.stdin.read(content_length)
# 保存文件
try:
with open(file_path, 'w') as file:
file.write(content)
response = "<h1>文件保存成功!</h1>"
except Exception as e:
response = "<h1>文件保存失败:{}</h1>".format(e)
# 返回响应
print("Content-Type: text/html")
print()
print(response)