Există vreo modalitate de a verifica dacă un stream Twitch este live folosind Python? (Programare, Python, Twitch)

suitegamer a intrebat.

Mă întrebam dacă există vreo modalitate de a scrie un script python pentru a verifica dacă un flux twitch.tv este live?

Nu sunt sigur de ce tag-ul meu app engine a fost eliminat, dar acest lucru ar fi folosind app engine.

Comentarii

  • Întotdeauna există o cale, trebuie doar să o găsești. Data viitoare, vă rugăm să ne arătați ce ați făcut până acum și să menționați, de asemenea, că doriți să ruleze pe GAE, nu doar să-l etichetați ca fiind GAE. –  > Por dav1d.
  • Obișnuiam să fac asta în postările mele vechi (să menționez GAE în titlu), iar oamenii s-au supărat și au început să-mi spună să o etichetez doar. –  > Por suitegamer.
  • Ei bine, dacă întrebarea nu are legătură directă cu GAE (cum ar fi aceasta), pur și simplu las-o deoparte. –  > Por dav1d.
8 răspunsuri
RocketDonkey

Se pare că Twitch oferă un API (documentație aici) care oferă o modalitate de a obține aceste informații. Un exemplu foarte simplu de obținere a feed-ului ar fi:

import urllib2

url = 'http://api.justin.tv/api/stream/list.json?channel=FollowGrubby'
contents = urllib2.urlopen(url)

print contents.read()

Acest lucru va arunca toate informațiile, pe care le puteți analiza cu un fișier bibliotecă JSON (se pare că este disponibil și XML). Se pare că valoarea returnează gol dacă fluxul nu este live (nu am testat acest lucru prea mult și nici nu am citit nimic 🙂 ). Sper să vă fie de ajutor!

Comentarii

  • Oh, de ce vă mulțumesc. Nu sunt deosebit de versat cu JSON, dar voi citi ceva! Mulțumesc din nou! –  > Por suitegamer.
  • API-ul Justin.tv a fost închisă în 2014, , ceea ce înseamnă că acest răspuns nu mai funcționează. –  > Por Stevoisiak.
Cherona

Din moment ce toate răspunsurile sunt de fapt depășite la data de 2020-05-02, o să încerc și eu. Acum vi se cere să înregistrați o aplicație de dezvoltator (cred), iar acum trebuie să folosiți un endpoint care necesită un user-id în loc de un nume de utilizator (deoarece acestea se pot schimba).

A se vedea https://dev.twitch.tv/docs/v5/reference/users

și https://dev.twitch.tv/docs/v5/reference/streams

Mai întâi va trebui să Să înregistrați o aplicație

După aceea, va trebui să obțineți Client-ID.

Cea din acest exemplu nu este o aplicație reală

TWITCH_STREAM_API_ENDPOINT_V5 = "https://api.twitch.tv/kraken/streams/{}"

API_HEADERS = {
    'Client-ID' : 'tqanfnani3tygk9a9esl8conhnaz6wj',
    'Accept' : 'application/vnd.twitchtv.v5+json',
}

reqSession = requests.Session()

def checkUser(userID): #returns true if online, false if not
    url = TWITCH_STREAM_API_ENDPOINT_V5.format(userID)

    try:
        req = reqSession.get(url, headers=API_HEADERS)
        jsondata = req.json()
        if 'stream' in jsondata:
            if jsondata['stream'] is not None: #stream is online
                return True
            else:
                return False
    except Exception as e:
        print("Error checking user: ", e)
        return False

Comentarii

  • Hei, tocmai am încercat să folosesc codul tău și sunt foarte recunoscător că am găsit codul nostru, pentru că ești singurul care folosește API v5, dar sunt încă confuz în ceea ce privește URL-ul, pentru că al meu întoarce un no client-id specified Ai putea să-mi dai un exemplu de URL? –  > Por Tanuj KS.
  • Variabila reqSession este nedefinită. –  > Por Stevoisiak.
