Link zaproszeniowy bota na Discordzie to po prostu adres autoryzacji OAuth2: jego parametr scope decyduje, jaki rodzaj dostępu jest żądany (konto bota, komendy slash albo oba), a liczba permissions decyduje, co to konto bota może robić po dołączeniu. Administrator serwera musi zatwierdzić całość, zanim cokolwiek zacznie działać. Zrozumienie tych dwóch parametrów to różnica między zbudowaniem bezpiecznego linku a skopiowaniem takiego, którego w pełni nie rozumiesz.
Budowa linku zaproszeniowego
Typowe zaproszenie bota wygląda tak:
https://discord.com/oauth2/authorize?client_id=123456789&permissions=268446800&scope=bot%20applications.commands
- client_id - publiczny identyfikator aplikacji, bezpieczny do udostępniania; znajduje się w każdym linku zaproszeniowym tego bota.
- scope - rodzaj żądanego dostępu, oddzielony spacjami (zakodowany w URL jako
%20). - permissions - pojedyncza liczba reprezentująca wszystkie żądane uprawnienia serwera, zsumowane.
- guild_id i disable_guild_select (opcjonalnie) - wstępnie wybierają konkretny serwer i blokują wybór na nim; przydatne dla przycisku „dodaj mnie tutaj” na danym serwerze.
Zakres „bot”
To on faktycznie dodaje bota jako członka serwera, czyli wpis z oznaczeniem BOT na liście członków. Bez tego zakresu nic nie dołącza, bo nie ma konta bota do autoryzacji.
Zakres „applications.commands”
Ten zakres rejestruje komendy slash, użytkownika i wiadomości aplikacji, żeby można ich było używać na tym serwerze. Bot technicznie może dołączyć tylko z zakresem bot, ale żadna z jego komend / nie pojawi się, gdy ktoś wpisze /, bo serwer nigdy nie autoryzował rejestracji komend.
Dlaczego prawie zawsze chcesz oba
Bot zaproszony tylko z bot nadal może pisać wiadomości, reagować na przyciski pod wiadomościami, które już wysłał, i odpowiadać na rzeczy niewymagające komendy slash. Ale współcześni użytkownicy Discorda oczekują komend, a bot, który nie potrafi ich zarejestrować, wygląda na zepsuty, nawet gdy działa poprawnie. Dlatego każdy link zaproszeniowy generowany przez Noxyr, i prawie każdego uczciwego bota, zawiera oba zakresy naraz.
Liczba permissions, odczytana
Każde uprawnienie Discorda, wysyłanie wiadomości, zarządzanie rolami, wyrzucanie członków, to pojedynczy bit w polu bitowym: flaga będąca potęgą dwójki. Liczba w linku zaproszeniowym to suma wszystkich flag żądanych naraz. Link żądający permissions równego 8 prosi o dokładnie jedną rzecz: Administratora, czyli pełny, nieograniczony dostęp do serwera. Dobrze zbudowany link zaproszeniowy sumuje natomiast tylko konkretne flagi, których faktycznie używa kod bota: zarządzanie kanałami do tworzenia kanałów ticketów, zarządzanie rolami dla roli weryfikacji, akcje moderacyjne do reakcji na najazdy, a nie wszystko, co Discord udostępnia.
Dlaczego Administrator to czerwona flaga, a nie wymóg
Większość uczciwych botów go nie potrzebuje. Jego żądanie to albo prawdziwa, rzadka potrzeba czegoś, co dotyka niemal wszystkich uprawnień naraz, albo, znacznie częściej, bot zbudowany na szybko, z wklejoną liczbą permissions równą 8, bo była najłatwiejsza do wzięcia. To także najbardziej przerażający ekran, jaki Discord pokazuje właścicielowi serwera podczas konfiguracji, dlatego często zaproszenie jest od razu odrzucane albo bot zostaje później usunięty przez kogoś porządkującego uprawnienia. Liczbę uprawnień dowolnego linku zaproszeniowego możesz odczytać w kalkulatorze uprawnień Discorda, zanim klikniesz Autoryzuj, żeby zobaczyć dokładnie, o co się prosi.
Jak zbudowany jest link zaproszeniowy Noxyr, na przykładzie
Zamiast żądać Administratora, zaproszenie Noxyr składa się z konkretnych uprawnień, których używają jego funkcje: zarządzanie kanałami i rolami dla ticketów i weryfikacji, uprawnienia do wiadomości i moderacji dla reakcji anti-nuke, i nic poza tą listą. Zawsze obejmuje zakresy bot i applications.commands, więc jego komendy działają od chwili dołączenia.
Inne zakresy OAuth2, o których możesz usłyszeć
Discord definiuje dziesiątki zakresów OAuth2 poza bot i applications.commands. Większość z nich, jak identify czy guilds.join, należy do uwierzytelniania webowego w stylu „Zaloguj się przez Discord”, a nie do zaproszeń botów, i w ogóle nie pojawia się w standardowym linku zaproszeniowym. Jeśli link, który oglądasz, żąda czegoś nieznanego razem z bot, warto sprawdzić, co dany zakres faktycznie przyznaje, zanim autoryzujesz, bo zaproszenie bota wymagające dodatkowych zakresów uwierzytelniania webowego jest nietypowe poza usługą, która też oferuje łączenie kont.
Budowanie linku zaproszeniowego dla własnego custom bota
Gdy utworzysz aplikację w Discord Developer Portal, generator URL na karcie OAuth2 zbuduje ten link za Ciebie z pól wyboru: zaznacz bot i applications.commands w zakresach, zaznacz uprawnienia, których potrzebuje bot, i skopiuj wynik. Nie składasz wtedy ręcznie ani adresu URL, ani liczby uprawnień.
Częste pytania
Co robi disable_guild_select? Blokuje wybór serwera na jeden wcześniej wybrany serwer, więc link zaproszeniowy przeznaczony dla konkretnej społeczności nie może przypadkiem zostać użyty do dodania bota gdzie indziej.
Czy potrzebuję applications.commands, jeśli mój bot używa tylko przycisków? Nie jest to ściśle wymagane dla przycisków pod wiadomościami, które bot już wysłał, ale potrzebujesz tego w chwili, gdy w grę wchodzi jakakolwiek komenda slash.
Czy późniejsza zmiana liczby uprawnień może dodać dostęp wstecz? Nie. Serwer, który już zatwierdził zaproszenie, zachowuje to, co zostało wtedy przyznane; zmiana linku wpływa tylko na przyszłe zaproszenia, a istniejące instalacje trzeba zaprosić i zatwierdzić ponownie, żeby uzyskać więcej.
Czy samo scope=bot wystarczy? Wystarcza, żeby bot dołączył, ale jego komendy slash nie pojawią się bez applications.commands obok.
Dlaczego Discord pokazuje tak duże ostrzeżenie przy Administratorze? Bo żąda nieograniczonego dostępu do całego serwera, czyli najbardziej niebezpiecznego uprawnienia, jakie może zażądać zaproszenie bota.
Konfigurujesz zaproszenie dla własnego bota? Najpierw przeczytaj przewodnik o tworzeniu aplikacji Discord, a potem dokumentację Custom Bot, jeśli wolisz w ogóle nie pisać kodu, który stoi za botem.