{"id":386354,"date":"2024-06-29T06:39:24","date_gmt":"2024-06-29T06:39:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=386354"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=386354","title":{"rendered":"<span>\u0417\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e REST API<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/-6\/ao\/xx\/-6aoxx5fwqpcmsy6pvc-mcxua-e.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/-6\/ao\/xx\/-6aoxx5fwqpcmsy6pvc-mcxua-e.jpeg\" data-blurred=\"true\"\/><br \/>  <em>\u041a\u0430\u0434\u0440 \u0438\u0437 \u043c\u0443\u043b\u044c\u0442\u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u0421\u043c\u0435\u0448\u0430\u0440\u0438\u043a\u0438: 132 \u0441\u0435\u0440\u0438\u044f (\u041f\u044b\u043b\u0435\u0441\u043e\u0441)\u00bb<\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 ad-hoc \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438\u043b\u0438 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 DS \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c REST API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430, \u043d\u043e \u0440\u0435\u0434\u043a\u0430 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0440\u043e\u0433. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u044f\u043d\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u044b, \u0442\u044f\u043d\u0443\u0442\u044c \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c \u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u043d\u043e\u0433\u043e\u0445\u043e\u0434\u043e\u0432\u043e\u043a, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432. \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0447\u044c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u043b\u0438 \u0436\u0435 \u0442\u0430\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433). \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u00ab\u043f\u043e\u0447\u0435\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u0438 \u00ab\u043a\u0430\u043a \u043c\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u00bb \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0441 \u0437\u0430\u0432\u0438\u0434\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0431\u043b\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0447\u0435\u0440\u0435\u0437 REST API. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/habrahabr.ru\/users\/i_shutov\/posts\/\" rel=\"nofollow noopener noreferrer\">\u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439<\/a>. <a name=\"habracut\"><\/a><\/p>\n<p>  <\/p>\n<h1 id=\"opredelyaemsya-s-trebovaniyami\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u0441\u044f \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438<\/h1>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0443\u044e \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0441\u0431\u043e\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u2014 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u043e\u0431\u0432\u044f\u0437\u043a\u0438.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0431\u043e\u0440\u0430.<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043c\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u043f\u0434\u0435\u0439\u0442\u0430.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0448\u0430\u0433\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0443\u0436\u0434 \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u0430 \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (\u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 dashamail) \u043f\u043e \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0435\u0441\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438. \u0422.\u0435. \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u0435\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438. \u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435. \u0416\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<h2 id=\"inicializaciya\">\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043a\u044d\u0448 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f\u043c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043a\u0443\u043c\u043c\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u044d\u0448 \u0444\u0430\u0439\u043b \u043f\u043e \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430\u043c. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0438 \u043c\u044b \u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u0442\u044c \u043a \u0434\u0435\u043b\u0443.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">library(tidyverse) library(magrittr) library(httr) library(rvest) library(glue) library(jsonlite) library(stringi) library(checkmate) library(tictoc) library(iterators) library(future) library(doFuture) library(doRNG) library(futile.logger) future::plan(sequential)  user_id &lt;- \"\u0442\u0443\u0442 \u043c\u043e\u0433 \u0431\u044b \u0431\u044b\u0442\u044c \u0432\u0430\u0448 \u043b\u043e\u0433\u0438\u043d\" user_pwd &lt;- \"\u0442\u0443\u0442 \u043c\u043e\u0433 \u0431\u044b \u0431\u044b\u0442\u044c \u0432\u0430\u0448 \u043f\u0430\u0440\u043e\u043b\u044c\" base_url &lt;- glue(\"https:\/\/api.dashamail.com\/?username={user_id}&amp;password={user_pwd}\")  common_logname &lt;- \"dashamail.log\" dasha_cache &lt;- here::here(\"precalc\", \"dasha_cache\")  flog.appender(appender.file(common_logname)) flog.threshold(INFO) flog.info(\"Start batch processing\")  tic(\"Full DashaMail processing workflow\")<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"zaprashivaem-spisok-kampaniy\">\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439, \u043e\u0442\u0441\u0435\u044f\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"># \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 cleanCampaign &lt;- function(x){   # \u0442\u044d\u0433 relay_id \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c NULL \u0438 \u043e\u043d \u043d\u0435 \u0434\u0430\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c bind. \u041e\u043d \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0435\u0432\u0430\u0436\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0434\u0430\u043b\u0438\u043c   x$relay_id &lt;- NULL   x$sqleseg &lt;- NULL   x }  # \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0431\u0435\u0440\u0435\u043c \u0430\u0440\u0445\u0438\u0432 \u0443\u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 arch_tbl &lt;- here::here(\"precalc\", \"dashamail_arch.fst\") %>%   fst::read_fst()  # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API ---------- tic(\"Requesting campaigns' info through API\") resp &lt;- GET(glue(\"{base_url}&amp;method=campaigns.get\")) flog.info(capture.output(toc()))  # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u043d\u0430\u0441 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439 camps_tbl &lt;- content(resp)[[\"response\"]][[\"data\"]] %>%   map_dfr(cleanCampaign) %>%   mutate_at(\"emails_sent\", as.numeric) %>%   filter(status == \"SENT\") %>%   filter(emails_sent > 0) %>%   mutate_at(vars(delivery_time), lubridate::ymd_hms, truncated = 3, tz = \"Europe\/Moscow\") %>%   arrange(desc(id))<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"sverka-s-lokalnym-keshem\">\u0421\u0432\u0435\u0440\u043a\u0430 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u044d\u0448\u0435\u043c<\/h2>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u0430, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438 \u0432\u0441\u0435 \u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043a\u044d\u0448. \u0421\u0432\u0435\u0440\u0438\u043c \u0435\u0433\u043e \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a \u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u0432\u0435\u0440\u043a\u0438 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u044d\u0448\u0435\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"># \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0435\u0435\u0441\u0442\u0440 \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 cached_tbl &lt;- fs::dir_ls(path = dasha_cache, glob = \"*.qs\") %>%   tibble(path = ., camp_id = str_match(fs::path_file(path), \"camp_(\\\\d+).*\\\\.qs\")[, 2])<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"podgotovka-zadaniy-dlya-mnogopotochnogo-oprosa-kampaniy\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u0440\u043e\u0441\u0430 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>C\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0423\u0447\u0442\u0435\u043c \u0447\u0442\u043e \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 \u0440\u043e\u0437\u043d\u044c. \u041f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0437\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043c\u044b \u0432\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">iter_tbl &lt;- camps_tbl %>%   # \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438   sample_n(n()) %>%   select(camp_id = id, emails_sent, delivery_time) %>%   # \u0438\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435   anti_join(cached_tbl, by = \"camp_id\") %>%    # \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435   anti_join(mutate(arch_tbl, camp_id = as.character(campaign_id)), by = \"camp_id\") %>%   # \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u043a\u0432\u0430\u0440\u0442\u0430\u043b\u0430   filter(as.Date(delivery_time) > lubridate::dmy(\"29-12-2020\")) %>%   mutate(camp_url = glue(\"{base_url}&amp;method=reports.sent&amp;\",                          \"campaign_id={camp_id}&amp;limit=1000000000&amp;order=email%20asc\")) %>%   mutate(idx = paste0(row_number(), \"\/\", n())) %>%   mutate(pad_idx = numform::f_pad_zero(row_number())) # sample_n(8) flog.info(glue(\"Requesting {nrow(iter_tbl)} campaigns, {nrow(cached_tbl)} are cached\"))<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"sbor-dannyh-po-kampaniyam-v-mnogopotochnom-rezhime\">\u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f\u043c \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 99% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0441\u043b\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u044f\u0434\u0435\u0440 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0422\u0443\u0442 \u0436\u0435 \u0432\u0435\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0439. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u044d\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c. \u041d\u0435 \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 \u0441\u0432\u044f\u0437\u0438, \u0430 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u0447\u0435\u0441\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e <code>%dorng%<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.jottr.org\/2020\/09\/22\/push-for-statical-sound-rng\/\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f\u043c<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">tic(\"Requesting campaigns' full report\") # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 registerDoFuture() future::plan(future.callr::callr, workers = 4) # REST 99% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u043b\u0447\u0438\u0442 rm(resp, ll) gc(full = TRUE)  start_time &lt;- Sys.time() camp_list &lt;-    foreach(it = iter(iter_tbl, by = \"row\"), .verbose = FALSE,           .inorder = FALSE) %dorng%    {     # \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u0447\u0435\u0442\u043e\u0432     flog.appender(appender.file(common_logname))     flog.info(glue(\"INIT: campaign #{it$camp_id}, {it$idx}\"))      tic(glue(\"Report request for campaign #{it$camp_id}, {it$idx} completed\"))     cont &lt;- GET(it$camp_url) %>%       httr::content()     body_tbl &lt;- cont$response$data %>%       data.table::rbindlist() %>%       as_tibble()     flog.info(capture.output(toc()))      elapsed_time &lt;- round(difftime(Sys.time(), start_time, units = \"mins\"), 1)     flog.info(glue(\"Total elapsed time = {elapsed_time} min(s),\",                          \"mem_used = {capture.output(pryr::mem_used())}\"))      # TODO !!! \u041d\u0430\u0434\u043e \u0441\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u0432\u0435\u0442\u0430 \u0441 \u043f\u043e\u043b\u0435\u043c emails_sent \u0438\u0437 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438 !!!     if(checkmate::testDataFrame(body_tbl, min.rows = 1, null.ok = FALSE)) {       # \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445       flog.info(glue(\"#{it$camp_id} data size = {capture.output(pryr::object_size(body_tbl))}\"))       delta_n &lt;- it$emails_sent - nrow(body_tbl)       f_suffix &lt;- ifelse(delta_n == 0, \"\", glue(\"_(lost_{delta_n})\"))       if(delta_n != 0) {         flog.info(glue(\"#{it$camp_id} response object is INCONSISTENT!\",                        \"{nrow(body_tbl)}\/{it$emails_sent} rows (fact\/plan)\", .sep = \" \"))       }       # \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u043e\u0436\u043c\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435       body_tbl %>%         mutate_at(vars(sent_time), lubridate::ymd_hms, truncated = 3, tz = \"Europe\/Moscow\") %>%         mutate(sent_date = as.Date(sent_time)) %>%         mutate_at(vars(id, member_id, campaign_id, list_id), as.numeric) %>%         select(-open_time) %>%         qs::qsave(here::here(dasha_cache, glue(\"camp_{it$camp_id}{f_suffix}.qs\")))      } else flog.info(glue(\"#{it$camp_id} response object is EMPTY\"))     rm(cont, body_tbl)     gc()      NULL   } # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438, \u043e\u043d\u0438 \u0435\u0434\u044f\u0442 \u043f\u0430\u043c\u044f\u0442\u044c future::plan(sequential) gc(reset = TRUE, full = TRUE) gcinfo(FALSE)  flog.info(\"Full request finished\") flog.info(capture.output(toc()))<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"finaliziruem-rezultat\">\u0424\u0438\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u043c\u0435\u0441\u0442\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0444\u0438\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"># \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u044e \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u044f\u043c report_tbl &lt;- cached_tbl$path %>%   purrr::map_dfr(qs::qread) %>%   # \u043f\u043e\u0434\u0442\u044f\u043d\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435   bind_rows(arch_tbl)  tic(\"Saving email activity @ FST\") fst::write_fst(report_tbl, here::here(\"precalc\", \"dashamail.fst\"), compress = 100) flog.info(capture.output(toc()))  # \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u0430 flog.info(capture.output(toc())) <\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h1 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0443\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043d\u0430\u0440\u0443\u0436\u0443 \u2014 \u043d\u043e \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b. \u041f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 json \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f. \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>jqr<\/code>, \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0435\u0435 \u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/post\/448950\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u2014 <a href=\"https:\/\/habr.com\/ru\/post\/592491\/\">\u00abData Science &#8216;\u043f\u043e \u0442\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438\u0437\u0433\u043e\u0440\u043e\u0434\u0438&#8217;\u00bb<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/592651\/\"> https:\/\/habr.com\/ru\/articles\/592651\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/-6\/ao\/xx\/-6aoxx5fwqpcmsy6pvc-mcxua-e.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/-6\/ao\/xx\/-6aoxx5fwqpcmsy6pvc-mcxua-e.jpeg\" data-blurred=\"true\"\/><br \/>  <em>\u041a\u0430\u0434\u0440 \u0438\u0437 \u043c\u0443\u043b\u044c\u0442\u0444\u0438\u043b\u044c\u043c\u0430 \u00ab\u0421\u043c\u0435\u0448\u0430\u0440\u0438\u043a\u0438: 132 \u0441\u0435\u0440\u0438\u044f (\u041f\u044b\u043b\u0435\u0441\u043e\u0441)\u00bb<\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 ad-hoc \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438 \u0438\u043b\u0438 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 DS \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c REST API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430, \u043d\u043e \u0440\u0435\u0434\u043a\u0430 \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u043e\u0440\u043e\u0433. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u044f\u043d\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u044b, \u0442\u044f\u043d\u0443\u0442\u044c \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c \u0438 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u043d\u043e\u0433\u043e\u0445\u043e\u0434\u043e\u0432\u043e\u043a, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432. \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043b\u0435\u0447\u044c \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438\u043b\u0438 \u0436\u0435 \u0442\u0430\u043c \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (\u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433). \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u00ab\u043f\u043e\u0447\u0435\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u0438 \u00ab\u043a\u0430\u043a \u043c\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e\u00bb \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u0441 \u0437\u0430\u0432\u0438\u0434\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0431\u043b\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u0438\u043f\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0447\u0435\u0440\u0435\u0437 REST API. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/habrahabr.ru\/users\/i_shutov\/posts\/\" rel=\"nofollow noopener noreferrer\">\u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439<\/a>. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-386354","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/386354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=386354"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/386354\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=386354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=386354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=386354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}