2016-10-31 64 views
0

1)我几天前工作了几个星期的脚本。我现在无法正确解析JSON。所以这不是新的新代码,它已经运行了好几个月。如何处理不正确的json格式? (simplejson.scanner.JSONDecodeError:期望值:第1行第1列(char 0))

2)服务网站发生了一些变化,它使JSON不合规,但我一直试图绕过这个问题没有成功。我认为这可能是一个额外的空间或什么,但我不能改变服务网站返回的信息。 3)我知道json不符合规范,因为我使用验证器(https://jsonformatter.curiousconcept.com/),通过将我需要的服务的URL与我所需的凭据/格式相结合,我得到了正确的结果,但验证失败,出现“Invalid encoding ,期待UTF-8,UTF-16或UTF-32。[代码29,结构0]“。有一种方法可以告诉验证器不要验证,Json看起来不错,但是Python不会有任何关系。当我运行我的脚本时,它会报告: simplejson.scanner.JSONDecodeError:期望值:第1行第1列(char 0)。

4)以下是我手动输入的网址和脚本。我已经混淆了所有敏感和个人信息,所以如果您尝试使用URL,将无法使用,但是当我使用非混淆格式时,我确实收到了JSON响应。

5)手册URL(模糊): https://mystuff.mydevices.com/Membership/SomeOtherURLrelated?appId=BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi&securityToken=null&[email protected]&password=mypassword&culture=en

6)如果我手动打开浏览器,并把前一个真实URL(未修改),浏览器使用JSON响应。示例(混淆): {“UserId”:0,“SecurityToken”:“abcdb8c3-1ef1-1110-1234-402a914f52aa”,“ReturnCode”:“0”,“ErrorMessage”:“”,“BrandId”:2 ,“BrandName”:“Mydevicebrandname”,“RegionId”:1}

7)我能做些什么来克服这个问题?有什么建议么 ?我一直在阅读和测试,但没有运气!

8)现在脚本(模糊),基本上建立在以前的URL和提取从JSON一次性安全令牌,然后我可以在一个更大的应用程序用于其他用途:

import json,requests 


APPID = 'BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi' 
USERNAME = '[email protected]' 
PASSWORD = 'mypassword' 
CULTURE = 'en' 
SERVICE = 'https://mystuff.mydevices.com' 

def get_token_formydevices(): 
    payload = {'appId': APPID, 
       'securityToken': 'null', 
       'username': USERNAME, 
       'password': PASSWORD, 
       'culture': CULTURE,} 
    login_url = SERVICE + '/Membership/SomeOtherURLrelated' 
    try: 
     r = requests.get(login_url, params=payload) 
    except requests.exceptions.RequestException as err: 
     return  

    data = r.json() 
    if data['ReturnCode'] != '0': 
     print(data['ErrorMessage']) 
     sys.exit(1) 
    return data['SecurityToken'] 

tokenneeded = get_token_formydevices() 

print tokenneeded 

9)当我运行以前的代码,这是我回来的:

Traceback (most recent call last): 
    File "testtoken.py", line 33, in <module> 
    tokenneeded = get_token_formydevices() 
    File "testtoken.py", line 26, in get_token_formydevices 
    data = r.json() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 826, in json 
    return complexjson.loads(self.text, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/__init__.py", line 516, in loads 
    return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/decoder.py", line 370, in decode 
    obj, end = self.raw_decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/simplejson/decoder.py", line 400, in raw_decode 
    return self.scan_once(s, idx=_w(s, idx).end()) 
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 
+0

代替'r.json()',使用'r.content'或'r。文字“,所以你可以看到到底是什么被返回。我猜这将是HTML或什么都没有。如果它看起来像JSON那么发布你能在这里。 –

+0

使用或者r.content或r.text我回来是这样的: $蟒蛇testtoken.py 请求被拒绝您的请求已被拒绝。

[11679954572637177442] – pythonista

+0

听起来像您的凭据已过期。也许与他们联系。 –

回答

0

我找到了一个解决方案,并希望分享。

所以我非常困惑,我可以在网络浏览器中打开服务URL并获取一些json,但我无法在我的脚本中甚至仅使用cURL。即使请求是从浏览器运行的,我仍然一直在“请求被拒绝”,所以它必须是别的东西。

所以我开始尝试并发送请求中的用户代理信息在我的脚本和voilá!下面的代码正在工作,虽然我混淆了原始URL和我的凭据以保护。

我还想解释一下,我这样做是因为服务URL提供了一次性令牌,然后我可以使用它来触发另一个操作。所以我需要这个例程和执行多次,我需要进行特定的操作,所以我只想从json形式的URL中检索令牌。希望下面的代码能更有意义。

import json,urllib2 
url='https://mystuff.mydevices.com/Membership/SomeOtherURLrelated?appId=BB8pQgg123450WHahgl12345nAkkX67890q2HrHD7H1nabcde5KqtN654321LB%2fi&securityToken=null&[email protected]&password=mypassword&culture=en' 
request = urllib2.Request(url) 
#request.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36') # <--- this works too 
request.add_header('User-Agent', 'Mozilla/5.0') 
data = json.loads(str(urllib2.urlopen(request).read())) 
token = data["SecurityToken"] 
print token 
相关问题