парсер ГосУслуг
Задача: выкачать файлы уведомлений от ФССП приходящие для организации.
Почему нет штатного API для получения уведомлений на Госуслугах, вопрос интересный. В результате каждая организация которая в большом объеме работает со службой судебных приставов изобретает свой инструмент для автоматизации получения уведомлений. И я сей чаши не избежал 😉
Решение: напишем парсер на node.js с использование Selenium 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
// Начальные установки.. // количество выгружаемых уведомлений cnt_uv=100; // логин для входа в госуслуги login="+094802к934к" // пароль для входа pass="уамцумцук "; // путь для сохранения файлов save_path="c:\\tmp"; // полное название организации full_name="ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ «РОГА И КОПЫТА»"; var webdriver = require('selenium-webdriver'); const {Builder, By, Key, until} = require('selenium-webdriver'); (async function example() { var chrome = require("selenium-webdriver/chrome"); var chromeOptions = new chrome.Options(); chromeOptions.addArguments("test-type"); // chromeOptions.addArguments("start-maximized"); // chromeOptions.addArguments("--js-flags=--expose-gc"); // chromeOptions.addArguments("--enable-precise-memory-info"); // chromeOptions.addArguments("--disable-popup-blocking"); // chromeOptions.addArguments("--disable-default-apps"); // chromeOptions.addArguments("--disable-infobars"); //chromeOptions.addArguments("--user-data-dir=C:\\tmp"); chromeOptions.addArguments("safebrowsing-disable-download-protection"); let driver = await new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build(); driver.setDownloadPath(save_path); try { console.log("-загружаем страницу авторизации"); await driver.get('https://lk.gosuslugi.ru'); console.log("--ok"); console.log("-ждем отрисовки"); elm= await driver.wait(until.elementLocated(By.xpath(".//button[@id='loginByPwdButton']"), 30000)); console.log("--ok"); console.log("-вставляем логин пароль и кликаем Enter"); await driver.findElement(By.id('login')).sendKeys(login,Key.TAB,pass,Key.RETURN); console.log("--ok"); console.log("--ok"); console.log("-ищем full_name и кликаем по ней"); elm= await driver.wait(until.elementLocated(By.xpath(".//div[@title='"+full_name+"']"), 30000)); await driver.executeScript("arguments[0].click();", elm); console.log("--ok"); console.log("-ждем пока не будет перехода на нужную страницу"); ccurl=""; while (ccurl!=="https://lk.gosuslugi.ru/info"){ await driver.getCurrentUrl().then( url => {console.log('current url: "' + url + '"');ccurl=url;} ); await driver.sleep(100); }; //elm= await driver.wait(until.elementLocated(By.xpath(".//a[@data-ng-href='https://esia.gosuslugi.ru/profile/org/org.xhtml?orgOid=1087125902']"), 30000)); //await driver.sleep(2000) console.log("--ok"); console.log("-идём на страницу уведомлений"); for (var i = 1; i < cnt_uv; i++) { await driver.get("https://lk.gosuslugi.ru/notifications") //console.log("--ok"); //console.log("-загружаю "+cnt_uv+" сообщений"); await GetNotifications(driver,cnt_uv); //console.log("--ok"); //console.log("-кликаю по первому уведомлению и сохраняю файлы"); await UvedOpen(i); console.log("--ok сохранен файл " +i+" из "+cnt_uv); }; async function UvedOpen(n){ fl=await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']")) await driver.executeScript("arguments[0].scrollIntoView()", fl[n]); await driver.executeScript("arguments[0].click();", fl[n]); elm= await driver.wait(until.elementLocated(By.linkText('Сохранить'), 30000)); //await driver.executeScript("arguments[0].click();", elm); elm=await driver.findElements(By.linkText('Сохранить')); elm[0].click(); elm[1].click(); await driver.sleep(1000); } async function GetNotifications(driver,cnt){ for (var i = 0; i < cnt/10; i++) { pp=((i+1)*10); //console.log("----ждем появления кнопки 'Показать еще ("+pp+")'"); elm= await driver.wait(until.elementLocated(By.linkText('Показать еще'), 30000)); //console.log("----ok"); //console.log("-нажимаю кнопку 'Показать еще'"); await driver.executeScript("arguments[0].scrollIntoView()", elm); await driver.executeScript("arguments[0].click();", elm); //console.log("--ok"); }; //console.log("-ждем полной прогрузки страницы"); fl= await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']")) while (fl.length<cnt_uv){ fl= await driver.findElements(By.xpath(".//a[@data-ng-click='openDetails(notification)' and @class='grid-wrap__col-lg-1 grid-wrap__col-md-1 grid-wrap__col-sm-1 grid-wrap__col-md-land-1 pad-top-24 pad-bottom-24']")) await driver.sleep(100); // console.log("---ждем.."); }; }; } finally { console.log("-вот и всё ребята.."); await driver.quit(); } })(); |