安卓短信轉發腳本

@zgcwkj  2026年04月09日

分類:

默認 代碼 其它 

安卓短信轉發模塊(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



評論已關閉

Top