qiandao icon indicating copy to clipboard operation
qiandao copied to clipboard

能否加入对json的支持

Open yingziwu opened this issue 7 years ago • 6 comments

对于返回结果为json的response,能否像requests库中.json()那样解析,这样可以大大方便数据选择。

yingziwu avatar May 01 '17 07:05 yingziwu

有什么是正则获取不到的吗?

binux avatar May 01 '17 10:05 binux

之前对问题的描述不太准确,准确的来说是,如何在变量提取过程中,将之前已经提取过的一部分变量带入新的提取表达式中。

至于对于json的支持也仅仅是锦上添花的东西,并不是主要问题。

举个例子来说吧。

$ curl 'http://book.sfacg.com/ajax/ashx/Common.ashx?op=getSigninInfoNew&year=2017&month=5&_=1493700308445' -H 'Host: book.sfacg.com' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2869.0 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'Referer: http://book.sfacg.com/signin/' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: middle2=1; validateCode=BAD8DDCA90355D457106FFF879B00B66; .SFCommunity=75EE70E3A82C4720C03E7F9ED95D8215944D71BFA3B3D7261581B979E4A0812E08023664FCFE2144A9D02EFBDC089E56674723374D7FA01EE57E72DA8444BFF9E24706005DF9F4BCC42BAF2CE26D0BBAF054945E0110A37243B00624A7BBB854; dnt=userid=2868333&password=xCOsOaB8htvNUZ8htEtXX4KTazWr%2fNORw%2bUg62%2bY3axNMjyC%2fD4a0w%3d%3d&avatar=avatars%2fcommon%2f2009-06-04_0-33-46.jpg&tpp=0&ppp=0&pmsound=0&invisible=0&referer=index.aspx&sigstatus=0&expires=10080' -H 'DNT: 1' -H 'Connection: keep-alive'
{"status":200,"data":{"daySignin":[{"day":1,"hasSignin":true,"continuousSignin":1},{"day":2,"hasSignin":false,"continuousSignin":0},{"day":3,"hasSignin":false,"continuousSignin":0},{"day":4,"hasSignin":false,"continuousSignin":0},{"day":5,"hasSignin":false,"continuousSignin":0},{"day":6,"hasSignin":false,"continuousSignin":0},{"day":7,"hasSignin":false,"continuousSignin":0},{"day":8,"hasSignin":false,"continuousSignin":0},{"day":9,"hasSignin":false,"continuousSignin":0},{"day":10,"hasSignin":false,"continuousSignin":0},{"day":11,"hasSignin":false,"continuousSignin":0},{"day":12,"hasSignin":false,"continuousSignin":0},{"day":13,"hasSignin":false,"continuousSignin":0},{"day":14,"hasSignin":false,"continuousSignin":0},{"day":15,"hasSignin":false,"continuousSignin":0},{"day":16,"hasSignin":false,"continuousSignin":0},{"day":17,"hasSignin":false,"continuousSignin":0},{"day":18,"hasSignin":false,"continuousSignin":0},{"day":19,"hasSignin":false,"continuousSignin":0},{"day":20,"hasSignin":false,"continuousSignin":0},{"day":21,"hasSignin":false,"continuousSignin":0},{"day":22,"hasSignin":false,"continuousSignin":0},{"day":23,"hasSignin":false,"continuousSignin":0},{"day":24,"hasSignin":false,"continuousSignin":0},{"day":25,"hasSignin":false,"continuousSignin":0},{"day":26,"hasSignin":false,"continuousSignin":0},{"day":27,"hasSignin":false,"continuousSignin":0},{"day":28,"hasSignin":false,"continuousSignin":0},{"day":29,"hasSignin":false,"continuousSignin":0},{"day":30,"hasSignin":false,"continuousSignin":0},{"day":31,"hasSignin":false,"continuousSignin":0}],"dayMonth":31,"dayOfWeek":1,"curDay":2}}

