aidisclose.js to skrypt działający na stronie, który odczytuje manifest ai-disclosure.json i wyświetla ujawnienia wymagane przez prawo: baner interakcji dla chatbotów, trwałą informację o treści, widoczne etykiety na oznaczonych multimediach oraz metadane strony nadające się do odczytu maszynowego. Nie ma zależności, waży około 8.2 KB po kompresji gzip i spełnia WCAG 2.1 AA.
Ta strona zawiera pełną dokumentację konfiguracji i dostosowywania. Kroki instalacji dla poszczególnych platform (WordPress, Shopify, Webflow, menedżery tagów) opisano w przewodniku instalacji. Ten dokument można też przeczytać jako surowy markdown.
Przegląd
Wszystkim steruje jeden tag skryptu. Po załadowaniu snippet pobiera manifest, a następnie wyświetla tylko to, co manifest deklaruje:
- Baner interakcji, dla systemu
conversational: informacja, że odwiedzający rozmawia z SI. - Informacja o treści, dla systemu
content-generationzscope: sitelubscope: page: mały, trwały znacznik. Kliknięcie otwiera krótkie wyjaśnienie z treścią informacji, nazwą wydawcy i celem systemu z manifestu oraz linkiem do pliku manifestu; treść informacji prowadzi do przystępnego wyjaśnienia na aidisclose.io. Plakietka „stworzone przez ludzi" otwiera tę samą kartę z nazwą wydawcy. - Etykiety na poszczególnych elementach, na każdym elemencie oznaczonym atrybutem
data-ai-content: widoczna plakietka „SI" oraz nadający się do odczytu maszynowegodata-digital-source-type. - Metadane strony:
<link rel="ai-disclosure">i<meta name="ai-disclosure">wskazujące na manifest. - Plakietka „stworzone przez ludzi", gdy manifest ustawia
noAiDeclared.
Wszystko poniżej jest opcjonalne. Bez żadnej konfiguracji snippet odczytuje /.well-known/ai-disclosure.json, wyświetla się w języku odwiedzającego w 28 wersjach językowych, dostosowuje się do jasnego lub ciemnego trybu systemu operacyjnego i wyświetla się nad znanymi paskami zgody na pliki cookie, aby nigdy się nie nakładały.
Instalacja
Dodaj tag raz, we wspólnym szablonie witryny, nagłówku motywu lub menedżerze tagów, a pojawi się na każdej stronie. Może znajdować się w <head> lub w dowolnym miejscu przed </body>; jest ładowany z atrybutem defer, więc jego umiejscowienie nie zmienia zachowania:
<script src="https://cdn.aidisclose.io/v1/aidisclose.js" defer></script>
Bez żadnych atrybutów snippet odczytuje manifest pod adresem https://YOURDOMAIN/.well-known/ai-disclosure.json. Jeśli Twoja platforma nie może udostępnić pliku w katalogu głównym domeny, hostuj manifest w AIDisclose i wskaż go w tagu za pomocą klucza:
<script src="https://cdn.aidisclose.io/v1/aidisclose.js" data-aidisclose="YOUR_SITE_KEY" defer></script>
Jeśli manifest jest nieosiągalny, snippet zapisuje ostrzeżenie w konsoli i nie wyświetla żadnych informacji zależnych od manifestu, więc nieudane pobranie nigdy nie pokazuje zgadywanej informacji. Metadane strony, etykiety [data-ai-content] oraz baner wymuszony przez data-banner="true" nadal się wyświetlają.
Konfiguracja
Snippet można skonfigurować na trzy sposoby. Użyj tego, który pasuje do Twojej platformy.
1. Atrybuty w tagu skryptu. Najprostsza droga, bez dodatkowego kodu:
<script src="https://cdn.aidisclose.io/v1/aidisclose.js"
data-theme="light" data-lang="fr" defer></script>
2. Globalny obiekt konfiguracji. Zdefiniuj window.AIDiscloseConfig przed uruchomieniem skryptu. Udostępnia on pełny zestaw opcji, w tym opcje selektorów, które nie mają postaci atrybutu:
<script>
window.AIDiscloseConfig = {
theme: 'light',
mountSelector: '#ai-disclosure-slot',
triggerSelector: '#chat-launcher',
};
</script>
<script src="https://cdn.aidisclose.io/v1/aidisclose.js" defer></script>
3. Ręczna inicjalizacja. Dodaj data-manual, aby odroczyć automatyczne uruchomienie, a następnie samodzielnie wywołaj AIDisclose.init(), gdy aplikacja będzie gotowa (przydatne w aplikacjach jednostronicowych):
<script src="https://cdn.aidisclose.io/v1/aidisclose.js" data-manual defer></script>
<script>
AIDisclose.init({ theme: 'dark', persistentChip: false });
</script>
Jeśli obecnych jest więcej źródeł, wygrywa window.AIDiscloseConfig: nadpisuje zarówno atrybuty tagu skryptu, jak i dowolny obiekt przekazany do AIDisclose.init().
Dokumentacja opcji
Zestaw opcji jest stabilny w linii 1.x.
| Opcja | Atrybut | Wartości | Domyślnie | Działanie |
|---|---|---|---|---|
theme |
data-theme |
light, dark, auto |
auto |
Schemat kolorów. auto dostosowuje się do preferencji systemu odwiedzającego. |
siteKey |
data-aidisclose |
ciąg znaków | brak | Ładuje manifest hostowany w AIDisclose dla tego klucza zamiast pliku well-known. |
manifestUrl |
data-manifest-url |
URL | /.well-known/ai-disclosure.json |
Odczytuje manifest z niestandardowego adresu URL. |
lang |
data-lang |
kod BCP-47 | <html lang> strony, w przeciwnym razie język odwiedzającego |
Wymusza język wyświetlania. |
banner |
data-banner |
true, false |
auto | Wymusza włączenie lub wyłączenie banera interakcji. Pozostawiony bez ustawienia pojawia się tylko wtedy, gdy manifest deklaruje system konwersacyjny (chatbot). |
persistentChip |
— | true, false |
true |
Pokazuje lub ukrywa zwinięty miniznacznik banera interakcji (małą pigułkę, do której się minimalizuje). |
alwaysShow |
— | true, false |
false |
Pokazuje baner ponownie przy każdej wizycie, ignorując wcześniejsze zamknięcie przez odwiedzającego (zapamiętane w localStorage przeglądarki). |
mountSelector |
— | selektor CSS | brak | Wyświetla baner wewnątrz tego elementu zamiast jako stałą nakładkę u dołu. |
triggerSelector |
— | selektor CSS | brak | Pokazuje baner interakcji dopiero po kliknięciu tego elementu przez odwiedzającego, na przykład przycisku uruchamiającego czat. Strony bez pasującego elementu nie pokazują banera, więc chatbot obecny tylko na niektórych stronach ujawnia się jedynie tam. Przyciski wstrzyknięte po załadowaniu również działają. Odwiedzający, który wcześniej zamknął baner, nadal widzi miniznacznik. |
adjacentSelector |
— | selektor CSS | brak | Umieszcza etykietę obok elementu, którego nie można oznaczyć bezpośrednio, na przykład zamkniętego widżetu lub elementu iframe. |
observe |
— | true, false |
true |
Obserwuje DOM pod kątem treści dodanych później i oznacza je. Ustaw false na całkowicie statycznych stronach. |
beaconUrl |
— | URL | brak | Wysyła anonimowy sygnał {siteKey, flag} przy istotnych zdarzeniach. Bez plików cookie, bez danych osobowych. |
data-manual nie jest wartością opcji: jego obecność w tagu odracza automatyczne uruchomienie, dzięki czemu możesz samodzielnie wywołać AIDisclose.init().
Motyw i wygląd
Ustaw wbudowany schemat za pomocą theme (light, dark lub auto). Aby dokładnie dopasować go do marki, nadpisz niestandardowe właściwości CSS snippetu we własnym arkuszu stylów. Są zdefiniowane na .aid-banner, .aid-chip:
| Zmienna | Steruje |
|---|---|
--aid-bg |
Tło |
--aid-fg |
Tekst |
--aid-line |
Obramowanie |
--aid-btn |
Obramowanie przycisku zamknięcia |
--aid-btnfg |
Tekst przycisku zamknięcia |
--aid-hov |
Najechanie na przycisk zamknięcia |
.aid-banner, .aid-chip {
--aid-bg: #0b1020;
--aid-fg: #e8eaed;
--aid-line: #2a2f36;
}
Snippet nie zawiera reguł !important i używa selektorów o niskiej specyficzności, więc Twój CSS wygrywa. Punkty zaczepienia klas to .aid-banner, .aid-chip, .aid-badge, .aid-badge-inline, .aid-wrap, .aid-ai (informacja o treści) i .aid-hm („stworzone przez ludzi"). Odstępy, zaokrąglenia i cień zmienisz bezpośrednio na tych klasach.
Domyślnie baner jest stałą nakładką u dołu okna widoku. Ustaw mountSelector, aby wyświetlić go w układzie ciągłym i statycznie wewnątrz kontrolowanego przez Ciebie elementu, tak aby mieścił się we własnym układzie.
Własne teksty
Baner i znacznik zawierają dokładny, zlokalizowany tekst w 28 językach od razu po instalacji. Aby zmienić treść:
- Dla każdego języka, w manifeście. Dodaj
disclosure.textsdo systemu, z kluczami według kodu języka. Snippet użyje Twojego tekstu dla pasującego języka odwiedzającego:
{
"disclosure": {
"texts": { "en": "Some copy on this page was drafted with AI.", "fr": "Une partie du texte a été rédigée avec de l'IA." }
}
}
- Dla poszczególnych elementów. Dodaj
data-ai-labeldo oznaczonego elementu, aby ustawić etykietę tej plakietki.
Gdy system ustawia editorialResponsibility.humanReview: true, a jego treść nie jest w pełni wygenerowana przez SI ani zmanipulowana, informacja automatycznie brzmi „wspomagane przez SI, zweryfikowane przez człowieka" w języku odwiedzającego, zamiast „wygenerowane przez SI".
Oznaczanie treści SI
Snippet oznacza tylko to, co sam oznaczysz. Dodaj data-ai-content do dowolnego elementu wygenerowanego przez SI:
<img data-ai-content src="/img/generated.webp" alt="…">
<p data-ai-content>AI-drafted summary…</p>
<video data-ai-content src="/clip.mp4"></video>
Każdy oznaczony element otrzymuje widoczną plakietkę „SI" oraz nadający się do odczytu maszynowego data-digital-source-type (domyślnie trainedAlgorithmicMedia, wartość zgodna z IPTC i schema.org). Dodaj data-ai-label dla własnego tekstu etykiety lub samodzielnie ustaw data-digital-source-type, aby był bardziej szczegółowy.
W przypadku SI, której nie można oznaczyć bezpośrednio, na przykład zewnętrznego widżetu czatu w zamkniętym elemencie iframe, użyj adjacentSelector, aby umieścić etykietę obok, lub triggerSelector, aby wyświetlić baner interakcji po otwarciu widżetu.
Informacja o generowaniu treści może obejmować całą witrynę (disclosure.scope: "site") lub konkretne strony (disclosure.scope: "page" z listą disclosure.pages zawierającą wzorce ścieżek, takie jak /blog/*). Dopasowanie na poziomie strony ma pierwszeństwo przed dopasowaniem na poziomie witryny, a system o zasięgu strony bez pasującej ścieżki nie wyświetla tam niczego.
Aplikacje jednostronicowe i frameworki
Snippet obserwuje DOM za pomocą MutationObserver i ponownie ocenia właściwą informację przy zmianie trasy, więc treści i strony dodane po załadowaniu są nadal oznaczane. W aplikacji SPA:
- Pozostaw
observena wartości domyślnej (true), aby wychwycić treści renderowane po stronie klienta. - Jeśli uzależniasz inicjalizację od gotowości aplikacji, dodaj
data-manuali wywołajAIDisclose.init()po zamontowaniu frameworka. - Informacje o zasięgu strony aktualizują się automatycznie przy zmianie trasy; nie jest potrzebne wywołanie dla każdej trasy.
Ustaw observe: false tylko na całkowicie statycznych stronach, na których nic nie jest wstrzykiwane po załadowaniu.
Content Security Policy
Jeśli wymuszasz Content Security Policy, jawnie zezwól na snippet.
Ważne
Rygorystyczne script-src 'self' po cichu blokuje snippet z CDN i ujawnienia nigdy się nie wyświetlają. To najczęstszy powód, dla którego poprawnie zadeklarowana witryna nie osiąga poziomu 2.
script-src: dodajhttps://cdn.aidisclose.iolub hostujaidisclose.jswe własnym źródle i zachowaj'self'.style-src: snippet wstrzykuje swoje style bezpośrednio, więc'unsafe-inline'wystarczy. Jeśli nie zezwalasz na style wbudowane, snippet awaryjnie ładujeaidisclose.cssz katalogu skryptu, więc zezwól również nahttps://cdn.aidisclose.iowstyle-src(lub hostuj ten plik razem ze skryptem).connect-src: pobranie manifestu jest w tym samym źródle dla pliku well-known i nie wymaga niczego dodatkowego. Jeśli ładujesz manifest za pomocą klucza, zezwól nahttps://cdn.aidisclose.io.
Manifest jest pobierany bez poświadczeń, więc udostępniaj go publicznie: punkt końcowy wymagający plików cookie lub uwierzytelnienia ich nie otrzyma.
Wersjonowanie i integralność
CDN udostępnia trzy ścieżki:
/v1/aidisclose.jsśledzi najnowsze wydanie z linii 1.x. Zalecane dla większości witryn./v1.0.0/aidisclose.jsto stała, niezmienna wersja, którą można przypiąć, z Subresource Integrity:
<script src="https://cdn.aidisclose.io/v1.0.0/aidisclose.js"
integrity="sha384-…" crossorigin="anonymous" defer></script>
/latest/aidisclose.jszawsze śledzi najnowsze wydanie we wszystkich głównych wersjach.
Aby uzyskać skrót SRI do przypięcia, zbuduj snippet: npm run build w packages/snippet go wyświetla (kod źródłowy jest otwarty na GitHub).
Budowa własnego interfejsu ujawnień
Zamiast wbudowanego interfejsu możesz wyświetlić własny interfejs ujawnień. Nie ma jednego przełącznika wyłączającego: data-banner="false" i persistentChip: false ukrywają tylko baner interakcji i jego znacznik, natomiast informacje o treści, plakietki [data-ai-content] na poszczególnych elementach oraz plakietka „stworzone przez ludzi" nadal wyświetlają się na podstawie manifestu i znaczników. W pełni własny interfejs oznacza rezygnację z nich i wyświetlanie własnego.
Uwaga
Weryfikator AIDisclose sprawdza renderowanie, wykrywając znaczniki referencyjnego snippetu. W pełni ręcznie zbudowane ujawnienie jest prawidłowe, ale nie jest wykrywane automatycznie, więc witryna pozostaje na poziomie 1 (Zadeklarowany), a nie na poziomie 2 (Wyświetlony), chyba że własne znaczniki odtworzą to, czego szuka weryfikator. Jeśli zależy Ci na poziomie 2, zachowaj wbudowane renderowanie i zmień jego wygląd za pomocą CSS.
Dostępność
Wyświetlany interfejs spełnia WCAG 2.1 AA: widoczne obrysy :focus-visible na interaktywnych elementach sterujących, poprawne role i etykiety, kontrast zachowany w trybie jasnym i ciemnym oraz animacje ograniczone przez prefers-reduced-motion. Snippet wykrywa również znane paski zgody na pliki cookie i wyświetla się nad nimi, aby ujawnienia nigdy nie były ukryte za platformą CMP. Na bardzo wąskich ekranach baner interakcji otwiera się jako kompaktowy znacznik, dzięki czemu nigdy nie zasłania treści.