timgeb

Frumosul răspuns al lui RocketDonkey pare să fie depășit până acum, așa că postez un răspuns actualizat pentru cei ca mine care dau peste această întrebare SO cu ajutorul google.Puteți verifica starea utilizatorului EXAMPLEUSER analizând

https://api.twitch.tv/kraken/streams/EXAMPLEUSER

Intrarea „stream”:null vă va spune că utilizatorul dacă este offline, dacă acel utilizator există. iată un mic script Python pe care îl puteți folosi în linia de comandă care va imprima 0 pentru utilizator online, 1 pentru utilizator offline și 2 pentru utilizator nedescoperit.

#!/usr/bin/env python3

# checks whether a twitch.tv userstream is live

import argparse
from urllib.request import urlopen
from urllib.error import URLError
import json

def parse_args():
    """ parses commandline, returns args namespace object """
    desc = ('Check online status of twitch.tv user.
'
            'Exit prints are 0: online, 1: offline, 2: not found, 3: error.')
    parser = argparse.ArgumentParser(description = desc,
             formatter_class = argparse.RawTextHelpFormatter)
    parser.add_argument('USER', nargs = 1, help = 'twitch.tv username')
    args = parser.parse_args()
    return args

def check_user(user):
    """ returns 0: online, 1: offline, 2: not found, 3: error """
    url = 'https://api.twitch.tv/kraken/streams/' + user
    try:
        info = json.loads(urlopen(url, timeout = 15).read().decode('utf-8'))
        if info['stream'] == None:
            status = 1
        else:
            status = 0
    except URLError as e:
        if e.reason == 'Not Found' or e.reason == 'Unprocessable Entity':
            status = 2
        else:
            status = 3
    return status

# main
try:
    user = parse_args().USER[0]
    print(check_user(user))
except KeyboardInterrupt:
    pass

Comentarii

  • Bună ziua. Ați putea face o versiune Python27 a acestui script cu urllib2? Eu sunt în prezent acest lucru, dar nu înțeleg ce schimbare în parse_args pentru ca acesta să funcționeze pe python27 pastebin.com/7vkuPZ9J Am găsit acest lucru, dar nu prea înțeleg ce să schimb stackoverflow.com/questions/16878315/… Orice ajutor ar fi apreciat! Editare Am reușit să funcționeze! –  > Por vARGEN.
  • Pe tema furnizării de informații actualizate, documentația API Twitch este acum aici: github.com/justintv/Twitch-API –  > Por S. Kirby.
  • Chiar și acest lucru este acum în afara timpului și unul necesită înregistrarea unei aplicații cu Twitch, astfel încât să puteți trimite un clientid ca date GET. –  > Por ch4rl1e97.
Hhhhhhhhh

Utilizați api Twitch cu client_id-ul dvs. ca parametru, apoi analizați json-ul:

https://api.twitch.tv/kraken/streams/massansc?client_id=XXXXXXX

Twitch Client Id este explicat aici: https://dev.twitch.tv/docs#client-id,trebuie să înregistrați o aplicație de dezvoltator: https://www.twitch.tv/kraken/oauth2/clients/new

Exemplu:

import requests
import json

def is_live_stream(streamer_name, client_id):

    twitch_api_stream_url = "https://api.twitch.tv/kraken/streams/" 
                    + streamer_name + "?client_id=" + client_id

    streamer_html = requests.get(twitch_api_stream_url)
    streamer = json.loads(streamer_html.content)

    return streamer["stream"] is not None

Comentarii

  • Aceasta utilizează API v3, care a fost întreruptă în 2019. Twitch răspunde acum cu {"error":"Gone","status":410,"message":"v3 is a lie but v5 is still alive. See https://dev.twitch.tv/docs"} –  > Por Stevoisiak.
Inzer Lee

Voi încerca să-mi împușc lovitura, în cazul în care cineva încă mai are nevoie de un răspuns la acest lucru, așa că aici merge