对于上面的请求,需要判断今天是否签到。

用正则的话,大概是如下的过程:

In [1]: text='{"status":200,"data":{"daySignin":[{"day":1,"hasSignin":true,"continuousSignin":1},{"day":2,"hasSignin":false,"continuousSignin":0},{"day":3,"hasSignin":false,"continuousSigni
   ...: n":0},{"day":4,"hasSignin":false,"continuousSignin":0},{"day":5,"hasSignin":false,"continuousSignin":0},{"day":6,"hasSignin":false,"continuousSignin":0},{"day":7,"hasSignin":false,"
   ...: continuousSignin":0},{"day":8,"hasSignin":false,"continuousSignin":0},{"day":9,"hasSignin":false,"continuousSignin":0},{"day":10,"hasSignin":false,"continuousSignin":0},{"day":11,"h
   ...: asSignin":false,"continuousSignin":0},{"day":12,"hasSignin":false,"continuousSignin":0},{"day":13,"hasSignin":false,"continuousSignin":0},{"day":14,"hasSignin":false,"continuousSign
   ...: in":0},{"day":15,"hasSignin":false,"continuousSignin":0},{"day":16,"hasSignin":false,"continuousSignin":0},{"day":17,"hasSignin":false,"continuousSignin":0},{"day":18,"hasSignin":fa
   ...: lse,"continuousSignin":0},{"day":19,"hasSignin":false,"continuousSignin":0},{"day":20,"hasSignin":false,"continuousSignin":0},{"day":21,"hasSignin":false,"continuousSignin":0},{"day
   ...: ":22,"hasSignin":false,"continuousSignin":0},{"day":23,"hasSignin":false,"continuousSignin":0},{"day":24,"hasSignin":false,"continuousSignin":0},{"day":25,"hasSignin":false,"continu
   ...: ousSignin":0},{"day":26,"hasSignin":false,"continuousSignin":0},{"day":27,"hasSignin":false,"continuousSignin":0},{"day":28,"hasSignin":false,"continuousSignin":0},{"day":29,"hasSig
   ...: nin":false,"continuousSignin":0},{"day":30,"hasSignin":false,"continuousSignin":0},{"day":31,"hasSignin":false,"continuousSignin":0}],"dayMonth":31,"dayOfWeek":1,"curDay":2}}'

In [2]: import re

In [9]: curDay=re.findall(r'curDay\":(\d+)',text)[0]

In [10]: curDay
Out[10]: '2'

In [13]: status=re.findall(r'day\":%s,\"hasSignin\":(true|false)' % curDay,text)[0]

In [14]: status
Out[14]: 'false'

第二个正则式需要,使用之前提取出来的curDay值,查阅了一下资料,好像并不支持这样的功能。

至于之前说的json支持,只是我先写的签到脚本,然后希望可以直接用之前的表达式而已,并不是主要问题。

In [15]: import json

In [16]: tmp=json.loads(text)

In [20]: tmp['data']['daySignin'][tmp['data']['curDay']-1]['hasSignin']
Out[20]: False

yingziwu avatar May 02 '17 05:05 yingziwu

可以增加一个 json_load 函数,这样就可以把变量转换成 dict 操作了。

binux avatar May 02 '17 09:05 binux

加个json_load函数可以呀。

那么在变量提取过程中可以使用变量吗? 这点好像没有看懂。

yingziwu avatar May 02 '17 11:05 yingziwu

如果你用正则提取为变量,这个变量的类型是 string,然后把它整个转换成 json object 之后,这个变量就可以通过 {{ var.data.daySignin[var.data.curDay - 1].hasSignin }} 这样访问了。

binux avatar May 02 '17 11:05 binux

image 你好 需要根据返回json 来判断 "cycle"为 "dayly"时, 去请求href的地址 ,这个目前可以实现么?

wxyShine avatar Apr 16 '24 00:04 wxyShine