安卓短信轉發模塊(Magisk 或 KernelSU)
腳本是AI寫的,不過我也調試好多次。
需要搭配 WxPusher 使用,你也可以改,也就是一個 curl 命令而已
源碼:
#!/system/bin/sh
# 常量
LOG_FILE="${MODDIR:-/data/local/tmp}/sms_debug.log"
CONTENT_URI="content://sms/inbox"
POLL_INTERVAL=10
USER_ID=0
# 日志組件
log_info() {
return 0
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# WxPusher 發送
wxpusher_send() {
local content="$1"
local appToken="appToken"
local uids="uids"
curl -s -X POST "https://wxpusher.zjiecode.com/api/send/message" \
-H "Content-Type: application/json" \
-d "{\"appToken\":\"${appToken}\",\"uids\":[\"${uids}\"],\"content\":\"${content}\",\"contentType\":2}"
}
# 解析短信行並返回 ID|ADDR|BODY|DATE
parse_sms_row() {
local line="$1"
log_info "解析短信行: $line"
local id addr body date
id=$(echo "$line" | sed -n 's/.*_id=\([^, ]*\).*/\1/p' | tr -cd '0-9')
addr=$(echo "$line" | sed -n 's/.*address=\([^, ]*\).*/\1/p')
body=$(echo "$line" | sed -n 's/.*body=\(.*\) date=.*/\1/p')
body=$(echo "$body" | sed 's/[[:space:]]*,$//')
date=$(echo "$line" | sed -n 's/.*date=\([^ ]*\).*/\1/p')
if [ -n "$id" ]; then
echo "$id|$addr|$body|$date"
return 0
fi
echo ""
return 1
}
# 讀取最新一條短信(使用 Content Provider)
read_latest_sms() {
local out parsed id address body date
out=$(content query --uri "$CONTENT_URI" --user "$USER_ID" \
--projection _id:address:body:date \
--sort "date" 2>&1 | tr -d '\r')
if echo "$out" | grep -q "Row:"; then
parsed=$(echo "$out" | tail -n 1)
parsed=$(parse_sms_row "$parsed")
if [ -n "$parsed" ]; then
echo "$parsed"
return 0
fi
fi
echo ""
return 1
}
# 查詢指定 ID 之後的新短信(增量)
read_new_sms_since() {
local last_id="$1"
content query --uri "$CONTENT_URI" --user "$USER_ID" \
--projection _id:address:body:date \
--where "_id>${last_id}" --sort "_id" 2>&1 | tr -d '\r'
}
# 啟動時記錄(清空日志)
: > "$LOG_FILE"
chmod 644 "$LOG_FILE"
log_info "腳本已啟動,開始監聽短信..."
log_info "短信內容來源: $CONTENT_URI"
log_info "輪詢間隔: ${POLL_INTERVAL} 秒"
log_info "用戶標識: ${USER_ID}"
# 初始化最新短信(首次成功讀取僅初始化遊標)
LAST_ID=0
LAST_DATE=0
INIT_DONE=0
# 輪詢方式獲取新短信
while true; do
sleep "$POLL_INTERVAL"
if [ "$INIT_DONE" -eq 0 ]; then
LATEST=$(read_latest_sms)
if [ -z "$LATEST" ]; then
continue
fi
IFS='|' read -r NEW_ID NEW_ADDR NEW_BODY NEW_DATE <<EOF
$LATEST
EOF
log_info "初始化遊標: 當前=$NEW_ID 舊值=$LAST_ID"
LAST_ID=$NEW_ID
LAST_DATE=$NEW_DATE
INIT_DONE=1
log_info "初始化完成: ID=$LAST_ID 時間=$LAST_DATE"
continue
fi
NEW_ROWS=$(read_new_sms_since "$LAST_ID")
if ! echo "$NEW_ROWS" | grep -q "Row:"; then
continue
fi
while read -r line; do
case "$line" in
Row:*)
PARSED=$(parse_sms_row "$line")
if [ -z "$PARSED" ]; then
continue
fi
IFS='|' read -r NEW_ID NEW_ADDR NEW_BODY NEW_DATE <<EOF
$PARSED
EOF
if [ -n "$NEW_ID" ] && [ "$NEW_ID" -gt "$LAST_ID" ]; then
log_info "檢測到新短信: 發件人=$NEW_ADDR 內容=$NEW_BODY"
wxpusher_send "<p>內容: ${NEW_BODY}</p><p>號碼: ${NEW_ADDR}</p>"
LAST_ID=$NEW_ID
LAST_DATE=$NEW_DATE
fi
;;
esac
done <<EOF
$NEW_ROWS
EOF
done倉庫:https://github.com/zgcwkjOpenProject/Magisk_SmsForwarder
版權屬於:zgcwkj
本文鏈接:https://www.zgcwkj.com/archives/274.html
轉載聲明:請注明本文章的標題及內容的出處和聲明,謝謝
評論已關閉