我只是想知道是否有办法编写python脚本来检查twitch.tv流是否有效?任何和所有的想法都表示赞赏!
编辑:我不确定为什么我的应用引擎代码被移除了,但这将使用应用引擎。
答案 0 :(得分:6)
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
答案 1 :(得分:6)
由于截至2020-05-02的所有答案实际上都已过时,我将试一试。现在,您需要注册一个开发人员应用程序(我相信),并且现在您必须使用需要用户名而不是用户名的端点(因为它们可以更改)。
请参见https://dev.twitch.tv/docs/v5/reference/users
和https://dev.twitch.tv/docs/v5/reference/streams
首先,您需要Register an application
因此,您需要获取conda activate myenv
python xxx.py
。
这个例子中的那个不是真实的
Client-ID
答案 2 :(得分:5)
看起来Twitch提供了一个API(文档here),它提供了获取该信息的方法。获取Feed的一个非常简单的示例是:
import urllib2
url = 'http://api.justin.tv/api/stream/list.json?channel=FollowGrubby'
contents = urllib2.urlopen(url)
print contents.read()
这将转储所有信息,然后您可以使用JSON library进行解析(XML看起来也可用)。看起来如果流不是活的话,该值返回空(没有测试过这么多,也没有读过任何东西:))。希望这有帮助!
答案 3 :(得分:1)
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
答案 4 :(得分:1)
我会尝试拍摄,以防万一有人仍然需要答案,所以就这样
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'))
答案 5 :(得分: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'] else False
if __name__ == '__main__':
USERS = ['forsen', 'offineandy', 'dyrus']
for user in USERS:
IS_LIVE = isLive(user)
print(f'User {user} live: {IS_LIVE}')
答案 6 :(得分:1)
这是使用最新版本的 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');
答案 7 :(得分:1)
我讨厌为了检查频道是否上线而不得不经历制作 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')
答案 8 :(得分: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)