Iceshrimp.NET Push Notification dengan ntfy
{{< callout emoji=โ๐กโ >}}
Push Notifications pada Iceshrimp.NET bekerja seperti sebagaimana mestinya pada client populer Mastodon, jadi sebenarnya kamu tidak perlu menggunakan skrip ini.
{{< /callout >}}
Skrip yang saya buat sangat berdasarkan pada tutorial ini https://www.tumfatig.net/2024/gotosocial-push-notifications-using-pushover/. Saya hanya mengganti beberapa kode karena ada perbedaan struktur JSON antara GtS dan Shrimp.
Mari langsung ke inti pembuatannya, install terlebih dahulu
jq
, setelah itu buatlah skrip bash baru:
#!/bin/bash
#
# Skrip notifikasi instan dengan memanfaatkan ntfy
# Sumber ide berasal dari https://www.tumfatig.net/2024/gotosocial-push-notifications-using-pushover/
# Konfigurasi standar
SHRIMP_HOST="<host>"
SHRIMP_TOKEN="<token>"
NTFY_HOST="<host>"
NTFY_TOPIC="<topic>"
# Menyimpan dan membaca notifikasi terakhir dari $LAST_NOTIF.
TMPFILE="/tmp/$(basename """$0""")_tmp"
if [ -f "$TMPFILE" ]; then . "$TMPFILE"; fi
# Untuk pertama hanya ambil 1 notif
# Jika sudah berjalan, ambil 20.
if [ -z "$LAST_NOTIF" ]; then
URL_PARAMS="?limit=1"
else
URL_PARAMS="?limit=20&min_id=$LAST_NOTIF"
fi
# Ambil notif dan kemudian kirim push.
NEW_NOTIF=""
curl -s \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${SHRIMP_TOKEN}" \
"https://${SHRIMP_HOST}/api/iceshrimp/notifications${URL_PARAMS}" \
| jq -r '.[] | { id, type, "acct": .user.displayName,
"avatar": .user.avatarUrl,
"content": (if .note.text == null then "" else .note.text end)
| gsub("<.+?>"; "") | gsub("\n"; " ") | .[0:100] }
| [ .id, .type, .acct, .content ]
| join("|")' | while read -r NOTIF; do
FIELDS=(); OFS=$IFS; IFS='"|"'
# Ubah csv ke dalam array.
for i in $NOTIF; do FIELDS+=($i); done
IFS=$OFS
# Simpan ID notifikasi terakhir.
if [ -z "$NEW_NOTIF" ]; then
NEW_NOTIF="${FIELDS[0]}"
echo "LAST_NOTIF=$NEW_NOTIF" > "$TMPFILE"
fi
# ntfy support emoji yang akan ditampilkan dengan tags, lebih lengkap: https://docs.ntfy.sh/emojis/
if [ "${FIELDS[1]}" = "like" ]; then FIELDS[1]="heart";
elif [ "${FIELDS[1]}" = "follow" ]; then
FIELDS[1]="wave";
FIELDS[4]="Mengikuti anda.";
elif [ "${FIELDS[1]}" = "followRequestAccepted" ]; then
FIELDS[1]="handshake"
FIELDS[4]="Kita berteman."
elif [ "${FIELDS[1]}" = "mention" ]; then FIELDS[1]="speech_balloon";
elif [ "${FIELDS[1]}" = "renote" ]; then FIELDS[1]="rocket";
elif [ "${FIELDS[1]}" = "update" ]; then FIELDS[1]="memo";
elif [ "${FIELDS[1]}" = "reaction" ]; then FIELDS[1]="sparkles";
fi
# Kirim push. dari siapa, tipe, pesan
# ${FIELDS[0]} #id
# ${FIELDS[1]} #tipe
# ${FIELDS[2]} #acct
# ${FIELDS[3]} #avatar
# $${FIELDS[4]} #content
# Kirim notif dengan curl
curl \
-H "Title: ${FIELDS[2]}" \
-H "Tags: ${FIELDS[1]}" \
-H "Icon: ${FIELDS[3]}" \
-H "Markdown: true" \
-d "$(echo "${FIELDS[4]}" | sed 's/@/ \@/')" \
https://n.netify.my.id/iceshrimp
done
exit 0
#EOF
IceshrimpNotif.sh
Untuk mendapatkan token, kamu bisa memanfaatkan swagger dari iceshrimp.
Skrip ini masih sederhana, hanya beberapa info yang saya ambil, dan masalah mengenai tags belum sepenuhnya saya ketahui. Mari kita bahas sedikit perubahan yang mungkin membuatmu tertarik.
{{< callout emoji=โ๐กโ >}}
Skrip dibawah tentu tidak sama dengan skrip update lengkap diatas, sengaja seperti itu semoga pembaca bisa memahami maksud dari skrip tersebut.
{{< /callout >}}
jq -r '.[] | { id, type, "acct": .user.displayName,
"content": (if .note.text == null then "" else .note.text end)
| gsub("<.+?>"; "") | gsub("\n"; " ") | .[0:100] }
| [ .id, .type, .acct, .content ]
Skrip di atas berfungsi untuk mengambil data JSON, yang mana
mengambil id
, type
,
user.displayName
, dan note.text
. Kemudian,
data tersebut saya simpan ulang ke dalam JSON juga, dengan variabel yang
berbeda yaitu id
, type
, acct
, dan
content
.
Kemudian karena konten ini memiliki banyak masalah ketika akan kita kirim ke server ntfy, maka akan kita proses ulang dengan:
gsub("<.+?>"; "")
: menghapus tag html.gsub("\n"; " ")
: mengubah newline menjadi spasi, jika tidak maka ketika kita masukkan kedalam skrip curl akan dianggap enter / kirim..[0:100]
: membatasi teks padacontent
hanya 100 karakter saja. Lagipula tidak begitu penting isinya apa, kita bisa membuka aplikasi kesayangan kita untuk melihat lebih lanjut.Ada lagi, yaitu @ namun sepertinya saya belum ketemu caranya haha, tetapi untuk mengatasi masalah itu, ada tambahan sed yang saya gunakan ketika mengirim push.FIXED!
curl \
-H "Title: ${FIELDS[2]}" \
-H "Tags: ${FIELDS[1]}" \
-H "Icon: ${FIELDS[3]}" \
-H "Markdown: true" \
-d "$(echo "${FIELDS[4]}" | sed 's/@/ \@/')" \
https://n.netify.my.id/iceshrimp
Tentu skrip di atas bisa kamu modifikasi sesuai keinginan, khusus
untuk -d
di sana terdapat sed 's/@/ \@/'
yang
fungsinya adalah mengganti @
pertama pada konten supaya
tidak dianggap memanggil file oleh curl.
Simpan skrip bash yang sudah kamu buat, dan kemudian jalankan. Jika berjalan lancar, tinggal masukkan ke dalam cronjob. Viola!
Update log:
- 29/7/2024 : Fix โ@โ ketika dikirim, berikan keterangan ketika follow / permintaan follow diterima, penambahan icon menggunakan avatar.