Artikel ini menunjukkan cara untuk membuat notifikasi gotosocial sendiri dengan memanfaatkan Telegram Bot. Kode dibuat dengan typescript Deno. Saya pribadi sudah tidak memakai kode ini dan bermigrasi ke Python karena memasangnya di dalam VPS. Secara garis besar sama, hanya saja saya memilih untuk self host. Repo untuk versi Python bisa dilihat di Py-Teledon
Sampai dengan rilis v.0.16.0 Gotosocial masih belum menyertakan fitur push notification ke dalam aplikasinya. Menurut salah satu developer-nya pengaktifan notifikasi membutuhkan banyak sumber daya karena harus merubah sebagian besar kode meski sebenarnya Gotosocial sendiri sudah mendukung API untuk mengirim notifikasi.
Oleh karena itu mengakses API ini dan sedikit trik memanfaatkan layanan WebPush lainnya bisa dipakai untuk membuat notifikasi Gotosocial. Salah satunya bisa pakai cara yang dibuat oleh Joel Carnat dalam GoToSocial Push notifications using Pushover. Joel membuat shell script untuk menarik data notifikasi kemudian menyimpannya dalam bentuk text file dan kemudian dikirim ke layanan PushOver1.
Selanjutnya PushOver akan mengirim data notifikasi tersebut ke aplikasi PushOver yang sudah terpasang di hape.
Menarik tapi saya tidak ikuti cara ini karena PushOver tidak gratis. Namun ada layanan lain yang mirip dan Open Source seperti ntfy yang merupakan layanan berbasis HTTP pub-sub notifikasi. Syaratnya sama kudu pasang aplikasi khusus di hape.
Pakai ntfy ini mudah, sangat mudah. Namun setelah beberapa jam saya coba ada fitur yang tidak bisa saya temukan (untuk saat ini) yaitu rich text format. ntfy memang sudah mendukung penggunaan Markdown namun terbatas di web appnya sedangkan di mobile devices belum tersedia.
Alternatif lainnya adalah memakai messaging services seperti Whatsapp, Signal, atau Telegram. Dan saya memilih yang terakhir ini.
Rencana skema kerja #

