我正在使用一个脚本,当指定的Twitch电视频道播出时播放到IRC。
但由于某些原因,我上网时一直收到错误。但是当它离线时它完全正常。
Python代码:
# Twitch IRC status autoupdate
# Create an empty file called config.yml in the same directory, containing:
# host: irc.quakenet.org
# port: 6667
# channels: ["#channel", "#anotherchannel"]
# nspass: "nickserv/Q password"
# password: "server password for BNC or private server"
# twitch: "channelname"
import requests
import yaml
from HTMLParser import HTMLParser
from sys import stdout
from twisted.internet import reactor, task, protocol
from twisted.python import log
from twisted.words.protocols import irc
from twisted.application import internet, service
with open('config.yml') as f:
config = yaml.load(f.read())
HOST, PORT = config['host'], config['port']
def munge(inp):
# Prevents highlight notification in most clients
return inp[0] + u"\u200b" + inp[1:]
class TwitchProtocol(irc.IRCClient):
password = config["password"] if "password" in config else None
nickname = 'Twitch'
username = 'Twitch'
versionName = 'Twitch'
versionNum = 'v1.0'
realname = 'by blha303. https://gist.github.com/blha303'
loopcall = None
status = False
def signedOn(self):
for channel in self.factory.channels:
self.join(channel)
#Quakenet
self._send_message("auth %s %s" % (self.nickname, config["nspass"]), "Q")
#Nickserv
self._send_message("identify %s %s" % (self.nickname, config["nspass"]), "NickServ")
#Nickserv that doesn't support specifying a nickname
self._send_message("identify %s" % config["nspass"], "NickServ")
def restartloop(reason):
reason.printTraceback()
print "Loop crashed: " + reason.getErrorMessage()
self.loopcall.start(5.0).addErrback(restartloop)
self.loopcall = task.LoopingCall(self.getTwitchStatus)
self.loopcall.start(5.0).addErrback(restartloop)
def getTwitchStatus(self):
channel = config["twitch"]
data = requests.get("http://api.justin.tv/api/stream/list.json?channel=" + channel).json()
if data and not self.status:
fmt = "{}: {} {} ({})"
self.status = True
title = data[0]['title']
playing = ("playing " + data[0]['meta_game']) if "meta_game" in data[0] else ""
viewers = "\x033\x02Online now!\x02\x0f " + str(data[0]["channel_count"]) + " viewer"
print viewers
viewers = viewers + "s" if not " 1 view" in viewers else viewers
print viewers
h = HTMLParser()
for ch in self.factory.channels:
self._send_message(h.unescape(fmt.format(title, munge(channel), playing, viewers)), ch)
elif not data and self.status:
self.status = False
for ch in self.factory.channels:
self._send_message("%s is now offline." % channel, ch)
def privmsg(self, user, channel, message):
nick, _, host = user.partition('!')
print "<%s> %s" % (nick, message)
def _send_message(self, msg, target, nick=None):
if nick:
msg = '%s, %s' % (nick, msg)
self.msg(target, msg)
print "<%s> %s" % (self.nickname, msg)
class TwitchFactory(protocol.ReconnectingClientFactory):
protocol = TwitchProtocol
channels = config["channels"]
if __name__ == '__main__':
reactor.connectTCP(HOST, PORT, TwitchFactory())
log.startLogging(stdout)
reactor.run()
elif __name__ == '__builtin__':
application = service.Application('Twitch')
ircService = internet.TCPClient(HOST, PORT, TwitchFactory())
ircService.setServiceParent(application)
但是当它发现抽搐电视频道播出时会出错。
Error:
2013-12-08 22:42:12+0000 [-] Traceback (most recent call last):
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1192, in run
2013-12-08 22:42:12+0000 [-] self.mainLoop()
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1201, in mainLoop
2013-12-08 22:42:12+0000 [-] self.runUntilCurrent()
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 824, in runUntilCurrent
2013-12-08 22:42:12+0000 [-] call.func(*call.args, **call.kw)
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 218, in __call__
2013-12-08 22:42:12+0000 [-] d = defer.maybeDeferred(self.f, *self.a, **self.kw)
2013-12-08 22:42:12+0000 [-] --- <exception caught here> ---
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 137, in maybeDeferred
2013-12-08 22:42:12+0000 [-] result = f(*args, **kw)
2013-12-08 22:42:12+0000 [-] File "irctwitch.py", line 60, in getTwitchStatus
2013-12-08 22:42:12+0000 [-] data = requests.get("http://api.justin.tv/api/stream/list.json?channel=" + channel).json()
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/dist-packages/requests/models.py", line 651, in json
2013-12-08 22:42:12+0000 [-] return json.loads(self.text or self.content, **kwargs)
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
2013-12-08 22:42:12+0000 [-] return _default_decoder.decode(s)
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/json/decoder.py", line 365, in decode
2013-12-08 22:42:12+0000 [-] obj, end = self.raw_decode(s, idx=_w(s, 0).end())
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/json/decoder.py", line 383, in raw_decode
2013-12-08 22:42:12+0000 [-] raise ValueError("No JSON object could be decoded")
2013-12-08 22:42:12+0000 [-] exceptions.ValueError: No JSON object could be decoded
2013-12-08 22:42:12+0000 [-] Loop crashed: No JSON object could be decoded
如何解决此错误?
Thankies, TameTimmah
答案 0 :(得分:1)
2013-12-08 22:42:12+0000 [-] File "/usr/lib/python2.7/json/decoder.py", line 383, in raw_decode
2013-12-08 22:42:12+0000 [-] raise ValueError("No JSON object could be decoded")
2013-12-08 22:42:12+0000 [-] exceptions.ValueError: No JSON object could be decoded
要求json
模块解码不是JSON数据的内容。
2013-12-08 22:42:12+0000 [-] File "irctwitch.py", line 60, in getTwitchStatus
2013-12-08 22:42:12+0000 [-] data = requests.get("http://api.justin.tv/api/stream/list.json?channel=" + channel).json()
你调用.json()
的东西是无效的JSON。尝试在调用requests.get()
之前打印出.json()
的结果,看看会发生什么。