Как получить id участников дискорд сервера без прав
Как получить список id участников дискорд сервера, не имея прав администратора, я слышал можно сделать какойто запрос, парс и прочее, подскажите пожта.Желательно на js
Ответы (2 шт):
const responce = await fetch("https://discord.com/api/v10/guilds/<guildId>/members", {
method: "GET",
headers: {
Authorization: <ТОКЕН ВАШЕЙ УЧЁТНОЙ ЗАПИСИ ИЛИ БОТА>
}
});
const json = await responce.json();
Это минимальный пример запроса основанный на документации:
https://discord.com/developers/docs/resources/guild#list-guild-members
Однако при попытке получить доступ к списку пользователей мне возвращалось Missing Access.
Другие действия типа получить конкретного пользователя гильдии по айди возвращали корректный результат.
Проблема со спиком происходит из-за того, что как и указано в документации, это привелигериванное намерение.
Извините за неполный ответ. Теперь мне самому интересно разобраться в том, как подтверидть это намерение в запросе
У меня получилось получить список пользователей через Шлюз WebSockets.:
https://discord.com/developers/docs/topics/gateway#request-guild-members-guild-request-members
const TOKEN = "<Токен учётной записи>";
const GUILD_ID = "<id>"; // Айди обязан быть в строковом виде
const socket = new WebSocket("wss://gateway.discord.gg/");
socket.onopen = () => {
console.log(111);
identify();
}
socket.onclose = () => console.log(222);
socket.onmessage = ({data}) => {
data = JSON.parse(data);
if (data.t === "GUILD_MEMBERS_CHUNK"){
const members = data.d.members.map(member => member.user.id);
console.log("MEMBERS", members);
return;
}
if (data.t === "READY"){
console.log("READY");
fetchMembers();
return;
}
console.log(data)
};
function send(data){
data = JSON.stringify(data);
socket.send(data);
};
const identify = () => {
// Идентификация
send({"op":2,"d":{"token": TOKEN, "compress":false,"properties":{"$os":"Windows","$browser":"Discord Client","$device":"ASUS ROG Phone 5","$os_version":"10","$referrer":"","$referring_domain":"","$referrer_current":"","$referring_domain_current":"","$release_channel":"stable","$client_build_number":127546,"$client_event_source":null,"$browser_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36","$browser_version":"101.0.4951.54"},"version":9,"client_state":{"guild_hashes":{},"highest_last_message_id":"0","read_state_version":0,"user_guild_settings_version":-1,"user_settings_version":-1},"presence":{"activities":[],"afk":false,"since":0,"status":"online"}}})
};
const fetchMembers = () => {
// Запрос списка пользователей
console.log("FETCH MEMBERS CHUNK");
send({"op": 8,"d": {"guild_id": GUILD_ID, "presences":false, "query": "", "nonce": GUILD_ID, "limit": 0}})
};
Надеюсь, у Вас это тоже сработает.
Изменено:
Оказалось, для получения пользователей методом выше (opcode: 8), нужно одно из следующих прав:
Администратор, Право банить/кикать, Управлять ролями
Существует также универсальное решение, но со своими неудобствами:
const fetchMembers = () => {
// Укажите айди любого канала, к которому у вас есть доступ на сервере
const CHANNEL_ID = "<id>";
// Сколько пользователей надо получить
const MEMBERS_COUNT = <count>;
// [[0, 99], [100, 199], [200, 299]]
const countsArray = [...new Array(Math.floor(MEMBERS_COUNT / 100))]
.map((_, i) => [i * 100, (i + 1) * 100 - 1]);
send({"op":14,"d": {
"guild_id": GUILD_ID,
"typing": false,
"threads": false,
"activities": false,
"thread_member_lists": [],
"members": [],
"channels": {[CHANNEL_ID]: countsArray}
}});
}