2013-12-08 75 views
0

我正在使用一个脚本,当一个指定的Twitch电视频道播放时,广播到IRC。Python JSON解码器错误

但由于某种原因,我不断收到错误,当它上线。但是当它脱机时,它工作得很好。

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

停止尝试解码不是JSON的东西。 –

+0

你应该编码'channel',例如'urllib.urlencode({'channel':channel})''。你可以使用['twisted.web.client.getPage'获取json](https://gist.github.com/zed/7865274)。 – jfs

回答

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