下面是实战代码,用命令行登录博客园,共三次请求,第一次请求获取表单的 VIEWSTATE 和 EVENTVALIDATION,第二次带账户登录,第三次带Cookie访问其首页: //封装成远程访问的函数 passport.cnblogs.com/login.aspx"; var objFirst = RemoteCall("GET", url, null); //取得 viewstate 与 eventvalidation \/>/)[1]; var eventvalidation = objFirst.responseText.match(/id="__EVENTVALIDATION" value="(.*?)" var password = ""; var param = "" + "__VIEWSTATE="+encodeURIComponent(viewstate) + "&__EVENTVALIDATION ="+encodeURIComponent(eventvalidation) + "&tbUserName="+username + "&tbPassword="+password
'__EVENTARGUMENT': '', '__VIEWSTATE': self.data['__VIEWSTATE'], '__EVENTVALIDATION ': self.data['__EVENTVALIDATION'], 'hidJZ': 'jz'+name, 'RegionPanel2$Region1$ box_ajax_mark': 'true' } 坑说完了,说说部分代码的作用吧 def __get_value(self, html): # 获取表单的两个参数__VIEWSTATE和__EVENTVALIDATION __EVENTVALIDATION\|(.*?) \|', html) self.data['__VIEWSTATE'] = match.group(1) self.data['__EVENTVALIDATION
{ string uriString = "这里是取VIEWSTATE等值的页面"; //如果是asp.net页面,最好是先取到VIEWSTATE和EVENTVALIDATION ("\"",i); string viewState = srcString.Substring(i, j-i); // 获取页面的 EventValidation 这个值和EventValidation 的值在这里用于数据接收页接收数据 string eventValidationFlag = "id=\"__EVENTVALIDATION\" ; j = srcString.IndexOf("\"", i); string eventValidation = srcString.Substring =" + eventValidation; /*txt_title为标题内容,bookContent为内容txt_menuid为当前章节数cmdSaveConn.x=0&cmdSaveConn.y
__EVENTTARGET: checked __EVENTARGUMENT:checked __VIEWSTATE:checked (__VIEWSTATEGENERATOR:)checked __EVENTVALIDATION BeautifulSoup import requests import json html_page = "page_source.html" def extract_data(page): data = {"eventvalidation html: #注意这里要先打开文件 soup = BeautifulSoup(html,'lxml') #这里对文件进行解析,lxml是解析的方式 ev = soup.find(id='__EVENTVALIDATION ') #以__EVENTVALIDATION为关键词进行查找,注意要加上id=,把结果保存到ev当中 data['eventvalidation'] = ev['value'] #提取ev的值,注意不能直接令它为字典的值
保存在 id 为 __EVENTVALIDATION 的 hidden中,它看起来可能是这样的 <input type=”hidden” id=”__EVENTVALIDATION” name= “__ EVENTVALIDATION” value=”/wEWBQKGg9abDQKd9sHMBgKc9s……..” /> 当我们选择省市的DropDownList 并提交时,在 DropDownList 的 LoadPostData 事件中会验证提交的内容与 id 为 __EVENTVALIDATION 的 hidden 的Value ,因为之前市的DropDownList 并没有项,可是提交的时候 我们给它加了若干项而事件验证机制不知道
t=sh' EVENTVALIDATION = response.xpath("//*[@id='__EVENTVALIDATION']/@value").extract() />',sourepage.text)[0] # formdata['__EVENTVALIDATION'] = re.findall(r'<input type="hidden " name="__<em>EVENTVALIDATION</em>" id="__<em>EVENTVALIDATION</em>" value="(.*?)" VIEWSTATEGENERATOR'] = 'EC4ACD6F' formdata['__VIEWSTATE'] =VIEWSTATE[0] formdata['__EVENTVALIDATION '] = EVENTVALIDATION[0] formdata['__VIEWSTATEGENERATOR'] = VIEWSTATEGENERATOR[0]
发生原因: .NET基于页面中的输出元素会在最终页面中生成一个__EVENTVALIDATION隐藏字段。做了一个简单的测试。 观察前后两次__EVENTVALIDATION 的内容,可以发现是不同的。
发生原因: .NET基于页面中的输出元素会在最终页面中生成一个__EVENTVALIDATION隐藏字段。做了一个简单的测试。 观察前后两次__EVENTVALIDATION 的内容,可以发现是不同的。
value="Button" οnclick="AlertHello();" id="Button2" />
保存在 id 为 __EVENTVALIDATION 的 hidden中,它看起来可能是这样的 <input type=”hidden” value=”/wEWBQKGg9abDQKd9sHMBgKc9s ……..” /> 当我们选择省市的DropDownList 并提交时,在 DropDownList 的 LoadPostData 事件中会验证提交的内容与 id 为 __EVENTVALIDATION
2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION 2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION 2FyXrpEQQLtIFyLoPLGND86N0hSq0CED%2Brk" + "&__VIEWSTATEGENERATOR=3A0BE18D" + "&__EVENTVALIDATION 2Bi5YiwNTI3MjjmnaHnrKblkIjopoHmsYLnmoTkvovlj6UhZGQCBQ8PFgIfAGhkZAIHDw8WAh8AaGRkAg0PDxYCHwBnZGQCLw8PFgIfAGdkFgoCAQ8PFgIfAGhkZAIDDw8WAh8AaGRkAgkPDxYCHwEFATFkZAILDw8WAh8BBQMxMDZkZAINDw8WAh8BBQU1MjcyOGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYKBQtSQmluZGV4d29yZAUKUkJsaWtlbW9kZQUKUkJsaWtlbW9kZQUOUkJmdWxsdGV4dG1vZGUFDlJCZnVsbHRleHRtb2RlBQxSYWRpb0J1dHRvbjMFDFJhZGlvQnV0dG9uMwUMUmFkaW9CdXR0b240BQ5DaGVja0JveENodWNodQUQQ2hlY2tCb3hLV0lDbW9kZeDFB%2FOXKuors7kNSBQvXV5bn9EPHGNvJgT94fUsjIhu&__VIEWSTATEGENERATOR=3A0BE18D&__EVENTVALIDATION
wEPDwUKLTE2MjY5MTY1NWRkKfm6OIMZfbs+3tpO9GBopfjT6KU=" />
其中__EVENTTARGET和__EVENTARGUMENT字段目前是空的,__VIEWSTATE和__EVENTVALIDATION则是两个很长的字符串,具体作用不知道,但是这不影响我们。 * outfile; static const char* post_params = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=(前面的内容)&__EVENTVALIDATION
rqfPassword.initialvalue = ""; 22: // --> </script> 1: 2:
wEPDwULLTE5MjI3NzkxNzhkZHK9sGpoX3RVtc+0YqzClfMjawUumJw8RY5FnscWa7bX&__VIEWSTATEGENERATOR=75191122&__EVENTVALIDATION