有什么方法可以使用 Python 检查 Twitch 流是否实时?

问题描述 投票:0回答:11

我只是想知道是否有办法编写一个 python 脚本来检查 twitch.tv 流是否直播?

我不确定为什么我的应用程序引擎标签被删除,但这将使用应用程序引擎。

python twitch
11个回答
10
投票

我讨厌必须经历制作 api 密钥的过程以及所有这些只是为了检查频道是否处于活动状态,所以我尝试找到解决方法:

截至 2021 年 6 月,如果您向类似

https://www.twitch.tv/CHANNEL_NAME
的 url 发送 http get 请求,如果流是直播,则响应中将会有
"isLiveBroadcast": true
,如果流不是直播,则不会有类似的内容.

所以我在nodejs中编写了这段代码作为示例:

const fetch = require('node-fetch');
const channelName = '39daph';

async function main(){
    let a = await fetch(`https://www.twitch.tv/${channelName}`);
    if( (await a.text()).includes('isLiveBroadcast') )
        console.log(`${channelName} is live`);
    else
        console.log(`${channelName} is not live`);
}

main();

这里还有一个Python示例:

import requests
channelName = '39daph'

contents = requests.get('https://www.twitch.tv/' +channelName).content.decode('utf-8')

if 'isLiveBroadcast' in contents: 
    print(channelName + ' is live')
else:
    print(channelName + ' is not live')

9
投票

由于截至 2020 年 5 月 2 日所有答案实际上都已过时,因此我会尝试一下。您现在需要注册一个开发人员应用程序(我相信),并且现在您必须使用需要用户 ID 而不是用户名的端点(因为它们可以更改)。

参见 https://dev.twitch.tv/docs/v5/reference/users

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

首先您需要注册一个应用程序

从中您需要获得您的

Client-ID

这个例子中的那个不是真实的

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

5
投票

看起来 Twitch 提供了一个 API(文档这里),它提供了一种获取该信息的方法。获取 feed 的一个非常简单的例子是:

import urllib2

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

print contents.read()

这将转储所有信息,然后您可以使用 JSON 库 解析这些信息(XML 看起来也可用)。如果流不是实时的,则该值看起来会返回空(根本没有测试这么多,也没有读过任何内容:))。希望这有帮助!


5
投票

RocketDonkey 的好答案现在似乎已经过时了,所以我为像我这样在谷歌上偶然发现这个问题的人发布了一个更新的答案。 您可以通过解析来检查用户EXAMPLEUSER的状态

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

条目“stream”:null会告诉您该用户是否离线、该用户是否存在。 这是一个小的 Python 脚本,您可以在命令行上使用它,该脚本将打印 0 表示用户在线,1 表示用户离线,2 表示用户未找到。

#!/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.\n'
            '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

4
投票

📚 解释

现在,Twitch API v5 已弃用。

helix
API 已到位,需要
OAuth Authorization Bearer
AND
client-id
。这非常烦人,所以我继续寻找可行的解决方法,并找到了一个。

🌎GraphQL

在未登录的情况下检查 Twitch 的网络请求时,我发现匿名 API 依赖于 GraphQL。 GraphQL 是一种API 查询语言

query {
  user(login: "USERNAME") {
    stream {
      id
    }
  }
}

在上面的 graphql 查询中,我们通过用户的

login name
来查询用户。如果它们正在流式传输,则会给出该流的
id
。如果没有,
None
将被退回。

🐍最终代码

函数中完成的 Python 代码如下。

client-id
取自 Twitch 网站。 Twitch 使用
client-id
来获取匿名用户的信息。它始终有效,无需您自己购买
client-id

import requests
# ...
def checkIfUserIsStreaming(username):
  url = "https://gql.twitch.tv/gql"
  query = "query {\n  user(login: \""+username+"\") {\n    stream {\n      id\n    }\n  }\n}"
  return True if requests.request("POST", url, json={"query": query, "variables": {}}, headers={"client-id": "kimne78kx3ncx6brgo4mv6wki5h1ko"}).json()["data"]["user"]["stream"] else False
我创建了一个网站,您可以在其中使用 Twitch 的 GraphQL API。请参阅 GraphQL 文档 以获取有关 GraphQL 语法的帮助!我的 Playground 上还有 Twitch GraphQL API 文档。

3
投票

这里是使用最新版本的 Twitch API(螺旋)的更新答案。 (kraken 已被弃用,您不应该使用 GQL,因为它没有记录供第三方使用)。

它可以工作,但您应该存储令牌并重用令牌,而不是每次运行脚本时生成新令牌。


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');

2
投票

使用 twitch api 并以您的 client_id 作为参数,然后解析 json:

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

Twitch 客户端 ID 的解释如下:https://dev.twitch.tv/docs#client-id, 您需要注册开发者应用程序:https://www.twitch.tv/kraken/oauth2/clients/new

示例:

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

2
投票

我会尝试拍摄我的镜头,以防万一有人仍然需要这个问题的答案,所以就在这里

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'))

2
投票

https://dev.twitch.tv/docs/api/reference#get-streams

import requests
# ================================================================
# your twitch client id
client_id = '' 
# your twitch secret       
client_secret = ''
# twitch username you want to check if it is streaming online
twitch_user = ''                           
# ================================================================
#getting auth token
url = 'https://id.twitch.tv/oauth2/token'
params = {
    'client_id':client_id,
    'client_secret':client_secret,
    'grant_type':'client_credentials'}
req = requests.post(url=url,params=params)
token = req.json()['access_token']
print(f'{token=}')
# ================================================================
#getting user data (user id for example)
url = f'https://api.twitch.tv/helix/users?login={twitch_user}'
headers = {
    'Authorization':f'Bearer {token}',
    'Client-Id':f'{client_id}'}
req = requests.get(url=url,headers=headers)
userdata = req.json()
userid = userdata['data'][0]['id']
print(f'{userid=}')
# ================================================================
#getting stream info (by user id for example)
url = f'https://api.twitch.tv/helix/streams?user_id={userid}'
headers = {
    'Authorization':f'Bearer {token}',
    'Client-Id':f'{client_id}'}
req = requests.get(url=url,headers=headers)
streaminfo = req.json()
print(f'{streaminfo=}')
# ================================================================

1
投票

此解决方案不需要注册应用程序

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']['stream'] is not None else False


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

0
投票

是的。 您可以使用 Twitch API 调用

https://api.twitch.tv/kraken/streams/YOUR_CHANNEL_NAME
并解析结果来检查它是否处于活动状态。

如果频道处于直播状态,下面的函数将返回 streamID,否则返回 -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)
© www.soinside.com 2019 - 2024. All rights reserved.