import requests
import time
from twitchAPI.twitch import Twitch

client_id = ""
client_secret = ""

twitch = Twitch(client_id, client_secret)
twitch.authenticate_app([])

TWITCH_STREAM_API_ENDPOINT_V5 = "https://api.twitch.tv/kraken/streams/{}"

API_HEADERS = {
    'Client-ID' : client_id,
    'Accept' : 'application/vnd.twitchtv.v5+json',
}

def checkUser(user): #returns true if online, false if not
    userid = twitch.get_users(logins=[user])['data'][0]['id']
    url = TWITCH_STREAM_API_ENDPOINT_V5.format(userid)
    try:
        req = requests.Session().get(url, headers=API_HEADERS)
        jsondata = req.json()
        if 'stream' in jsondata:
            if jsondata['stream'] is not None: 
                return True
            else:
                return False
    except Exception as e:
        print("Error checking user: ", e)
        return False

print(checkUser('michaelreeves'))

ngub05

Da. Puteți utiliza apelul API Twitch https://api.twitch.tv/kraken/streams/YOUR_CHANNEL_NAME și să analizați rezultatul pentru a verifica dacă este în direct.

Funcția de mai jos returnează un streamID dacă canalul este în direct, în caz contrar returnează -1.

import urllib2, json, sys
TwitchChannel = 'A_Channel_Name'
def IsTwitchLive(): # return the stream Id is streaming else returns -1
    url = str('https://api.twitch.tv/kraken/streams/'+TwitchChannel)
    streamID = -1
    respose = urllib2.urlopen(url)
    html = respose.read()
    data = json.loads(html)
    try:
       streamID = data['stream']['_id']
    except:
       streamID = -1
    return int(streamID)

Comentarii

  • Acest lucru nu mai funcționează, acum primiți o eroare care spune Bad request, no client id –  > Por Zeeno.
544146

Această soluție nu necesită înregistrarea unei aplicații

import requests

HEADERS = { 'client-id' : 'kimne78kx3ncx6brgo4mv6wki5h1ko' }
GQL_QUERY = """
query($login: String) {
    user(login: $login) {
        stream {
            id
        }
    }
}
"""

def isLive(username):
    QUERY = {
        'query': GQL_QUERY,
        'variables': {
            'login': username
        }
    }

    response = requests.post('https://gql.twitch.tv/gql',
                             json=QUERY, headers=HEADERS)
    dict_response = response.json()
    return True if dict_response['data']['user'] else False


if __name__ == '__main__':
    USERS = ['forsen', 'offineandy', 'dyrus']
    for user in USERS:
        IS_LIVE = isLive(user)
        print(f'User {user} live: {IS_LIVE}')

Barry Carlyon

Iată un răspuns mai actualizat care utilizează cea mai recentă versiune a API-ului Twitch (helix). (kraken este depreciat și nu ar trebui să folosiți GQL, deoarece nu este documentat pentru utilizarea de către terți).

Funcționează, dar ar trebui să stocați token-ul și să reutilizați token-ul mai degrabă decât să generați un nou token de fiecare dată când executați scriptul.


import requests

client_id = ''
client_secret = ''
streamer_name = ''

body = {
    'client_id': client_id,
    'client_secret': client_secret,
    "grant_type": 'client_credentials'
}
r = requests.post('https://id.twitch.tv/oauth2/token', body)

#data output
keys = r.json();

print(keys)

headers = {
    'Client-ID': client_id,
    'Authorization': 'Bearer ' + keys['access_token']
}

print(headers)

stream = requests.get('https://api.twitch.tv/helix/streams?user_login=' + streamer_name, headers=headers)

stream_data = stream.json();

print(stream_data);

if len(stream_data['data']) == 1:
    print(streamer_name + ' is live: ' + stream_data['data'][0]['title'] + ' playing ' + stream_data['data'][0]['game_name']);
else:
    print(streamer_name + ' is not live');