API και ενσωματώσεις
Κάθε δωμάτιο διαθέτει HTTP API. Ξεκινήστε και σταματήστε χρονόμετρα, εμφανίστε μηνύματα, προσθέστε χρόνο και διαβάστε το rundown από ένα script, ένα σύστημα show control ή οτιδήποτε μπορεί να στείλει ένα web request. Ένα webhook ενημερώνει το σύστημά σας όταν ένα χρονόμετρο ξεκινά ή τελειώνει.


Ξεκινήστε
Δημιουργήστε ένα κλειδί API
Ανοίξτε τα Κλειδιά API και κάντε κλικ στο Δημιουργία κλειδιού. Αντιγράψτε το αμέσως: εμφανίζεται μόνο μία φορά. Δείτε Ομάδα και κλειδιά API.
Βρείτε το id του δωματίου
Είναι το τμήμα μετά το /timer/r/ στη διεύθυνση του δωματίου ελέγχου, για παράδειγμα https://cliqer.io/timer/r/<room>/control.
Κάντε μια κλήση
Στείλτε το κλειδί με κάθε αίτημα. Το ping ελέγχει ότι το δωμάτιο υπάρχει.
Το API χειρίζεται το ίδιο δωμάτιο με το δωμάτιο ελέγχου: μια κλήση από το εργαλείο σας εμφανίζεται σε κάθε οθόνη ταυτόχρονα.
Αιτήματα
Κάθε κλήση έχει τη μορφή https://cliqer.io/api/timer/v1/<room>/<action>. Λειτουργούν τα GET, POST, PUT και PATCH. Οι παράμετροι μπαίνουν στο query string ή σε σώμα JSON στα POST, PUT και PATCH· όταν υπάρχουν και στα δύο, υπερισχύει το σώμα. Λειτουργούν και οι παύλες στο όνομα της ενέργειας, οπότε το add-time ισοδυναμεί με add_time. Το /api/timer/v0/ δέχεται τις ίδιες κλήσεις.
Στείλτε το κλειδί με έναν από τους παρακάτω τρόπους, οι οποίοι ελέγχονται με αυτή τη σειρά:
| Πού | Παράδειγμα |
|---|---|
Κεφαλίδα Authorization | Authorization: Bearer <key> |
Κεφαλίδα x-api-key | x-api-key: <key> |
Παράμετρος query api_key | ?api_key=<key>. Αποφύγετέ το όπου μπορείτε: οι διευθύνσεις καταλήγουν σε αρχεία καταγραφής. |
curl -X POST https://cliqer.io/api/timer/v1/<room>/add_time \
-H "Authorization: Bearer $CLIQER_KEY" \
-H "content-type: application/json" \
-d '{"timer_id": "<timer>", "amount": "2m"}'
const res = await fetch('https://cliqer.io/api/timer/v1/<room>/add_time', {
method: 'POST',
headers: { 'authorization': `Bearer ${process.env.CLIQER_KEY}`, 'content-type': 'application/json' },
body: JSON.stringify({ timer_id: '<timer>', amount: '2m' }),
})
const { ok, message, data } = await res.json()
import os, requests
r = requests.post(
"https://cliqer.io/api/timer/v1/<room>/add_time",
headers={"Authorization": f"Bearer {os.environ['CLIQER_KEY']}"},
json={"timer_id": "<timer>", "amount": "2m"},
)
print(r.json())
Κλειδιά και δικαιώματα
Το κλειδί API του λογαριασμού σας μπορεί να κάνει τα πάντα στα δωμάτια που σας ανήκουν. Ένα δωμάτιο μπορεί επίσης να έχει δικά του κλειδιά, το καθένα με κάποια από τα τρία δικαιώματα:
| Δικαίωμα | Επιτρέπει |
|---|---|
| Ανάγνωση (Read) | Τις ενέργειες get_ και το export. |
| Χειρισμός show (Show call) | Χειρισμό αναπαραγωγής, χρόνο, blackout, on air και μηνύματα. |
| Επεξεργασία (Edit) | Διαγραφή, εισαγωγή, raw intents και το webhook. |
Μια κλήση που χρειάζεται δικαίωμα το οποίο δεν έχει το κλειδί λαμβάνει 401. Το μυστικό ενός κλειδιού δωματίου εμφανίζεται μία φορά, όταν δημιουργείται. Για να χρησιμοποιήσετε το API, το πρόγραμμά σας πρέπει να περιλαμβάνει το API, δείτε Προγράμματα και όρια.
Ενέργειες
Το timer_id επιλέγει ένα χρονόμετρο με βάση το id του· το index το επιλέγει με βάση τη θέση του, μετρώντας από το 1. Όταν στέλνονται και τα δύο, υπερισχύει το timer_id. Αν παραλείψετε και τα δύο, η ενέργεια εφαρμόζεται στο τρέχον χρονόμετρο.
| Ενέργεια | Επιστρέφει |
|---|---|
get_room | Τίτλο, ημερομηνία, ζώνη ώρας και ρυθμίσεις. |
get_status | Τι εκτελείται αυτή τη στιγμή. |
get_timers | Το rundown. |
get_messages | Τα μηνύματα. |
get_questions | Τις ερωτήσεις του κοινού. |
get_connections | Τις συνδεδεμένες συσκευές. |
get_logs | Το αρχείο καταγραφής του δωματίου. limit, offset. |
export | Ολόκληρο το δωμάτιο ως αρχείο cliqer-timer-<room>.json για λήψη. |
| Ενέργεια | Παράμετροι | Λειτουργία |
|---|---|---|
start, start_or_stop | timer_id ή index | Ξεκινά ή εναλλάσσει έναρξη και διακοπή. |
stop | Σταματά το χρονόμετρο που εκτελείται. | |
start_fresh | timer_id ή index | Ξεκινά από την πλήρη διάρκεια. |
select | timer_id ή index (απαιτείται ένα από τα δύο) | Το ορίζει ως τρέχον χωρίς να το ξεκινήσει. |
reset | timer_id ή index, autostart, from_memory | Επαναφορά στην πλήρη διάρκεια. |
next, previous | autostart, from_memory | Μετακίνηση μέσα στο rundown. |
add_time, subtract_time | timer_id, amount | Αλλάζει τη διάρκεια ενός χρονομέτρου. |
jump | amount | Μετακινεί το χρονόμετρο που εκτελείται κατά αυτό το διάστημα. |
set_remaining | amount | Ορίζει τον χρόνο που απομένει. |
flash | count, message | Κάνει τις οθόνες να αναβοσβήνουν. |
stop_flash | Σταματά το αναβόσβημα. | |
blackout | on | Ενεργοποίηση ή απενεργοποίηση του blackout. |
blackout_on, blackout_off, toggle_blackout | Το ίδιο, χωρίς παράμετρο. | |
focus | on | Εστίαση στο μήνυμα. |
on_air | on | Η ένδειξη On air. |
show_message | message_id, focus | Εμφανίζει ένα μήνυμα. |
toggle_message | message_id | Το εμφανίζει ή το κρύβει αν ήδη εμφανίζεται. |
hide_message | Κρύβει το μήνυμα. |
| Ενέργεια | Παράμετροι | Λειτουργία |
|---|---|---|
delete_timer | timer_id | Διαγράφει ένα χρονόμετρο. |
delete_message | message_id | Διαγράφει ένα μήνυμα. |
delete_question | question_id | Διαγράφει μια ερώτηση. |
import_csv | csv, replace, date_line, columns, header_row, rows | Εισάγει γραμμές, όπως στην Εισαγωγή από το Stagetimer. |
intent | {"intent": {...}} | Οποιαδήποτε αλλαγή μπορεί να κάνει το δωμάτιο ελέγχου, ως JSON. |
webhook | url | Ορίζει ή καταργεί το webhook. Δείτε παρακάτω. |
| Ενέργεια | Παράμετροι | Λειτουργία |
|---|---|---|
ping | Απαντά pong αν το δωμάτιο υπάρχει. | |
submit_question | text (έως 1000 χαρακτήρες), name (έως 100) | Στέλνει μια ερώτηση του κοινού. |
vote_question | question_id | Ψηφίζει μια ερώτηση. |
Οι τιμές χρόνου είναι 30s, 5m, 1h, 250ms ή ένας σκέτος αριθμός δευτερολέπτων. Το seconds λειτουργεί στη θέση του amount και ένα πρόσημο μείον μετακινεί προς τα πίσω. Οι διακόπτες όπως τα on, autostart και replace ερμηνεύουν τα 0, false, off και no ως απενεργοποίηση και οτιδήποτε άλλο ως ενεργοποίηση. Παραλείψτε το on στο blackout για εναλλαγή.
Αποκρίσεις
Κάθε απάντηση είναι JSON: {"ok": true, "message": "<action>", "data": ...} σε επιτυχία, {"ok": false, "message": "...", "code": "..."} σε αποτυχία.
| Κατάσταση | Μήνυμα | Αιτία |
|---|---|---|
| 400 | Either timer_id OR index are required | select χωρίς χρονόμετρο. |
| 400 | amount is required, like 30s, 5m or 1h | Η τιμή χρόνου λείπει ή δεν μπορεί να διαβαστεί. |
| 400 | Refused: invalid | Το δωμάτιο δεν μπόρεσε να την εφαρμόσει. |
| 401 | Access Denied: Valid API key required | Δεν υπάρχει κλειδί, το κλειδί είναι λάθος ή λείπει κάποιο δικαίωμα. |
| 403 | The API is not in this plan | Το πρόγραμμα του δωματίου δεν περιλαμβάνει API. |
| 403 | Refused: forbidden, Refused: readOnly, Refused: limitReached | Δεν επιτρέπεται, το δωμάτιο είναι μόνο για ανάγνωση ή έχει εξαντληθεί ένα όριο του προγράμματος. |
| 404 | Room not found, Unknown action <name>, Timer not found | Ελέγξτε το id του δωματίου, την ενέργεια ή το id του χρονομέτρου. |
| 409 | Refused: staleEpoch | Η κατάσταση του δωματίου άλλαξε κατά τη διάρκεια της κλήσης. Στείλτε την ξανά. |
| 429 | Too many requests. Please try again later. | Όριο ρυθμού αιτημάτων. |
| 503 | Refused: authorityOffline | Το δωμάτιο βρίσκεται στον κάδο. Επαναφέρετέ το πρώτα. |
Όριο ρυθμού: 100 κλήσεις το λεπτό ανά κλειδί· οι κλήσεις χωρίς κλειδί μετρώνται ανά διεύθυνση. Κάθε απάντηση περιέχει τα RateLimit-Limit, RateLimit-Remaining και RateLimit-Reset (δευτερόλεπτα μέχρι να ξεκινήσει ξανά το λεπτό).
Webhooks
Ορίστε τη διεύθυνση
Καλέστε το webhook με ένα url τύπου https. Η απάντηση περιέχει ένα secret που ξεκινά με whsec_. Αποθηκεύστε το: εμφανίζεται μία φορά.
Λάβετε συμβάντα
Το Cliqer Timer στέλνει ένα POST σε αυτή τη διεύθυνση όταν συμβαίνει κάτι στο δωμάτιο.
Ελέγξτε την υπογραφή
Επαληθεύστε κάθε αίτημα πριν το εμπιστευτείτε.
Καταργήστε το
Καλέστε το webhook χωρίς url. Διαγράφονται τόσο η διεύθυνση όσο και το μυστικό της.
| Συμβάν | Πότε |
|---|---|
timerStarted | Ένα χρονόμετρο ξεκινά. |
timerEnded | Ένα χρονόμετρο φτάνει στο μηδέν. |
wrapUpYellow | Ένα χρονόμετρο φτάνει στο κίτρινο σημείο ολοκλήρωσης. |
wrapUpRed | Ένα χρονόμετρο φτάνει στο κόκκινο σημείο ολοκλήρωσης. |
messageShown | Εμφανίζεται ένα μήνυμα. |
Το σώμα είναι {"event", "roomId", "timestamp", "payload"}. Η κεφαλίδα x-cliqer-timestamp περιέχει τον χρόνο Unix σε δευτερόλεπτα και η x-cliqer-signature περιέχει το sha256= ακολουθούμενο από το δεκαεξαδικό HMAC-SHA256 του <timestamp>.<body> με κλειδί το μυστικό σας.
# Recompute the signature of a saved body.
printf '%s.%s' "$TIMESTAMP" "$(cat body.json)" \
| openssl dgst -sha256 -hmac "$WHSEC" -hex
import { createHmac, timingSafeEqual } from 'node:crypto'
export function verify(rawBody: string, timestamp: string, signature: string, secret: string) {
const want = `sha256=${createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')}`
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300
return fresh && want.length === signature.length && timingSafeEqual(Buffer.from(want), Buffer.from(signature))
}
import hashlib, hmac, time
def verify(raw_body: bytes, timestamp: str, signature: str, secret: str) -> bool:
mac = hmac.new(secret.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256)
fresh = abs(time.time() - int(timestamp)) < 300
return fresh and hmac.compare_digest("sha256=" + mac.hexdigest(), signature)
Υπολογίστε την υπογραφή πάνω στο ακατέργαστο σώμα ακριβώς όπως έφτασε, πριν από οποιαδήποτε ανάλυση JSON. Το παράθυρο των πέντε λεπτών είναι δική σας επιλογή· εμποδίζει την επανάληψη (replay) ενός παλιού αιτήματος.
Η παράδοση γίνεται με μία μόνο προσπάθεια και χρονικό όριο 5 δευτερολέπτων. Οι ανακατευθύνσεις δεν ακολουθούνται και μια διεύθυνση που αντιστοιχεί σε ιδιωτικό δίκτυο απορρίπτεται. Αν ένα χαμένο συμβάν έχει σημασία, διαβάστε το get_status για να ενημερωθείτε.
Σύντομοι σύνδεσμοι
Το GET https://cliqer.io/api/timer/link/<code> μετατρέπει τον κωδικό ενός σύντομου συνδέσμου στο δωμάτιό του: {"ok": true, "data": {"roomId", "link"}} ή 404 Link not found για άγνωστο, ανακληθέντα ή ληγμένο κωδικό συνδέσμου ή για λάθος κωδικό πρόσβασης. Για σύνδεσμο με κωδικό πρόσβασης, στείλτε τον στην κεφαλίδα x-link-password, ποτέ στη διεύθυνση.
Companion και Stream Deck
Δεν υπάρχει module Companion ούτε plugin Stream Deck για τα δωμάτια του Cliqer Timer. Το module Generic HTTP του Bitfocus Companion μπορεί να καλέσει τις παραπάνω ενέργειες. Το χρονόμετρο της εφαρμογής υπολογιστή Cliqer διαθέτει δικό του REST API και υποστήριξη Stream Deck, δείτε Timer (υπολογιστής) και Χρονόμετρο Host.
Συχνές ερωτήσεις
Το κλειδί λείπει, έχει πληκτρολογηθεί λάθος ή δεν σας ανήκει: ένα κλειδί λογαριασμού λειτουργεί μόνο σε δωμάτια που σας ανήκουν. Ελέγξτε ότι η κεφαλίδα είναι Authorization: Bearer <key> χωρίς επιπλέον κενά.
Το πρόγραμμα του κατόχου του δωματίου δεν περιλαμβάνει Timer API. Δείτε Προγράμματα και όρια.
Όχι. Το API χρειάζεται κλειδί για δωμάτιο που σας ανήκει και το δωμάτιο επίδειξης δεν ανήκει σε κανέναν.
Ελέγξτε ότι η διεύθυνση είναι https, ότι είναι προσβάσιμη από το Internet και ότι απαντά μέσα σε 5 δευτερόλεπτα χωρίς ανακατεύθυνση. Αν χάσατε το μυστικό, ορίστε τη διεύθυνση ξανά· το παλιό μυστικό παύει να λειτουργεί.
Επόμενα βήματα
Εισαγωγή από Stagetimer
Φέρτε μια ροή προγράμματος από CSV του Stagetimer, από υπολογιστικό φύλλο ή από εξαγωγή του Cliqer Timer, και εξαγάγετέ τη ξανά.
Επισκόπηση περιπτώσεων χρήσης
Εξερευνήστε το ευρύ φάσμα λογισμικού και σεναρίων όπου το Cliqer βελτιώνει τον έλεγχο και τη ροή εργασίας των παρουσιάσεών σας.