使用PHP获取Discord中的成员总数

时间:2017-11-23 11:50:54

标签: php discord

我有一个拥有1361名成员的Discord服务器,在我的网站上我想显示已加入用户的总数。

我已经想出如何使用以下方式获取服务器上的所有在线会员:

   <?php

    $jsonIn = file_get_contents('https://discordapp.com/api/guilds/356230556738125824/widget.json');
    $JSON = json_decode($jsonIn, true);

    $membersCount = count($JSON['members']);

    echo "Number of members: " . $membersCount;
   ?>

我应该采取哪些不同的方式来获取已加入服务器的所有用户的总数,而不仅仅是显示在线成员?

6 个答案:

答案 0 :(得分:1)

现在,我意识到我正在恢复一个相当旧的线程,但我认为有些人可能仍会使用答案。正如jrenk指出的那样,您应该访问https://discordapp.com/api/guilds/356230556738125824/members

您的404: Unauthorized来自您 - 您猜对了 - 未经授权的事实。 如果您已创建机器人,则相当简单:只需添加请求标头Authorization: Bot YOUR_BOT_TOKEN_HERE即可。如果您使用普通的Discord帐户,整个问题就更棘手了:
您首先必须向POST发送https://discordapp.com/api/auth/login请求,并将正文设置为{"email": "EMAIL_HERE", "password": "PASSWORD_HERE"}。 您将获得参数token的回复。保存此令牌,稍后您将需要它。但是:

  

从不,在任何情况下向任何人显示此令牌,因为它等同于您的登录凭据!

使用此令牌,您现在可以向同一地址发送POST个请求:https://discordapp.com/api/auth/login,但现在添加标头Authorization: YOUR_BOT_TOKEN_HERE。注意缺少的&#34; Bot&#34;在开始。

另外,你不能忘记:

  

如果你不添加参数?limit=MAX_USERS,你将只获得第一个公会成员。看看here以查看详细信息。

答案 1 :(得分:1)

您需要在不和谐服务器上安装一个漫游器来获取所有成员。例如,使用Discord js库。

答案 2 :(得分:0)

您必须计算在线会员的数量 这是工作代码

<?php
$members = json_decode(file_get_contents('https://discordapp.com/api/guilds/356230556738125824/widget.json'), true)['members'];
$membersCount = 1;
foreach ($members as $member) {
    if ($member['status'] == 'online') {
        $membersCount++;
    }
}
echo "Number of members: " . $membersCount;
?>

答案 3 :(得分:0)

首先创建一个discord bot并获取令牌,请参见以下URL:
https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token

正如@ 2Kreeper所指出的,请勿公开公开您的令牌。

然后使用以下代码,替换“ enter-bot-token-here ”和“ enter-guild-id-here ”和您自己的信息:

<?php

$json_options = [
  "http" => [
    "method" => "GET",
    "header" => "Authorization: Bot enter-bot-token-here"
  ]
];

$json_context = stream_context_create($json_options);

$json_get     = file_get_contents('https://discordapp.com/api/guilds/enter-guild-id-here/members?limit=1000', false, $json_context);

$json_decode  = json_decode($json_get, true);

echo '<h2>Member Count</h2>';
echo count($json_decode);

echo '<h2>JSON Output</h2>';
echo '<pre>';
print_r($json_decode);
echo '</pre>';

?>

答案 4 :(得分:0)

对于仍然有兴趣的人,这是我目前使用RestCord使用的解决方案:

use RestCord\DiscordClient;

$serverId = <YourGuildId>;

$discord = new DiscordClient([
    'token' => '<YourBotToken>'
]);

$limit = 1000;
$membercnt = 0;
$_ids = array();

function getTotalUsersCount($ids, $limit, $serverId, $discord) {
    if( count($ids) > 0 ) {
        $last_id = max($ids);
        $last_id = (int)$last_id;
    } else {
        $last_id = null;
    }
    $members = $discord->guild->listGuildMembers(['guild.id' => $serverId, 'limit' => $limit, 'after' => $last_id]);
    $_ids = array();
    foreach( $members as $member ) {
        $ids[] = $member->user->id;
        $_ids[] = $member->user->id;
    }

    if( count($_ids) > 0 ) {
        return getTotalUsersCount($ids, $limit, $serverId, $discord);
    } else {
        return $ids;
    }
}

$ids = getTotalUsersCount($_ids, $limit, $serverId, $discord);
$membercnt = count($ids);

echo "Member Count: " . $membercnt;

答案 5 :(得分:0)

除了iTeY提供的Soubhagya Kumar的答案评论,您还可以简单地使用count(),如果不需要循环,则无需循环。