Hoe je Twitch-kijktijd kunt krijgen (zoals streamelementen)

Ik ben momenteel bezig met het ontwikkelen van een kleine twitch.tv-chatbot. Ik weet het, er zijn er zo’n duizend, maar ik zou er graag mijn eigen willen maken, gewoon om een ​​project te hebben – dus daar gaat het niet om.

Ik vroeg me af hoe de kijktijd van een gebruiker kon worden berekend. Net zoals streamelements.com het doet met hun !watchtimechatopdracht. Ik heb geen API-eindpunt gevonden om de gebruikers te krijgen, die momenteel de stream bekijken. Het enige wat gevonden is, is de huidige weergavetelling in https://dev.twitch.tv /docs/api/reference#get-streamsmaar er is geen manier om naar een specifieke gebruiker te linken.

Iemand enig idee?


Antwoord 1

Er is geen API-eindpunt om dit rechtstreeks te doen.
Ik heb onlangs echter iets soortgelijks gedaan met PHP, zonder dat ik Twitch API-referenties nodig heb. Het kanaal waarvoor ik werk gebruikt NightBot, dus ik zal proberen kort uit te leggen hoe het ermee werkt, zodat je het kunt implementeren zoals je wilt.
Disclaimer: ik ben nieuw in PHP, dus het kan waarschijnlijk worden verbeterd; ook kan het gebruik van opdrachten van de Twitch API de code waarschijnlijk oppoetsen.

Het bestand heet ‘watchtime.php’. Op een updateverzoek haalt het de chatters op en voegt het tijdsverschil tussen de updates toe aan de kijktijd van elke gebruiker. Op een verzoek om op te halen, neemt het de opgeslagen kijktijd en analyseert het in dagen, uren, minuten en seconden.

Om de database voor een kanaal bij te werken, moet je een planner of een lus gebruiken die vraagt ​​om https://path/to/watchtime.php?action=update&channel=target, waarbij ‘target’ de kanaalnaam is . De verzoeken moeten minder dan 10 minuten uit elkaar liggen. Zorg er echter voor dat u het verzoek doet als alleen het kanaal wordt gestreamd. Elke loopcyclus vraagt ​​het script de Twitch TMI om de chatters op te halen (bijv. voor Ludwig https ://tmi.twitch.tv/group/user/ludwig/chatters) en voegt aan elke chatter het tijdsverschil tussen de updates toe. Ik sla de waarden op in een JSON; voor je chatbot raad ik aan om een ​​echte database te implementeren. Als er geen fouten in de update zijn, is de antwoordtekst “OK”.

Om de kijktijd van NightBot te krijgen, heb ik de opdracht gebruikt
$(urlfetch https://path/to/watchtime.php?action=get&channel=$(channel)&user=$(user)&time=$(time)), waarbij $(urlfetch url) de uitvoer van een url retourneert, $(channel) de kanaalnaam is, $(user) de gebruikersnaam is en $(time) de huidige tijd is (het is nutteloos voor de PHP, maar het wordt gebruikt om de querycaching in NightBot te omzeilen).
Ik bereken de kijktijden echter alleen voor kijkers en VIP’s; voor een mod zal het een fout retourneren (deze kan worden gewijzigd).

Hier is de PHP-code:

<?php
if (!array_key_exists('channel', $_REQUEST)) {
    echo 'Empty channel';
    return;
}
if (!array_key_exists('action', $_REQUEST)) {
    echo 'Empty action (get/update)';
    return;
}
$channel = $_REQUEST['channel'];   // Channel username
$file = "{$channel}.watchtime.json";    // File with watchtime
// Open json and collect data
if (file_exists($file)) {
    $data = json_decode(file_get_contents($file), true);
} else {
    $data = [];
}
 if ($_REQUEST['action'] == 'update') {
    // Update watchtime (watchtime.php?channel=streamer&action=update)
    // Do an update only when the target is streaming!
    // You can also insert here a API call to verify it.
    $now = time();  // Epoch time
    if (array_key_exists('$', $data) && $now - $data['$'] < 600) {
        // Increment if only the last update has been made in less than 10 min.
        // This prevents increments when the stream is first loaded.
        // Fetch chatters
        $url = "http://tmi.twitch.tv/group/user/{$channel}/chatters";  // Don't use https here
        $users = json_decode(file_get_contents($url), true)['chatters'];
        // Lazy way to find if the stream is off
        if (empty($users['broadcaster'])) {
            echo 'Empty broadcaster';
            return;
        }
        // This script selects only vips ans viewers, mods watchtimes are not counted.
        $chatters = array_merge($users['vips'], $users['viewers']);
        // Increment watchtime
        $passed = $now - $data['$'];  // Time passed since last update
        foreach ($chatters as $viewer) {
            if (!array_key_exists($viewer, $data))
                $data[$viewer] = 0;
            $data[$viewer] += $passed;
        }
    }
    $data['$'] = $now;  // Store the epoch time of the update
    file_put_contents($file, json_encode($data));    // Save data
    echo "OK";
} elseif ($_REQUEST['action'] == 'get') {
    // Get watchtime of an user (watchtime.php?channel=streamer&action=get&user=username)
    if (empty($data)) {
        echo 'Empty watchtime, update it first!';
        return;
    }
    if (!array_key_exists('user', $_REQUEST)) {
        echo 'Empty username';
        return;
    }
    define("username", $_REQUEST['user']);
    if (array_key_exists(username, $data)) {
        $passed = time() - $data['$'];
        if ($passed > 600)
            $passed  = 0;
        // Both $data[username] and $passed are integers
        $s = $data[username] + $passed;
        // Parsing seconds to days, hours, mins, secs
        $m = intdiv($s, 60);
        $s -= $m * 60;
        $h = intdiv($m, 60);
        $m -= $h * 60;
        $d = intdiv($h, 24);
        $h -= $d * 24;
        // Show times if only they are greater than zeros
        $args = [];
        if ($d > 0) array_push($args, "{$d} days");
        if ($h > 0) array_push($args, "{$h} hours");
        if ($m > 0) array_push($args, "{$m} minutes");
        if ($s > 0) array_push($args, "{$s} seconds");
        echo username . ' watched  the stream for ' . implode(', ', $args) . '!';
    } else echo 'Invalid username "' . username . '": moderator, too new or nonexistent';
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes