Этот веб-сайт asp представляет собой систему запроса счетов за электроэнергию в моей школе, для которой требуется внутренняя сеть школы, поэтому в этой статье рассказывается об идеях и некоторых ямах, с которыми я столкнулся. Я завел этот сайт в основном для удобства проверки счетов за электроэнергию, но на самом деле он не очень удобен. И этот сайт asp не очень легко сканировать, потому что в нем есть два переменных параметра, которые будут меняться в зависимости от страницы. Хорошо, давайте сначала посмотрим на страницу
Этот веб-сайт должен войти в ваше общежитие, прежде чем вы сможете войти, и есть очень плохой проверочный код, но когда я понял, что проверочный код был написан, я обнаружил, что этот проверочный код можно ввести небрежно, что немного кажется мусор.
У этого лендинга много ям, поговорим об этом ниже
1.
Вышеуказанная правая сторона относится к двум динамически меняющимся параметрам. Как они взялись? Он основан на предыдущей странице, и каждая страница будет иметь эти два параметра, поэтому нам нужно сопоставить эти два значения каждый раз, когда мы посещаем, а затем динамически меняем их. Если мы не изменимся, мы не получим данные. Следующая ошибка также произойдет.
'236|error|500|回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。|'
Это означает, что вы не заменили два параметра, упомянутых выше.
Примечание: при первом посещении этого веб-сайта у вас не будет данных об этаже и номере общежития, вам необходимо сопоставить два вышеуказанных переменных параметра, а затем опубликовать, чтобы получить данные.
2.
Данные формы изменятся после того, как вы выберете номер этажа общежития.
Видно, что порядок параметров формы отличается от приведенного выше, поэтому после выбора этажа общежития нам нужно изменить порядок порядка изменения и затем разместить параметры, иначе все равно появится вышеприведенная яма, т.е. то есть параметр обратного вызова недействителен.
Параметр, на который указывает первая стрелка, также необходимо изменить, но второй параметр — txtname2, который является значением общежития по умолчанию для каждого этажа. к собственному времени доступа.Да или будет ошибка,или такая же ошибка,то есть следующая ошибка,возможно у сайта asp очень придирчивые требования к этим параметрам.
236|error|500|回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。|
3.
Эта кнопка запроса счета за электроэнергию не является ajax, будет новый запрос, и это другой метод запроса для того же URL-адреса. Первый запрос — это запрос на получение, который используется для получения двух динамических параметров веб-страницы asp. , а второй раз в Динамические параметры можно отправить по почте, поэтому данные будут.Если вы публикуете в первый раз, данных не будет, и веб-страница все равно сообщит об ошибке, которая все та же ошибка. Ниже приведены данные формы
self.data = {
'__EVENTTARGET': 'RegionPanel2$Region1$Toolbar1$ContentPanel1$btnSelect',
'__EVENTARGUMENT': '',
'__VIEWSTATE': self.data['__VIEWSTATE'],
'__EVENTVALIDATION': self.data['__EVENTVALIDATION'],
'hidJZ': 'jz'+name,
'RegionPanel2$Region1$Toolbar1$ContentPanel1$TextBox1': (datetime.now()-timedelta(days=30)).strftime('%Y-%m-%d'),
'RegionPanel2$Region1$Toolbar1$ContentPanel1$TextBox2': datetime.now().strftime('%Y-%m-%d'),
'RegionPanel2$Region1$Toolbar1$ContentPanel1$txtDBBH': '',
'RegionPanel2$Region1$Toolbar1$ContentPanel1$ddlCZFS': '----全部----',
'RegionPanel2$Region1$toolbarButtom$pagesize': '1',
'__box_page_state_changed': 'false',
'__2_collapsed': 'false',
'__6_selectedRows': '',
'__box_disabled_control_before_postbac': '__10',
'__box_ajax_mark': 'true'
}
Готово, поговорим о роли кодовой строки
def __get_value(self, html): # 获取表单的两个参数__VIEWSTATE和__EVENTVALIDATION
try:
soup = BeautifulSoup(html, 'lxml')
value = soup.select('input[type="hidden"]')
values = [v for v in value if '/w' in str(v)]
state = values[0]['value']
action = values[1]['value']
self.data['__VIEWSTATE'] = state
self.data['__EVENTVALIDATION'] = action
except IndexError as e: # 证明这个不是首页,需要另外的规则
match = re.search('__VIEWSTATE\|(.*?)\|.*?__EVENTVALIDATION\|(.*?)\|', html)
self.data['__VIEWSTATE'] = match.group(1)
self.data['__EVENTVALIDATION'] = match.group(2)
except Exception as e:
print('get_value', e)
Это способ получить два динамических параметра, каждый раз на основе элемента html.
def __get_name(self, jz, html=None): # 输入宿舍号
if html:
# 表单顺序需要改变
self.data = {
'ScriptManager1': 'UpdatePanel1|txtjz2',
'hidtime': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'Radio1': '1',
'txtjz2': jz,
'txtname2': '001001001001001', # 这个初始化值可以随意,但不能为空
'txtpwd2': '',
'txtyzm2': '',
'__EVENTTARGET': 'txtjz2',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATE': '',
'__EVENTVALIDATION': '',
'__ASYNCPOST': 'true'
}
self.__get_value(html) # 换下参数
html = self.__get_html()
if html:
soup = BeautifulSoup(html, 'lxml')
dormitory_num = soup.select('select[name="txtname2"] option')
dormitory_num = [(p.text, p['value']) for p in dormitory_num]
for index, p in enumerate(dormitory_num):
print(index, '宿舍号:', p[0])
self.__get_value(html)
while True:
num = input('请输入你的宿舍,输入左边的编号即可')
num = re.match('\d+', num)
if num and int(num.group()) < len(dormitory_num):
num = int(num.group())
break
print('请输入正确的宿舍编号')
return dormitory_num[num][1]
Это чтобы получить номер общежития, нужно изменить порядок бланков
def __get_chapter(self):
# 获取验证码
url = 'http://172.18.2.42:8000/ValidateCode.aspx'
response = requests.get(url, headers=self.headers)
with open('code.jpg', 'wb') as f:
f.write(response.content)
image = Image.open('code.jpg')
image.show()
code = input('请输入验证码')
return code
Это метод получения кода подтверждения.Получить код подтверждения очень просто, просто найдите запрошенный URL-адрес и отправьте запрос. Что касается идентификации, я ввожу ее здесь вручную, Вы также можете выбрать доступ к платформе кодирования или использовать модель глубокого обучения для идентификации.
Больше нечего сказать.
Если вам нужен исходный код, вы можете найти его на моем GitHub: https://github.com/SergioJune/gongzhonghao_code/blob/master/python_play/query.py.
напиши в конце
Если эта статья будет вам полезна, надеюсь, вы не поскупитесь на похвалу! Лайки и ретвиты — самая большая поддержка для меня, так что у меня есть возможность выпускать качественные оригинальные статьи.
"Как отношение!"
рекомендуемая статья:
Я собрал 37 000 комментариев фанатов и получил важную информацию об игре.Просканируйте книгу «Автостопом по Python!» и создайте PDF-файл.
Изучайте Python каждый день
Код — это не только баги, но и красота и веселье