Trying to use php to find if a channel is live

So basically I want to write a php script that will run periodically to see if a channel is live. i have the following code:

<?php
$client_id = 'lqhpxo5cq53rbp2pzmb71qjlusqsw2';//Twitch client id AKA: api key
$user = 'raythgaming';//Streamers username
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.twitch.tv/helix/streams?user_login=$user");//Endpoint
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Client-ID: $client_id"//Add auth
));
$profile_data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($profile_data);

if (!isset($profile_data['data'][0])) {
    $live = 0;//Not live
} else {
    $live = 1;//Is live
}

if ($live == 1) {
    $title = $profile_data['data'][0]['title'];
    $viewer_count = $profile_data['data'][0]['viewer_count'];
    $game_id = $profile_data['data'][0]['game_id'];
    $went_live_at = DateTime::createFromFormat("Y-m-d H:i:s", date("Y-m-d H:i:s", strtotime($profile_data['data'][0]['started_at'])))->format('Y-m-d H:i:s');
    $started = date_create($went_live_at);
    $now = date_create(date('Y-m-d H:i:s'));
    $diff = date_diff($started, $now);
    $hours = $diff->h;
    $minutes = $diff->i;
    echo "<br/>$user is playing $game_name, started streaming $hours hours $minutes minutes ago and has $viewer_count viewers TITLE: $title";
} else {
    echo "<br/>$user is not live";
}

When I run this I’m getting:

Array ( [error] => Unauthorized [status] => 401 [message] => OAuth token is missing )
raythgaming is not live

I’ve tried looking through the docs and cannot for the life of me work out how to get an OAuth token to add into the headers which I know how to do fine.

Your code doesn’t generate a token at all.

For this sort of application an App Access Token is appropriate

You should generate, store, and reuse the token (until it expires) and use that Token with your code, it’s a Simple curl POST request before you do touy Streams call.

Example that will do this, and store the token in a json file in the same directory https://github.com/BarryCarlyon/twitch_misc/blob/master/authentication/app_access_tokens/php/generate_and_maintain_token.php

Thank you i’ve been at this for hours. In the dev console does it matter if I use https://localhost as the redirect URL if I’m hosting this script on my website?

For App Access tokens, a redirect URI is irrelevant. It’s only used for “regular”/user access tokens, so you can leave it as localhost.

Ok so I’ve got the following code now:

[code]<?php
$client_id = “lqhpxo5cq53rbp2pzmb71qjlusqsw2”;
$secret_id = “MYSECRETID”;
$keys = false;
if (file_exists(DIR . ‘/auth.json’)) {
$keys = json_decode(file_get_contents(DIR . ‘/auth.json’));
}

$generate_token = true;
if ($keys) {
// validate the token

$ch = curl_init('https://id.twitch.tv/oauth2/validate');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Authorization: OAuth ' . $keys->access_token
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$r = curl_exec($ch);
$i = curl_getinfo($ch);
curl_close($ch);

if ($i['http_code'] == 200) {
    // the token appears good
    $generate_token = false;

    // optional to check the expires
    $data = json_decode($r);
    if (json_last_error() == JSON_ERROR_NONE) {
        if ($data->expires_in < 3600) {
            // less than an hour left
            // make a new token
            echo 'Token close to expire. Regenerate';
            $generate_token = true;
        }
    } else {
        echo 'Failed to parse JSON. Assume dead token';
        $generate_token = true;
    }
}

} else { $generate_token = true; }

if ($generate_token) {
$ch = curl_init(‘https://id.twitch.tv/oauth2/token’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
‘client_id’ => $client_id,
‘client_secret’ => $secret_id,
‘grant_type’ => “client_credentials”
));

$r = curl_exec($ch);
$i = curl_getinfo($ch);
curl_close($ch);

if ($i['http_code'] == 200) {
    $data = json_decode($r);
    if (json_last_error() == JSON_ERROR_NONE) {
        echo 'Got token';
        print_r($data);

        // store the token for next run
        file_put_contents(__DIR__ . '/auth.json', $r, JSON_PRETTY_PRINT);
    } else {
        echo 'Failed to parse JSON';
    }
} else {
    echo 'Failed with ' . $i['http_code'] . ' ' . $r;
}

} else {
echo ‘Token OK’;
print_r($keys);
}

$user = ‘raythgaming’;//Streamers username
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, “https://api.twitch.tv/helix/streams?user_login=$user”);//Endpoint
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
“Client-ID: $client_id”,
"Authorization: Bearer "+$keys->access_token
));
$profile_data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($profile_data);

if (!isset($profile_data[‘data’][0])) {
$live = 0;//Not live
} else {
$live = 1;//Is live
}

if ($live == 1) {
$title = $profile_data[‘data’][0][‘title’];
$viewer_count = $profile_data[‘data’][0][‘viewer_count’];
$game_id = $profile_data[‘data’][0][‘game_id’];
$went_live_at = DateTime::createFromFormat(“Y-m-d H:i:s”, date(“Y-m-d H:i:s”, strtotime($profile_data[‘data’][0][‘started_at’])))->format(‘Y-m-d H:i:s’);
$started = date_create($went_live_at);
$now = date_create(date(‘Y-m-d H:i:s’));
$diff = date_diff($started, $now);
$hours = $diff->h;
$minutes = $diff->i;
echo “
$user is playing $game_name, started streaming $hours hours $minutes minutes ago and has $viewer_count viewers TITLE: $title”;
} else {
echo “
$user is not live”;
}
[/code]

I’m still getting no OAuth even though I have a token (I checked):

Token OKstdClass Object ( [access_token] => ******* [expires_in] => 5196723 [token_type] => bearer ) Array ( [error] => Unauthorized [status] => 401 [message] => OAuth token is missing )
raythgaming is not live

PHP uses a . to concantente, you just tied to do math and got an unexpected header

You should be using

"Authorization: Bearer " . $keys->access_token

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.