HA 透過 SSH 經 Mac 傳送 iMessage 轉發到 LINE

作者:紅軍

某天看到蔥大說可以透過iMessage轉發訊息到Line上 於是用了ChatGPT亂搞了幾天目前測試已經沒問題 現在將我的方法分享給需要的人

1. 準備工作

1-1. 用 Mac 當 iMessage 中繼(Script)

Step 1:Mac 建立發送 iMessage 腳本

我們需要在Mac 建立2個檔案 1個傳純文字用 1個傳含照片的

HA SSH iMessage 轉發 LINE 教學截圖 23

我是用send_imessage_b64.sh 跟 send_imessage_photo.sh 當然你也可以依照你自己的喜好設定檔案名稱 send_imessage_b64.sh 內容

bash
#!/bin/bash

PHONE="$1"
MESSAGE_B64="$2"

if [ -z "$PHONE" ] || [ -z "$MESSAGE_B64" ]; then
  echo "用法: $0 <phone> <message_b64>"
  exit 1
fi

MESSAGE=$(printf "%s" "$MESSAGE_B64" | base64 -d)

osascript <<EOF
tell application "Messages"
    activate
    set targetService to 1st service whose service type = iMessage
    send "$MESSAGE" to buddy "$PHONE" of targetService
end tell
EOF

send_imessage_photo.sh

bash
#!/bin/bash

PHONE="$1"
MESSAGE_B64="$2"
IMAGE_URL="$3"

if [ -z "$PHONE" ] || [ -z "$MESSAGE_B64" ] || [ -z "$IMAGE_URL" ]; then
  echo "用法: $0 <phone> <message_b64> <image_url>"
  exit 1
fi

MESSAGE=$(printf "%s" "$MESSAGE_B64" | base64 -d)

IMG_DIR="$HOME/Pictures/iMessageTemp"
mkdir -p "$IMG_DIR"

IMAGE_PATH="$IMG_DIR/imessage_$(date +%Y%m%d_%H%M%S).jpg"

curl -sS -L "$IMAGE_URL" -o "$IMAGE_PATH"

if [ ! -s "$IMAGE_PATH" ]; then
  echo "圖片下載失敗: $IMAGE_PATH"
  exit 1
fi

osascript <<EOF
-- 先在 tell 外面建立 file 物件,避免 sandbox 問題
set imageAttachment to POSIX file "$IMAGE_PATH"

tell application "Messages"
    activate
    set targetService to 1st service whose service type = iMessage
    set targetBuddy to buddy "$PHONE" of targetService

    send imageAttachment to targetBuddy
    delay 2
    send "$MESSAGE" to targetBuddy
end tell
EOF

rm -f "$IMAGE_PATH"

給檔案可以執行的權限 注意你放檔案的路徑 因我是放在使用者底下 所以是用 ~

bash
sudo chmod +x ~/send_imessage_b64.sh
sudo chmod +x ~/send_imessage_photo.sh

Step 2:Mac 上測試 iMessage 腳本

因為透過 SSH 傳送訊息時,括號、換行、emoji 等特殊字元可能會導致錯誤, 所以這邊統一先轉成 Base64 再傳送,確保內容不會被解析錯誤。 所以我們需要先把一些測試的訊息轉成 Base64 才能進行測試

下面是測試的方法

bash
/你放檔案的路徑/send_imessage_b64.sh +8869XXXXXXXX SGVsbG8=

+8869XXXXXXXX 請改成你要接收訊息的電話號碼(iPhone才能收到) SGVsbG8= 這個是Hello轉成 Base64 後的碼

HA SSH iMessage 轉發 LINE 教學截圖 01

如果要查 Base64 怎麼轉換可以用下列方法

bash
printf 'Hello' | base64
HA SSH iMessage 轉發 LINE 教學截圖 24

確認傳送沒問題後就可以到HA這邊進行後續設定

2. Home Assistant 設定

2-1. 設定 SSH 連線

因為 HA 需要透過 SSH 呼叫 Mac 上的腳本 所以需要先建立 SSH 金鑰 進入 HA Terminal 執行:

bash
ssh-keygen
HA SSH iMessage 轉發 LINE 教學截圖 02

一直Enter下去就會建好金鑰 記好圈起來的紅匡部分等等建 shell command 可能會用到

接著把金鑰複製到 Mac:

bash
ssh-copy-id 使用者名稱@Mac_IP
HA SSH iMessage 轉發 LINE 教學截圖 03

輸入yes 還有mac 密碼 就可以不用輸入密碼 ssh 登入mac 輸入 ssh MAC使用者id@MAC IP 就可以測試看看是否不需要輸入密碼直接登入 沒問題就可以輸入exit 離開

2-2. 設定 shell_command

接下來我們需要設定要跑的 shell_command 但是 HA 內 shell_command 能跑的只能在 /homeassistant 底下 所以我們需要把剛剛產出的金鑰複製到 /homeassisant 下才能使用 先執行下面指令找到產出的金鑰位置

bash
find / -name known_hosts
HA SSH iMessage 轉發 LINE 教學截圖 04

進入找到的資料夾 並列出裡面的檔案有哪些

bash
cd /data/.ssh
ls
HA SSH iMessage 轉發 LINE 教學截圖 05

確認有看到剛剛產出的3個必要檔案 注意id 可能會不同 將這3個檔案複製到 /homeassistant/.ssh 底下

bash
mkdir /homeassistant/.ssh
cp id_ed25519 /homeassistant/.ssh
cp id_ed25519.pub /homeassistant/.ssh
cp known_hosts /homeassistant/.ssh
HA SSH iMessage 轉發 LINE 教學截圖 06

確認必要檔案都有複製過來 3個檔案都有後就可以建立 shell_command 了

bash
shell_command:
  send_imessage: >-
    ssh -i /config/.ssh/id_ed25519
    -o IdentitiesOnly=yes
    -o StrictHostKeyChecking=no
    -o UserKnownHostsFile=/config/.ssh/known_hosts
   MAC使用者id@MAC IP
    /Users/MAC使用者id/send_imessage_b64.sh {{ phone }} {{ message_b64 }}
    
  send_imessage_photo: >-
    ssh -i /config/.ssh/id_ed25519
    -o IdentitiesOnly=yes 
    -o StrictHostKeyChecking=no 
    -o UserKnownHostsFile=/config/.ssh/known_hosts
    MAC使用者id@MAC IP
    '/Users/MAC使用者id/send_imessage_photo.sh "{{ phone }}" "{{ message_b64 }}" "{{ image_url }}"'

注意 檔案名稱 如果你跟我的不同要同步更改免得出錯

HA SSH iMessage 轉發 LINE 教學截圖 07

建好後重開HA讓設定生效

重開完後到開發工具==>操作測試是否能正常發送訊息

bash
action: shell_command.send_imessage
data:
  phone: "+8869XXXXXXXX"
  message_b64: "SGVsbG8="

記得將電話號碼改成你要收發訊息的 iPhone 號碼

HA SSH iMessage 轉發 LINE 教學截圖 08

執行操作如果沒有問題就會像紅匡這樣回覆 到這邊我們從HA透過SSH傳送訊息到Mac 發送iMessage已經完成

3. 透過 iPhone 捷徑自動化轉發訊息到 Line

首先到 Line 創建你要接收轉發訊息的群組 然後隨便發送個訊息

HA SSH iMessage 轉發 LINE 教學截圖 09

然後 捷徑 ==> 自動化 新增一個自動化選擇 訊息

HA SSH iMessage 轉發 LINE 教學截圖 10

進來後選擇 將確認後執行改成立即執行 以及 訊息包含裡面去設定關鍵詞 至於寄件人如果是由自己的MAC轉發就不用選擇 保持任何寄件人就好 如果是透過別人的MAC發送 iMessage就改成那個幫你轉發的號碼

設定好後下一步 新增捷徑

HA SSH iMessage 轉發 LINE 教學截圖 13

往下拉找到 Line 然後在其他找到你剛剛創建的群組 如果你剛剛有隨便發個訊息應該能看到

HA SSH iMessage 轉發 LINE 教學截圖 14

選擇後會跳出來選擇 訊息

HA SSH iMessage 轉發 LINE 教學截圖 15

選擇 選取變數

HA SSH iMessage 轉發 LINE 教學截圖 16

這時候 將訊息作為輸入接收 下面會多出一個 捷徑輸入 點他

HA SSH iMessage 轉發 LINE 教學截圖 17

這樣就可以完成轉發設定 就可以打勾儲存了

HA SSH iMessage 轉發 LINE 教學截圖 18

到這邊基本設定都完成了就可以回到HA進行測試

4.最終測試

因我們都是透過HA這邊轉成Base64 再傳到MAC 所以我們需要先把剛剛在捷徑設定的通知包含內設定的文字轉成Base64才能測試

HA SSH iMessage 轉發 LINE 教學截圖 19

回到開發工具 操作 將 message_b64 改成剛剛轉成 Base64的碼測試

確認可以後就沒問題了

目前只能 iMessage 文字轉發到 Line 而已 還沒有發現 iMessage 圖片轉發到 Line 的方式 不過將圖片傳到 iMessage 這部分是沒有問題的 如果有人有這方面資訊再麻煩告知 至於怎麼應用 就看個人要怎麼改

透過NR傳送通知的設定我會分享到這篇文章裡面

設定畫面可能因版本與設備不同而有差異。想交流使用經驗,歡迎加入惟家 LINE 社群;社群以使用者互助為主,非官方一對一技術支援。

HA 透過 SSH 經 Mac 傳送 iMessage 轉發到 LINE | 惟家 JustPlus