繁体   English   中英

Python JSON解码器错误

[英]Python JSON Decoder Error

我当前正在使用一个脚本,当指定的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

如何解决此错误?

谢谢,TameTimmah

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()看看会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM