PrintWatcher/escpos-rss.sh

108 lines
3.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 配置部分
RSS_URL="https://www.appinn.com/feed/" # 替换为你的RSS源地址
LAST_CHECK_FILE="/volume2/Material/last_check.txt" # 用于存储上次检查的时间戳
PRINTER_DEVICE="/dev/usb/lp0" # 热敏打印机设备路径
# ESC/POS 指令部分
ESC=$(echo -e "\x1b") # ESC 字符
RESET="${ESC}@"
BOLD_ON="${ESC}E\x01"
BOLD_OFF="${ESC}E\x00"
CENTER="${ESC}a\x01"
LEFT_ALIGN="${ESC}a\x00"
DOUBLE_HEIGHT="${ESC}!\x10" # 双倍高度
DOUBLE_WIDTH="${ESC}!\x20" # 双倍宽度
NORMAL_SIZE="${ESC}!\x00"
CUT_PAPER="${ESC}i" # 切纸指令
# 指定日期格式
START_DATE="2024-09-01T00:00:00Z" # 替换为指定的起始时间UTC格式
echo "初始查询时间:$START_DATE"
# 获取上次查询时间
if [ -f "$LAST_CHECK_FILE" ]; then
LAST_CHECK=$(cat "$LAST_CHECK_FILE")
else
LAST_CHECK="$START_DATE"
fi
echo "上次查询时间:$LAST_CHECK"
# 下载RSS源
RSS_CONTENT=$(curl -s "$RSS_URL")
echo "RSS源内容下载完成长度${#RSS_CONTENT}"
# 将RSS内容转换为单行
#SINGLE_LINE_RSS_CONTENT=$(echo "$RSS_CONTENT" | tr -d '\n' | tr -d '\r' | tr -s ' ')
# 提取 <title>, <pubDate>, 和 <description> 的内容
mapfile -t TITLE_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '<title>[^<]+</title>' | sed -e 's/<\/\?title>//g')
mapfile -t PUBDATE_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '<pubDate>[^<]+</pubDate>' | sed -e 's/<\/\?pubDate>//g')
mapfile -t DESCRIPTION_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '<description>.+</description>' | sed -e 's/<\/\?description>//g' -e 's/<!\[CDATA\[//g' -e 's/]]>//g')
#TITLE_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '<title>[^<]+</title>' | sed 's/<[^>]*>//g'))
#PUBDATE_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '<pubDate>[^<]+</pubDate>' | sed 's/<[^>]*>//g'))
#DESCRIPTION_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '<description>[^<]+</description>' | sed -e 's/<[^>]*>//g'))
# 获取数组的长度(假设每个数组长度相同)
ITEM_COUNT=${#TITLE_ARRAY[@]}
for (( i=0; i<$ITEM_COUNT; i++ )); do
t=$i+1
TITLE="${TITLE_ARRAY[$t]}"
PUB_DATE="${PUBDATE_ARRAY[$i]}"
DESCRIPTION="${DESCRIPTION_ARRAY[$t]}"
echo "处理一个新项目..."
echo "项目发布日期:$PUB_DATE"
echo "项目标题:$TITLE"
echo "项目描述前180字$(echo "$DESCRIPTION" | cut -c1-180)"
# 将发布时间转为Unix时间戳
CLEAN_PUB_DATE=$(echo "$PUB_DATE" | sed 's/,//')
PUB_DATE_TIMESTAMP=$(date -d "$CLEAN_PUB_DATE" +%s 2>/dev/null)
if [ -z "$PUB_DATE_TIMESTAMP" ]; then
echo "日期解析失败,跳过该项目。"
continue
fi
LAST_CHECK_TIMESTAMP=$(date -d "$LAST_CHECK" +%s)
echo "项目发布时间戳:$PUB_DATE_TIMESTAMP"
echo "上次查询时间戳:$LAST_CHECK_TIMESTAMP"
# 如果发布时间比上次查询时间更新,则抓取内容
if [ "$PUB_DATE_TIMESTAMP" -gt "$LAST_CHECK_TIMESTAMP" ]; then
# 格式化打印内容
{
# 重置打印机状态
echo -ne "$RESET"
# 打印居中的加粗标题,双倍高度和宽度
echo -ne "$CENTER$BOLD_ON$DOUBLE_HEIGHT$DOUBLE_WIDTH"
echo "$TITLE" | iconv -f UTF-8 -t GBK
echo -ne "$RESET" # 复位到正常大小和状态
# 打印左对齐的描述仅前180个字符
echo -ne "$LEFT_ALIGN$NORMAL_SIZE"
echo "$(echo "$DESCRIPTION" | iconv -f UTF-8 -t GBK)"
echo -ne "$RESET" # 复位打印机状态
# 打印五行空白
echo -e "\n\n\n\n\n"
# 切纸
echo -ne "$CUT_PAPER"
} > "$PRINTER_DEVICE"
echo "项目打印完成。"
else
echo "项目未更新,无需打印。"
fi
done
# 更新查询时间
date -u +"%Y-%m-%dT%H:%M:%SZ" > "$LAST_CHECK_FILE"
echo "查询时间已更新为:$(cat "$LAST_CHECK_FILE")"