Jika Joel Carnat mempergunakan shell script maka disini saya akan pakai Deno dengan Typescript, data akan disimpan di database postgresql kemudian dikirim ke Telegram bot.
Skemanya seperti ini:
- Script di Deno Deploy akan mengirimkan permintaan data (fetch) ke API Gotosocial,
- API Gotosocial akan mengirim data dalam format
JSONke Deno Deploy, - Deno Deploy kemudian mengolah data dan mengirimkan ke database Postgresql (dilayani oleh Neon Tech)
- Deno Deploy merubah data yang disimpan di Neon dan dikirim ke Telegram Bot
- Telegram Bot mengirimkan pesan ke chat room di hape
Sedangkan layanan yang dipakai adalah:
- Deno Deploy untuk hosting typescript ✅ gratis
- Gotosocial untuk layanan fediverse (self host)
- Neon Tech untuk layanan hosting database ✅ gratis
- Telegram Bot untuk Bot di Telegram ✅ gratis
Berikut ini yang saya tandai dengan stabilo warna hijau adalah hal yang penting untuk disimpan.
Telegram Bot #
Layanan pertama yang saya buat adalah Telegram Bot yang nantinya sebagai perantara pengiriman pesan ke Chat Telegram.
Cara bikin Bot ini mudah sekali, cari Bot Father di Telegram dan mulai berbicara dengan dia untuk membuat Bot baru atau ketik /newbot , jawab saja semua pertanyaan Bot Father sampai kemudian Bot selesai dibuat. Disini saya beri nama Bot misalnya BibitBobot 2.
Selain itu perlu juga mendapatkan Chat ID, caranya bisa mengikuti How to get Telegram Bot Chat ID
Jangan lupa simpan access tokennya dan nomer Chat ID karena ini diperlukan untuk berkomunikasi dengan Bot Poestodon.
Database #
Awalnya saya hendak pakai Deno Kv untuk databasenya, namun mengingat pemahaman saya terhadap Kv yang pas - pasan akhirnya saya memutuskan pakai Postgresql3.
Untungnya di luar sana banyak layanan Postgresql gratisan diantaranya Supabase, Koyeb, dan Neon Tech. Pilihan saya jatuh antara Supabase dan Neon Tech karena sudah disupport oleh Deno secara langsung.
Daftar ke Neon Tech dan pilih Free Tier dapat storage 500Gb, 0.25 CPU, RAM 1Gb, dan bandwidth 5Gb sebulan rasanya sudah cukup. Setelah mendaftar simpan connection string untuk nanti terhubung ke database.
Tidak perlu membuat table dan skemanya karena nanti dibuat melalui script di Deno Deploy.
Gotosocial API #
Untuk mengakses API Gotosocial membutuhkan token khusus, cara bikinnya susah - susah mudah dengan mengikuti tutorial Authentication With API di dokumentasi Gotosocial.
Setelah dapat access token simpan karena akan dibutuhkan nanti untuk terhubung ke API Gotosocial.
Script #
Saya membuat script di localhost meskipun sebenarnya langsung dari Deno Deploy Playground bisa, namun saya ingin memisahkan antara membuat table Postgres dengan script utamanya.
Contoh dibawah hanya diambil sepotong - potong, sedangkan keseluruhan script bisa dilihat di repo Github poestldn
Poes Tele Don : Mengirimkan notifikasi Gotosocial dengan Telegram Bot
Environtment Variabel (.env) #
Ingat dengan teks yang diberi stabilo hijau di atas?, Maka disinilah fungsinya untuk diinput ke environtment files. Tujuan dimasukkan file .env adalah soal keamanan. Jadi bikin file .env kemudian isi seperti contoh berikut
GTS_TOKEN=VX24HKY4XL94FBIYBWC9G76U4F76MJJG
GTS_API=https://domain.tld/api/v1/notifications?limit=10
TELE_BOT=729830130381:hcOJWxaJyhHD1eEVk8zLV1Y-txR5ctt5fE9
TELE_CHATID=6432838383
DB_URL=postgresql://username:password@ep-weathered-snowflake-86743.ap-southeast-1.aws.neon.tech/notidb?sslmode=require
Isi dari .env ini akan dipanggil ke dalam script dengan Deno.env.get() .
Membuat table database #
File initdb.ts dibuat khusus untuk membuat table database. Skema tablenya sendiri seperti ini:
| pk | name | type | null |
|---|---|---|---|
| ✓ | id | INTEGER | ✓ |
| inreplyto | VARCHAR(100) | ✓ | |
| post_id | VARCHAR(100) UNIQUE | ✓ | |
| created_at | TIMESTAMP | ||
| handler | VARCHAR(50) | ✓ | |
| display_name | VARCHAR(256) | ✓ | |
| type | VARCHAR(20) | ✓ | |
| status | VARCHAR(10000) | ✓ | |
| remark | VARCHAR(10) | ✓ |
Isi tabel ini nanti diambil dari fetch data API Gotosocial.
Untuk membuat database dan populasi tabel bisa dengan menjalankan perintah
$ deno run -A --env initdb.ts
Fetch data dari API Gotosocial #
Keseluruhan fungsi ada di file main.ts saya membaginya menjadi 3 fungsi berbeda4 yaitu
requestNotif()berfungsi untuk menarik data dari API Gotosocial dan menyimpannya ke dalam database, Contoh scriptnya seperti berikut ini:const conn = await Pool.connect(); async function requestNotif() { const f = await fetch(`${Deno.env.get("GTS_API")}`, { method: "GET", headers: { "Content-Type": "Application/json", Authorization: `Bearer ${Deno.env.get("GTS_TOKEN")}`, }, }); const data = await f.json(); console.log(data); for (const d of data) { conn.queryObject` INSERT INTO ptldn (post_id, created_at, handler, display_name, type, remark) VALUES (${d.id}, ${d.created_at}, ${d.account.acct}, ${d.account.display_name}, ${d.type}, ${remark}) ON CONFLICT (post_id) DO NOTHING `; }Fungsi
ON CONFLICT (post_id) DO NOTHINGbertugas memeriksa apakah di tabel kolompost_idsudah ada isi yang identik, jika ditemukan maka tidak akan diproses sehingga tidak ada 2 baris yang memilikipost_idyang identik.Dari hasil
fetchtidak semua value saya ambil dan simpan, hanya yang penting atau yang diperlukan saja.sendNotif()digunakan untuk mengirimkan data notifikasi dari database ke Telegram Bot. Contoh script sebagai berikut:const query = await conn.queryObject` SELECT * FROM ptldn WHERE remark = 'USEND' ORDER BY created_at ASC `; const data = query.rows; for (const d of data) { await fetch( `https://api.telegram.org/bot${Deno.env.get("TELE_BOT")}/sendMessage`, { method: "POST", headers: { "Content-Type": "Application/json", }, body: JSON.stringify({ chat_id: `${Deno.env.get("TELE_CHATID")}`, parse_mode: "markdown", text: `*${d.display_name}* _${d.handler}_ ${flag} ${d.type} you! `, }), };Karena hasil
fetchberupa javascript object maka perlu merubahnya menjadi text biasa denganJSON.stringify.Skemanya adalah Deno akan meng-query data dari database dengan syarat (WHERE) kolom remark berisi ‘USEND’ sebagai tanda notifikasi belum terkirim.
parse_modedi Telegram mendukung HTML dan Markdown, tapi untuk data dari Gotosocial sepertinya lebih pas pakai mode Markdown. Lebih lengkapnya tentang hal ini bisa dibaca di Style text with message entities. Karena pakai Markdown, maka saya perlu menghilangkan beberapa entities HTML yang ada (karena perbedaan client) dengan fungsireplacedan Regex.markNotif()setelah semua notifikasi terkirim ke Telegram Bot, maka Deno akan memeriksa semua baris di dalam database dan merubah isi kolom remark dari ‘USEND’ ke ‘SEND’. Saya paham kalo fungsi ini opinionated banget, tapi ini bekerja untuk saya yang notifikasi Gotosocialnya tidak banyak dan jarang - jarang.async function markNotif() { await conn.queryObject` UPDATE ptldn SET remark = 'SEND' `; }Fungsi ini masih bisa dikembangkan lagi ke depannya. Tapi untuk saat ini bisa bekerja dengan baik.
Selanjutnya semua fungsi harus berjalan secara periodik (terskedul), maka Deno.Cron() bisa dimanfaatkan. Seperti namanya Deno.Cron5 dipakai untuk membuat schedule jobs seperti fungsi cronjob di shell.
Saya membuat skedul untuk masing - masing fungsi dengan jarak sekitar 60 detik antar skedul untuk memastikan proses pertama sudah selesai.
Deno.cron("Sedot Notification dari Gotosocial", "*/3 * * * *", () => {
requestNotif();
});
Deno.cron("Lempar Notification ke Telegram Bot", "*/4 * * * *", () => {
sendNotif();
});
Deno.cron("Tandai Notification yang sudah dilempar", "*/5 * * * *", () => {
markNotif();
});
Skedul diatas akan mengeksekusi perintah requestNotif() setiap 3 menit, dilanjutkan perintah lain dengan jeda masing - masing 60 detik.
Deployment #
Setelah semua beres, saya melakukan deploy script ke Deno Deploy sebagai hosting dengan metode Git Integration, yaitu dengan menghubungkan repository Github ke Deno Deploy kemudian mengarahkan agar file main.ts menjadi entry point atau file yang akan dijalankan oleh Deno Deploy.
Secara default Deno Deploy sudah mengaktifkan --unstable-cron --env sehingga bisa langsung jalan tanpa ada modifikasi perintah. Untuk .env bisa mempergunakan Environment Variables yang bisa diakses dari menu Settings. Disini masukkan nama dan value dari varibel sama persis dengan isian di dalam file .env.
Setelah repositori Github dihubungkan, secara otomatis Deno Deploy akan membuild script yang ada.
Screenshot hasil #
Berikut ini adalah contoh screenshot hasil dari script ini:

