#!/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 ' ') # 提取 , <pubDate>, 和 <description> 的内容 mapfile -t TITLE_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '<title>[^<]+' | sed -e 's/<\/\?title>//g') mapfile -t PUBDATE_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '[^<]+' | sed -e 's/<\/\?pubDate>//g') mapfile -t DESCRIPTION_ARRAY < <(echo "$RSS_CONTENT" | grep -oE '.+' | sed -e 's/<\/\?description>//g' -e 's///g') #TITLE_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '[^<]+' | sed 's/<[^>]*>//g')) #PUBDATE_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '[^<]+' | sed 's/<[^>]*>//g')) #DESCRIPTION_ARRAY=($(echo "$RSS_CONTENT" | grep -oE '[^<]+' | 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")"