Что нужно изучить, чтобы автоматизировать получение выписки из банка?
Ну я конечно не собираюсь закликать сайт до смерти, мне это не нужно. А есть нудная вещь которую хотелось бы немного автоматизировать немного. А именно - процесс получения выписки из банка. Как это у нас выглядит:
1) захожу на страницу сайта для корпоративных клиентов
2) ввожу логин пароль, нажимаю "ок"
3) появляется главная страница где выбираю слева вкладку "Выписки из банка"
4) появляются заполняемые поля с выбором счета и периода для получения выписки, проставляю нужные значения
5) нажимаю заказать выписку, банк немного думает и выдает страничку с движениями средств
6) сверху есть три иконки - скачать в формате 1с 01 02 03, нажимаю формат 1.03 и скачивается текстовый файл
Если я правильно понимаю, моя задача состоит из нескольких частей -
- сперва нужно научиться подключиться по https к сайту банка
- понять как происходит авторизация на сайте, ввод логина пароля и отправка на сайт, получение ответа
- у страницы заказа выписок есть свой адрес, надо ее скачать в буфер (наверное)
- нужно понять как программно выставить значения в списке выбора счета и периода для выписки
- и конечно ж нужно понять как происходит процесс нажатия кнопки "получить выписку" для выбранного счета и периода
- когда нажимаю кнопку получить появляется полоса ожидания и сайт выдает ответ. Надо как-то разобраться с этим, что за процесс при этом происходит и загрузить ответ в буфер
- нужно нажать иконку для скачивания выписки в выбранном формате
В общем, все сложно. Наверное, буду рад, если сумею пройти хотя бы процесс авторизации на странице банка и получу какой-то ответ в буфер. И это реально сделать на с++ или лучше сразу питон? В последнем я полный чайник.
Sand, смотря у кого, но вероятнее всего есть lutokris первое гуглишь по банку если публичное апи, если есть все хорошо смотришь в него и делаешь
если нет, то смотришь в консоль и пытаешься повторить запросы, если тебе повезет и там будет обычный джисон, то все хорошо, делов не много, пару ручек дернуть
если там модный протобаф, то забиваешь на апи и делаешь все через условный селениум
Влад Григорьев, спасибо, публичного апи у своего банка не нашел. Единственное что я пока смог понять - стоит система isimple bank, авторизация происходит через spring security. Попытался через F12 в браузере кое-что понять. Когда заполняю логин пароль и нажимаю войти происходит отправка Request Headers:
POST /j_spring_security_check HTTP/1.1
Host: dbo.albank.ru
Connection: keep-alive
Content-Length: 32
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: https://dbo.albank.ru
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.152 YaBrowser/21.2.3.100 Yowser/2.5 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://dbo.albank.ru/rich/auth
Accept-Encoding: gzip, deflate, br
Accept-Language: ru,en;q=0.9
Cookie: session-cookie=166d216c9491c792552781d580267f93b027587923ad258bf10c8c7e1eafe7037dad14941bd2d4407d4a2e74c488d92a; localize=ru; KFP_DID=38fe93b4-30fc-b4e7-30cb-c61996e55805; KFP_SESSION_ID=8a9eef53-ee34-4736-9d29-46d109b3f33e_1; JSESSIONID=CA153502E8E0147FCC261ADCAC802433; oxxfgh=8a9eef53-ee34-4736-9d29-46d109b3f33e#3#1800000#5000 Form Data:
j_username=drew&j_password=12345
так как я отправлял для проверки заведомо неправильные данные то я конечно получил в ответ: Responce Headers:
HTTP/1.1 302
Content-Length: 0
Connection: keep-alive
Set-Cookie: JSESSIONID=52FB8D286F2D7539CE43E8978E82C56C; Path=/; HttpOnly
Location: /rich/auth?login_error=1
Date: Wed, 17 Mar 2021 13:46:18 GMT
Я не до конца понял используются ли тут токены или нет, а пока пытаюсь так:
import requests
data = 'j_username=drew&j_password=12345' #вроде такую конструкцию логин пароль туда он отправляет
Url = 'https://dbo.albank.ru/rich/auth' #ссылка на сайт
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'} #пускай думают что я эппл
r = requests.post(Url, headers = headers, json = data) #отправка запроса на сайт
print(r.status_code)
lutokris, json ожидает объект, а не строку.
и использовать надо сессию, вам надо таскать за собой всякие куки которые проставляются.
ну и дальше смотреть, что еще происходит, если есть подтверждение смс, то тут все тяжко
import requests
data = {'j_username': 'login', 'j_password': '123'}
with requests.Session() as session:
session.post(url, json=data)
session = requests.session()
url = "https://dbo.albank.ru/rich/auth"
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'} #иначе ошибка 403
session.get(url, headers=headers)
data = {'j_username': 'aimdich', 'j_password': '123456'}
with requests.Session() as session: session.post(url, json=data)
если я делаю так, то получаю ошибку 403, а не 302 как должно быть в случае ошибочного пароля. Как я правильно понимаю это как-то связано с куками, хотя вроде когда происходит session.get куки должны записаться в сессии и когда происходит session.post они должны сами передаться сайту. В общем, завтра покопаюсь в теме. А так прошел по ссылке на альфабанк, сперва подумал что у меня с браузером что то нето, потом понял что особо не заморачивались с подразделом для API)
lutokris, в нормальных кейсах при ошибки пароля должен быть 401
ну и with requests.Session() as session: тут создается новый объект, его не надо постоянно создавать
Если у банка нету своего API, то описанные выше действия напоминают Selenium, где уже сам браузер будет всё сам кликать, но время это всё равно занимает.
Ну а если через requests. То от логинизации мы обычно получаем какой-то важный токен, который генерируется на определенное время. И после используется для отправки следующих пост запросов на получение информации. А получив нужную инфу, берём сгенерированную ссылку, по которой находится файл для скачивания