
Język 🇵🇱 Polski
Instalacja Val Town
Dodaj komentarze na żywo do aplikacji Val Town
Val Town uruchamia TypeScript na Deno, więc val jest prawdziwym serwerem. To sprawia, że jest to dobre dopasowanie do FastComments: widget jest tagiem skryptu na stronie, a wszystko, co wymaga sekretu, jak Secure SSO czy weryfikacja webhooka, może działać po stronie serwera w tym samym val.
Ten przewodnik opisuje dodawanie widgetu komentarzy do HTTP val, wyświetlanie liczby komentarzy na stronie indeksu, logowanie użytkowników przy użyciu konta Val Town, które już posiadają, oraz odbieranie webhooków komentarzy.
Nie potrzebujesz konta, aby to wypróbować. Przykłady używają tenantId: "demo", współdzielonego sandboxu, a krok 2 opisuje przejście na własny.
Krok 1: Dodaj widżet 
The widget is a script tag and a container element, so it drops into whatever your val already renders. This example uses Hono JSX, which is what Val Town's HTTP templates use.
Run 
Wybierz urlId przed wypuszczeniem
urlId decyduje, w którym wątku pojawi się komentarz. Jeśli pozostawisz go nieustawionym, domyślnie przyjmuje wyczyszczoną wersję bieżącego adresu URL strony, co jest dokładnie tym, co zmienia się w Val Town: val ma długą nazwę hosta *.web.val.run, dopóki nie zarezerwujesz subdomeny, gałęzie otrzymują własne adresy URL, a zmiana nazwy strony zmienia ścieżkę. Każda wariacja cicho staje się osobnym, pustym wątkiem, a objaw wygląda jak „moje komentarze zniknęły”.
Ustaw go na coś stabilnego, co kontrolujesz, np. slug posta lub identyfikator w bazie danych, jak powyżej. Przekaż także url, aby e‑maile z powiadomieniami i narzędzia moderacji mogły odwoływać się do rzeczywistej strony.
Zachowanie komentarzy bez JavaScriptu
FastComments renderuje pełny wątek po stronie serwera, który val może wstawić do bloku <noscript>:
Run 
Zakoduj parametry w formacie URL. Wersja po stronie serwera obsługuje komentowanie anonimowe i zalogowane, SSO oraz zagnieżdżone odpowiedzi.
Krok 2: Użyj własnego konta 
tenantId: "demo" jest współdzielonym publicznym sandboxem. Działa bez rejestracji, dlatego przykłady go używają, ale wszyscy inni korzystający z FastComments piszą w tych samych wątkach i każdy może je moderować. Przełącz się, zanim opublikujesz cokolwiek, na czym Ci zależy.
Twój identyfikator najemcy znajduje się na stronie tajnego klucza API.
Identyfikator najemcy jest publiczny i powinien znajdować się w kodzie przeglądarki. Tajny klucz API nie jest publiczny i nic na tej stronie nie wymaga go.
Odczytaj go ze zmiennej środowiskowej
Wartości Val Town są publiczne w darmowym planie, więc ich źródło jest dostępne dla wszystkich. Przechowuj wszelkie wrażliwe dane w zmiennych środowiskowych, odczytując je za pomocą Deno.env.get:
Run 
Ma to większe znaczenie niż zwykle w Val Town z powodu drugiego powodu: przepisanie wartości (remiksowanie) kopiuje klucze zmiennych środowiskowych, ale nie ich wartości. Tajny klucz przechowywany w zmiennej środowiskowej nie podąża za Twoją wartością do konta innej osoby. Tajny klucz zapisany w pliku podąża.
Powrót do "demo" utrzymuje działanie wartości dla każdego, kto ją przepisze przed ustawieniem własnego najemcy.
Konta UE
Konto, jego dane i klucze znajdują się w jednym regionie. Jeśli Twoje zostało utworzone na eu.fastcomments.com, każda konfiguracja widgetu musi również zawierać region: "eu", a skrypty ładują się z cdn-eu.fastcomments.com. W przeciwnym razie pozostaw oba niezmienione.
Liczba komentarzy na stronie indeksu 
Na stronie indeksu nie renderuj jednego widżetu liczenia komentarzy na wiersz. To powoduje jedno żądanie na każdy post. Użyj liczenia zbiorczego, które wymaga jednego żądania dla całej strony.
Oznacz każdy wiersz urlId, którego używa wątek, a następnie załaduj widżet zbiorczy jednorazowo:
Run 
Skrypt znajduje każdy element .fast-comments-count na stronie i wstawia jego liczbę.
data-fast-comments-url-id musi odpowiadać urlId, którego używa widżet komentarzy posta. Jeśli widżet używa slug, znacznik używa slug. Niezgodność powoduje wyświetlenie zera w wątku, który ma komentarze.
Skrypt nasłuchuje window.FastCommentsBulkCountConfig, więc nie ma znaczenia, czy ustawisz konfigurację przed, czy po znaczniku skryptu.
Bezpieczne SSO z std/oauth 
If your val already knows who the visitor is, Secure SSO hands that identity to the widget so they never see a second login. There are no endpoints to build and nothing to call at runtime: you compute three values server-side and pass them in the widget config.
Val Town ships zero-config login with std/oauth, so the visitor can sign in with the Val Town account they already have. Swap that for whatever your app uses; the FastComments half does not change.
Build the payload on the server
The API secret signs the payload and must never reach browser code. Install the SDK from npm, which works on Val Town's Deno runtime as-is:
Run 
getPayload() returns { userDataJSONBase64, verificationHash, timestamp }. Those three values are all that reach the browser. The secret signs them and is then dropped, so nothing in the page lets a reader forge a different user.
Pass it to the widget
Run 
oauthMiddleware adds GET /auth/login, GET /auth/callback and POST /auth/logout for you. Note that logout is a POST, while the widget navigates to logoutURL with a GET, so point logoutURL at a small route of your own that submits the POST.
When the visitor is logged out, pass sso with only a loginURL. The widget then shows a login prompt instead of an anonymous comment box.
Things that go wrong
timestamp is epoch milliseconds, must not be in the future, and must not be more than two days old. Generate it on the server in the same request that computes the hash. Generating it in the browser is the classic failure: the value differs from the one that was hashed and every comment is rejected.
Never set isAdmin or isModerator from the identity provider. Signing in with a Val Town account says nothing about who should moderate your site.
See the SSO guide for the full field list, group-gated threads, and badges.
Odbieranie webhooków 
A val jest naturalnym odbiorcą webhooków: ma stabilny URL, może weryfikować podpis i ma wbudowaną bazę SQLite oraz przechowywanie blobów.
FastComments podpisuje ${timestamp}.${body} przy użyciu sekretu API Twojego konta i wysyła dwa nagłówki:
Run 
Metoda przenosi zdarzenie: PUT dla utworzonego lub zaktualizowanego komentarza, DELETE dla usuniętego.
Run 
Dwie rzeczy, które gryzą
Zweryfikuj surowe bajty. Parsowanie JSON i ponowne serializowanie zmienia kolejność kluczy oraz białe znaki, więc hash się różni i każda dostawa kończy się niepowodzeniem bez oczywistej przyczyny. To najczęstszy powód, dla którego odbiorca webhooka „po prostu nie działa”.
Porównuj w stałym czasie. Zwykłe === na podpisie ujawnia, ile bajtów się zgadza, co wystarczy, aby podrobić jeden bajt naraz.
Obsługa zdarzeń
Odpowiadaj szybko. FastComments ponawia próbę przy kodzie innym niż 2xx, a endpoint, który ciągle zawodzi, zostaje ostatecznie automatycznie wyłączony, więc wykonuj rzeczywistą pracę po odpowiedzi, a nie w linii.
Uczyń to działanie idempotentnym względem identyfikatora komentarza. Ponowna próba jest podpisywana ponownie z nowym znacznikiem czasu, a ten sam identyfikator komentarza pojawia się ponownie przy edycji i usunięciu, więc nie ma nic stabilnego, na czym można by deduplikować.
Przykładowe Vals 
Four public vals you can remix, each covering one piece of this guide.
Blog with comments (live) jest blogiem w formacie Markdown z wątkiem pod każdym postem i zbiorczymi licznikami komentarzy na indeksie. Działa od razu po remixowaniu, a jedna zmienna środowiskowa wskazuje na twoje własne konto.
SSO demo (live) loguje odwiedzającego przy użyciu jego konta Val Town i przekazuje tę tożsamość do widgetu, więc nie ma drugiego logowania.
Webhook receiver (live) weryfikuje podpis HMAC przy każdej dostawie i przechowuje zdarzenia w SQLite. Ma przycisk, który podpisuje testowy payload i dostarcza go do siebie, więc możesz obserwować pomyślną weryfikację przed skonfigurowaniem prawdziwego webhooka.
Agent skills (live) jest biblioteką umiejętności agenta FastComments obejmującą widget, SSO, REST API, moderację i migrację z Disqus. Remixuj ją, a agent Val Town, Townie, automatycznie pobiera umiejętności z skills/, więc twój agent wie, jak podłączyć komentarze bez wklejania dokumentacji do czatu.
The same skills install anywhere else with npx skills add fastcomments/skills.
Błędy domeny 
Gdy wyłączysz najemcę demo, widget może odmówić załadowania z błędem autoryzacji. Dzieje się tak, ponieważ FastComments nie wie, że powinien zezwolić na użycie Twojego konta na tej domenie.
Przejdź tutaj, aby dodać swoją witrynę do konta.
Val Town zasługuje na ponowne spojrzenie, ponieważ val może być dostępny pod więcej niż jedną nazwą hosta:
- Każdy HTTP val ma długi domyślny punkt końcowy,
<org>--<id>.web.val.run. - Zarezerwowanie niestandardowej subdomeny dodaje
<name>.val.run. - Niestandardowa domena dodaje trzecią.
- Gałęzie otrzymują własne adresy URL.