The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"updatedAt": "2025-10-06T02:58:37.000Z",
"createdAt": "2025-10-01T17:10:49.724Z",
"id": "SSGSakJD6Aa4egmF",
"name": "Absen Nami",
"active": true,
"isArchived": false,
"nodes": [
{
"parameters": {
"command": "AbsenVersiAing/.env/bin/python3 absenNami.py",
"cwd": "/home/n8nbot/absen"
},
"type": "n8n-nodes-base.ssh",
"typeVersion": 1,
"position": [
400,
1680
],
"id": "fadae081-d4be-49a4-842a-c98d435e4bd7",
"name": "Absen",
"credentials": {
"sshPassword": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "// --- Mention User ---\nconst userId = \"664803448629493816\";\nconst mention = `<@${userId}>`;\n\n// --- Ambil output dari node sebelumnya (opsional) ---\nconst stdout = $input.first()?.json?.stdout || \"\u26a0 Tidak ada output dari script.\";\n\n// --- Ambil waktu sekarang ---\nconst now = new Date();\n\n// --- Hari dalam bahasa Inggris (Monday, Tuesday, ...) ---\nconst dayNames = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"];\nconst rawDay = dayNames[now.getDay()];\n\n// --- Jam sekarang dalam HH:mm ---\nconst pad = (n) => String(n).padStart(2, \"0\");\nconst rawTime = `${pad(now.getHours())}:${pad(now.getMinutes())}`;\n\n// --- Normalisasi nama hari ---\nconst dayMap = {\n 'senin': 'Monday', 'selasa': 'Tuesday', 'rabu': 'Wednesday', 'kamis': 'Thursday', 'jumat': 'Friday', 'jum\\'at': 'Friday',\n 'mon': 'Monday', 'monday': 'Monday',\n 'tue': 'Tuesday', 'tues': 'Tuesday', 'tuesday': 'Tuesday',\n 'wed': 'Wednesday', 'wednesday': 'Wednesday',\n 'thu': 'Thursday', 'thur': 'Thursday', 'thursday': 'Thursday',\n 'fri': 'Friday', 'friday': 'Friday'\n};\nconst dayKey = dayMap[rawDay.toLowerCase()] || rawDay;\n\n// --- Jadwal kuliah ---\nconst schedule = {\n Monday: [\n { time: \"08:00\", end: \"09:40\", subject: \"Metodologi Penelitian\", lecturer: \"Dr. Maulisa Oktiana\", room: \"Lab Elektro IV\" }\n ],\n Tuesday: [\n { time: \"10:45\", end: \"12:25\", subject: \"Artificial Inteligent\", lecturer: \"Ir. Yudha Nurdin, ST., MT\", room: \"A14-302\" }\n ],\n Wednesday: [\n { time: \"10:40\", end: \"12:25\", subject: \"Sistem Terdistribusi\", lecturer: \"Ir. Yudha Nurdin, ST., MT\", room: \"A25-201\" },\n { time: \"14:00\", end: \"15:40\", subject: \"Pengolahan Sinyal Multimedia\", lecturer: \"Dr. Maulisa Oktiana\", room: \"A12-302\" }\n ],\n Thursday: [\n { time: \"08:00\", end: \"09:40\", subject: \"Keamanan Informasi\", lecturer: \"Ir. Sayed Muchalili, S.T., M.Sc., IPM\", room: \"A12-304\" },\n { time: \"10:45\", end: \"13:15\", subject: \"Keamanan Jaringan\", lecturer: \"Prof. Dr. Ir. Teuku Yuliar Arif, S.T., M.Kom\", room: \"A24-102\" },\n { time: \"14:00\", end: \"15:45\", subject: \"Sistem Embedded\", lecturer: \"Ir. Rahmad Dawood, S.Kom., M.Sc., IPM\", room: \"Lab Terpadu\" }\n ],\n Friday: [\n { time: \"08:00\", end: \"09:40\", subject: \"Praktikum Distribusi\", lecturer: \"Pak Yudha\", room: \"A12-304\" },\n { time: \"16:30\", end: \"18:15\", subject: \"Tata Tulis Ilmiah\", lecturer: \"Dr. Maulisa Oktiana\", room: \"A12-304\" }\n ]\n};\n\n// --- Helper: parse HH:MM ke menit ---\nfunction parseTimeToMinutes(t) {\n if (!t) return null;\n t = String(t).trim().replace(/\\./g, ':');\n const m = t.match(/(\\d{1,2}):(\\d{2})/);\n if (!m) return null;\n let hh = parseInt(m[1], 10);\n let mm = parseInt(m[2], 10);\n if (isNaN(hh) || isNaN(mm)) return null;\n return hh * 60 + mm;\n}\n\nlet mataKuliah = \"\u2753 Tidak ada jadwal terdaftar.\";\nlet dosen = \"-\";\nlet ruangan = \"-\";\nlet jadwalWaktu = \"-\";\n\nconst nowMinutes = parseTimeToMinutes(rawTime);\n\n// --- Cari jadwal sesuai hari & waktu ---\nif (dayKey && schedule[dayKey]) {\n const rows = schedule[dayKey];\n\n if (nowMinutes !== null) {\n // cek kelas yang sedang berlangsung\n for (const r of rows) {\n const start = parseTimeToMinutes(r.time);\n const end = parseTimeToMinutes(r.end);\n if (start !== null && end !== null && nowMinutes >= start && nowMinutes <= end) {\n mataKuliah = r.subject;\n dosen = r.lecturer;\n ruangan = r.room;\n jadwalWaktu = `${r.time} - ${r.end}`;\n break;\n }\n }\n }\n\n // kalau belum ada kelas sekarang, ambil yang berikutnya\n if (mataKuliah.startsWith(\"\u2753\") && nowMinutes !== null) {\n const upcoming = rows\n .map(r => ({ ...r, start: parseTimeToMinutes(r.time) }))\n .filter(r => r.start !== null && r.start > nowMinutes)\n .sort((a, b) => a.start - b.start);\n\n if (upcoming.length > 0) {\n const next = upcoming[0];\n mataKuliah = `Tidak ada kelas sekarang. Berikutnya: ${next.subject}`;\n dosen = next.lecturer;\n ruangan = next.room;\n jadwalWaktu = `${next.time} - ${next.end}`;\n }\n }\n} else {\n mataKuliah = \"\u274c Hari ini tidak ada jadwal kuliah.\";\n}\n\n// --- Format pesan final ---\nconst finalMessage =\n `\ud83d\udd5c **Absen Otomatis**\n${mention} Nami\n\n\ud83d\udccc Status: ${stdout}\n\ud83d\udcc5 Hari: ${rawDay}\n\u23f0 Jam: ${rawTime}\n\ud83d\udcd6 Mata Kuliah: ${mataKuliah}\n\ud83d\udc68\u200d\ud83c\udfeb Dosen: ${dosen}\n\ud83c\udfeb Ruangan: ${ruangan}\n\ud83d\uddd3 Jadwal: ${jadwalWaktu}`;\n\nreturn [{ json: { text: finalMessage } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
544,
1680
],
"id": "329bfda3-ecf2-4bba-b1e8-e59b33496bf7",
"name": "Code3"
},
{
"parameters": {
"authentication": "webhook",
"content": "={{ $json.text }}\n-----------------------------------------",
"options": {}
},
"type": "n8n-nodes-base.discord",
"typeVersion": 2,
"position": [
752,
1680
],
"id": "e0e8e976-dcde-4e5d-88eb-8488fc34a721",
"name": "Discord3",
"credentials": {
"discordWebhookApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 8,
"triggerAtMinute": 5
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
1680
],
"id": "63ef1b78-6632-473c-985b-601ecc20b862",
"name": "Metopen",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
2
],
"triggerAtHour": 10,
"triggerAtMinute": 50
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-176,
1536
],
"id": "465d5c40-c70c-41a6-8e65-2cceb204944a",
"name": "AI"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
4
],
"triggerAtHour": 8,
"triggerAtMinute": 5
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
160,
1536
],
"id": "5900fa81-0745-4f39-9e67-9a62f2f9240b",
"name": "Informasi",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
4
],
"triggerAtHour": 10,
"triggerAtMinute": 50
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
1536
],
"id": "90187a42-4500-469a-a13f-7f2ab83ff947",
"name": "Jaringan"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
3
],
"triggerAtHour": 10,
"triggerAtMinute": 50
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
176,
1840
],
"id": "c3407198-e80b-4736-a0bf-aca568701ab8",
"name": "Distribusi"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
4
],
"triggerAtHour": 14,
"triggerAtMinute": 5
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-176,
1840
],
"id": "0cb2ac5d-fec3-4bab-beca-e1b2e305332b",
"name": "Embedded",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
3
],
"triggerAtHour": 14,
"triggerAtMinute": 5
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-176,
1680
],
"id": "1729e73a-4344-4b42-88f8-bfb0d95c1436",
"name": "Sinyal",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
5
],
"triggerAtHour": 16,
"triggerAtMinute": 40
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
160,
1680
],
"id": "570168e5-4fca-4444-aece-316835f6af8f",
"name": "Tatul",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
5
],
"triggerAtHour": 8,
"triggerAtMinute": 5
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
1840
],
"id": "f96cc745-6616-4e6d-a9ab-47035364e775",
"name": "prak distribusi",
"executeOnce": false
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
4
],
"triggerAtHour": 15,
"triggerAtMinute": null
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-336,
1680
],
"id": "c017d2c5-01b8-4dac-983c-53fdfda050e4",
"name": "PrakEmbedded",
"executeOnce": false
}
],
"connections": {
"Absen": {
"main": [
[
{
"node": "Code3",
"type": "main",
"index": 0
}
]
]
},
"Code3": {
"main": [
[
{
"node": "Discord3",
"type": "main",
"index": 0
}
]
]
},
"Informasi": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Distribusi": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Tatul": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"prak distribusi": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Metopen": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Jaringan": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"AI": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Sinyal": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"Embedded": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
},
"PrakEmbedded": {
"main": [
[
{
"node": "Absen",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "AvhjGJdACMdnvIEn"
},
"staticData": {
"node:Metopen": {
"recurrenceRules": []
},
"node:AI": {
"recurrenceRules": []
},
"node:Informasi": {
"recurrenceRules": []
},
"node:Jaringan": {
"recurrenceRules": []
},
"node:Distribusi": {
"recurrenceRules": []
},
"node:Embedded": {
"recurrenceRules": []
},
"node:Sinyal": {
"recurrenceRules": []
},
"node:Tatul": {
"recurrenceRules": []
},
"node:prak distribusi": {
"recurrenceRules": []
},
"node:PrakEmbedded": {
"recurrenceRules": []
},
"node:Metopen1": {
"recurrenceRules": []
},
"node:AI1": {
"recurrenceRules": []
},
"node:Informasi1": {
"recurrenceRules": []
},
"node:Jaringan1": {
"recurrenceRules": []
},
"node:Distribusi1": {
"recurrenceRules": []
},
"node:Embedded1": {
"recurrenceRules": []
},
"node:Sinyal1": {
"recurrenceRules": []
},
"node:Tatul1": {
"recurrenceRules": []
},
"node:prak distribusi1": {
"recurrenceRules": []
},
"node:PrakEmbedded1": {
"recurrenceRules": []
}
},
"meta": null,
"versionId": "ca4acb9a-2259-48b7-826e-0da96d98a3f2",
"triggerCount": 10,
"shared": [
{
"updatedAt": "2025-10-01T17:10:49.731Z",
"createdAt": "2025-10-01T17:10:49.731Z",
"role": "workflow:owner",
"workflowId": "SSGSakJD6Aa4egmF",
"projectId": "DiQC0tGxFhuiK9UM"
}
],
"tags": [
{
"updatedAt": "2025-10-01T17:10:43.185Z",
"createdAt": "2025-10-01T17:10:43.185Z",
"id": "kFo2wAHgXOGuNR0l",
"name": "Absen"
}
]
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
discordWebhookApisshPassword
About this workflow
Absen Nami. Uses ssh, discord, scheduleTrigger. Scheduled trigger; 13 nodes.
Source: https://github.com/SamVivan1/n8n-Workflows-Backup/blob/main/absen-nami-SSGSakJD6Aa4egmF.json — original creator credit. Request a take-down →