{"id":500359,"date":"2026-10-26T17:04:21","date_gmt":"2026-10-26T14:04:21","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500359"},"modified":"2026-10-26T17:04:21","modified_gmt":"2026-10-26T14:04:21","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500359","title":{"rendered":"\u0421\u044a\u0451\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u0447\u0435\u0440\u0435\u0437 Search API \u0438 WP-CLI: \u043e\u043a\u043e\u043b\u043e 3 \u20bd \u0437\u0430 \u0441\u043e\u0442\u043d\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0423 \u043d\u0430\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0430\u0439\u0442 \u043d\u0430 WordPress \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043d\u0438\u0448\u0435, SEO \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u041f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043d\u0438\u043c\u0430\u043b \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u043c \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0435, \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0444\u0440\u0430\u0437\u0435. \u0412 \u043e\u043a\u0442\u044f\u0431\u0440\u0435 \u043f\u0435\u0440\u0435\u0432\u0451\u043b \u0438 \u0442\u043e \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430 Search API \u042f\u043d\u0434\u0435\u043a\u0441 \u041e\u0431\u043b\u0430\u043a\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0433\u043e\u0440\u0441\u0442\u043a\u0430 PHP-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>wp eval-file<\/code> \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u0441\u0430\u0439\u0442.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0445\u0435\u043c\u0430, \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0433\u0440\u0430\u0431\u043b\u0438. \u041a\u043e\u0434 \u043e\u0431\u0435\u0437\u043b\u0438\u0447\u0435\u043d: \u043d\u0438 \u043a\u043b\u044e\u0447\u0435\u0439, \u043d\u0438 \u043f\u0443\u0442\u0435\u0439, \u043d\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043e\u0431\u043b\u0430\u043a\u0430. \u041f\u043e\u043b\u044f API \u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c WP-CLI<\/h3>\n<p>\u0421\u0430\u0439\u0442 \u0438 \u0442\u0430\u043a \u043d\u0430 WordPress. <code>wp eval-file script.php \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 PHP-\u0444\u0430\u0439\u043b \u0441 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c, \u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e:<\/p>\n<ul>\n<li>\n<p><code>get_option()<\/code> \u0438 <code>update_option()<\/code> \u0445\u0440\u0430\u043d\u044f\u0442 \u043a\u043b\u044e\u0447, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p><code>wp_remote_request()<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a HTTP-\u043a\u043b\u0438\u0435\u043d\u0442, \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u0438 <code>WP_Error<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0435\u0441\u0442\u044c <code>WP_CLI::error()<\/code> \u0438 <code>WP_CLI::success()<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 <code>$args<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0438 \u0434\u0435\u043f\u043b\u043e\u044f. \u0418 \u043a\u043b\u044e\u0447 \u043d\u0435 \u0432\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435.<\/p>\n<h3>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442<\/h3>\n<p>\u0426\u0435\u043d\u044b \u043d\u0430 \u043e\u043a\u0442\u044f\u0431\u0440\u044c 2026, \u0437\u0430 1 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442 (\u0442\u043e\u043f \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430) \u2014 20 \u20bd, \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c \u2014 50 \u20bd. \u041f\u043e\u0438\u0441\u043a \u0432 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435: 30,5 \u20bd \u0434\u043d\u0451\u043c, 25,41 \u20bd \u043d\u043e\u0447\u044c\u044e. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u2014 488 \u20bd.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/a6\/21\/f1\/a621f12a46b7e212bf4790e64756f26a.png\" width=\"2400\" height=\"991\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/a6\/21\/f1\/a621f12a46b7e212bf4790e64756f26a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/a6\/21\/f1\/a621f12a46b7e212bf4790e64756f26a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0426\u0435\u043d\u044b Search API \u043d\u0430 \u043e\u043a\u0442\u044f\u0431\u0440\u044c 2026, \u0437\u0430 1 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443. \u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0435, \u043e\u0442\u0434\u0430\u0451\u0442 id \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043f\u043e\u0442\u043e\u043c. \u041f\u043e\u0437\u0438\u0446\u0438\u044f\u043c \u0441\u043f\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u043a\u0443\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439, \u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b: \u0441\u043e\u0442\u043d\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 2 \u20bd, \u0441\u043e\u0442\u043d\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u2014 \u0432 3 \u20bd. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d (61 \u043c\u0430\u0440\u043a\u0435\u0440 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430, \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e 106 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c, \u0442\u043e\u043f-10 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u043f\u043e 25 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e 10 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u043c) \u0441\u0442\u043e\u0438\u043b \u043e\u043a\u043e\u043b\u043e 6 \u20bd. \u042f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430\u0445.<\/p>\n<h3>\u0414\u043e\u0441\u0442\u0443\u043f \u0438 \u043a\u043b\u044e\u0447<\/h3>\n<p>\u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043e\u0431\u043b\u0430\u043a\u0430 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0441 \u0440\u043e\u043b\u044c\u044e <code>search-api.webSearch.user<\/code>, \u0435\u0451 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442, \u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a. \u0410\u043a\u043a\u0430\u0443\u043d\u0442\u0443 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c API-\u043a\u043b\u044e\u0447.<\/p>\n<p>\u041a\u043b\u044e\u0447 \u0436\u0438\u0432\u0451\u0442 \u0432 \u043e\u043f\u0446\u0438\u0438 WordPress. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u0441\u0432\u0435\u0442\u0438\u043b\u0441\u044f \u043d\u0438 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 shell, \u043d\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0438 \u0442\u0443\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u0435\u043b\u043e\u0447\u044c: \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c, WP-CLI \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 STDIN.<\/p>\n<pre><code class=\"bash\">tr -d '\\r\\n ' &lt; key.txt | wp option update yc_api_key --autoload=no<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p><code>--autoload=no<\/code> \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u044e\u0447 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0430\u0439\u0442\u0443.<\/p>\n<p>\u041c\u0438\u043d\u0443\u0441 \u0443 \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c: \u043e\u043f\u0446\u0438\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 <code>wp-config.php<\/code> \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435, \u0437\u0430\u0442\u043e \u043e\u043f\u0446\u0438\u044e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c. \u0423 \u043d\u0430\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u044f \u0431\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u0435\u0449\u0451 \u0440\u0430\u0437.<\/p>\n<h3>\u041a\u0430\u043a \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e<\/h3>\n<pre><code class=\"plaintext\">yc_lib.php      \u043a\u043b\u044e\u0447, id \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430, HTTP \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438, \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430   \u2502   \u251c\u2500\u2500 ws.php       \u0444\u0440\u0430\u0437\u0430 \u2192 \u0442\u043e\u043f \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430 + \u00ab\u043f\u043e\u0445\u043e\u0436\u0438\u0435\u00bb (\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441)   \u251c\u2500\u2500 wsdyn.php    \u0444\u0440\u0430\u0437\u0430 \u2192 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c \/ \u043d\u0435\u0434\u0435\u043b\u044f\u043c \/ \u0434\u043d\u044f\u043c   \u251c\u2500\u2500 wsbatch.php  seeds.txt \u2192 out.tsv (\u043c\u0430\u0440\u043a\u0435\u0440, top|assoc, \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0444\u0440\u0430\u0437\u0430)   \u2502   \u2514\u2500\u2500 serpq.php    \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a         submit keys.txt [lr] [\u0441\u0442\u0440\u043e\u043a\u0430]  \u2192 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439         status                         \u2192 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u043e         collect [\u0434\u043e\u043c\u0435\u043d]                \u2192 pos_\u0413\u0413\u0413\u0413\u041c\u041c\u0414\u0414.tsv, serp_top_\u0413\u0413\u0413\u0413\u041c\u041c\u0414\u0414.tsv<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/extt\/4e\/6f\/a8\/4e6fa831bbb842c9828825c23890da38.png\" width=\"2400\" height=\"939\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/extt\/4e\/6f\/a8\/4e6fa831bbb842c9828825c23890da38.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/extt\/4e\/6f\/a8\/4e6fa831bbb842c9828825c23890da38.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u044a\u0451\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u044b\u0445\u043e\u0434 \u0432\u0435\u0437\u0434\u0435 \u0432 TSV. \u0415\u0433\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043b\u044e\u0431\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0438 \u0441 \u043d\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 <code>cut<\/code>, <code>sort<\/code> \u0438 <code>awk<\/code>.<\/p>\n<p>\u0420\u0435\u0433\u0438\u043e\u043d\u044b \u0432 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0434\u0430\u043c\u0438: 10174 \u2014 \u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433 \u0441 \u041b\u0435\u043d\u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e (\u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439), 2 \u2014 \u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433, 1 \u2014 \u041c\u043e\u0441\u043a\u0432\u0430 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c, 225 \u2014 \u0432\u0441\u044f \u0420\u043e\u0441\u0441\u0438\u044f. \u0414\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0438\u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a <code>lr=2<\/code>.<\/p>\n<h3>\u041e\u0431\u0449\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/h3>\n<p>\u0421\u044e\u0434\u0430 \u0443\u0448\u043b\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u043e\u0441\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435: \u043a\u043b\u044e\u0447, HTTP, \u043f\u043e\u0432\u0442\u043e\u0440\u044b \u0438 \u0443\u0447\u0451\u0442.<\/p>\n<pre><code class=\"php\">&lt;?php\/\/ yc_lib.php \u2014 \u043e\u0431\u0449\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u0441\u0435\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 `wp eval-file`, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 WordPress \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d.const YC_SEARCH = 'https:\/\/searchapi.api.cloud.yandex.net\/v2';const YC_OPS    = 'https:\/\/operation.api.cloud.yandex.net\/operations\/';function yc_key(): string {    $k = (string) get_option('yc_api_key', '');    if ($k === '') {        WP_CLI::error('\u041d\u0435\u0442 \u043a\u043b\u044e\u0447\u0430 \u0432 \u043e\u043f\u0446\u0438\u0438 yc_api_key');    }    return $k;}function yc_folder(): string {    return (string) get_option('yc_folder_id', '');}\/\/ \u0423\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u0448\u043b\u043e \u0437\u0430 \u0434\u0435\u043d\u044c.function yc_count(string $kind, int $n = 1): void {    $u = get_option('yc_usage', []);    $d = gmdate('Y-m-d');    $u[$d][$kind] = ($u[$d][$kind] ?? 0) + $n;    update_option('yc_usage', $u, false);}\/\/ HTTP \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438: 429 \u0438 5xx \u2014 \u043f\u0430\u0443\u0437\u0430 \u0438 \u0435\u0449\u0451 \u043f\u043e\u043f\u044b\u0442\u043a\u0430, 401\/403 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043f.function yc_http(string $method, string $url, ?array $body = null, int $tries = 5): ?array {    $args = [        'method'  =&gt; $method,        'timeout' =&gt; 60,        'headers' =&gt; [            'Authorization' =&gt; 'Api-Key ' . yc_key(),            'Content-Type'  =&gt; 'application\/json',        ],    ];    if ($body !== null) {        $args['body'] = wp_json_encode($body);    }    for ($i = 1; $i &lt;= $tries; $i++) {        $r = wp_remote_request($url, $args);        if (is_wp_error($r)) {              \/\/ \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u043e\u0431\u0440\u044b\u0432 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f            sleep(2 * $i);            continue;        }        $code = wp_remote_retrieve_response_code($r);        if ($code === 200) {            return json_decode(wp_remote_retrieve_body($r), true);        }        if ($code === 401 || $code === 403) {            WP_CLI::error(\"HTTP $code: \u043a\u043b\u044e\u0447 \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u0438\u043b\u0438 \u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u043d\u0435\u0442 \u0440\u043e\u043b\u0438\");        }        if ($code === 429 || $code &gt;= 500) { \/\/ \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437, 504 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435            sleep(2 * $i);            continue;        }        WP_CLI::warning(\"HTTP $code: \" . wp_remote_retrieve_body($r));        return null;    }    return null;                            \/\/ \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0430\u0440\u0430 \u043c\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c.<\/p>\n<p>\u041d\u0430 401 \u0438 403 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443. \u042d\u0442\u043e \u0438\u043b\u0438 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u0438\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0431\u0435\u0437 \u0440\u043e\u043b\u0438, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440 \u0442\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0441\u0442. \u0412 \u043e\u0431\u043b\u0430\u043a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0441\u0430\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442.<\/p>\n<p>\u041d\u0430 429 \u0438 5xx \u043e\u043d \u0436\u0434\u0451\u0442 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437. 429 API \u043e\u0442\u0434\u0430\u0432\u0430\u043b \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0435, \u0430 \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 504.<\/p>\n<p>\u0423\u0447\u0451\u0442 \u043f\u043e \u0434\u043d\u044f\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u043f\u0446\u0438\u0438: <code>wp option get yc_usage --format=json<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443\u0448\u043b\u043e. \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0442\u043e\u044f\u0442 \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u043d\u043e \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0446\u0438\u043a\u043b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0442\u0443\u0434\u0430 \u043f\u043e\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044e.<\/p>\n<h3>\u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442 \u043f\u0430\u0447\u043a\u043e\u0439<\/h3>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0444\u0430\u0439\u043b \u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u043c\u0438, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 TSV. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0435\u0433\u043e \u044f \u0445\u043e\u0442\u0435\u043b: \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0431\u043e\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0430 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0441 \u043d\u0443\u043b\u044f.<\/p>\n<pre><code class=\"php\">&lt;?php\/\/ wp eval-file wsbatch.php seeds.txt out.tsv [\u0440\u0435\u0433\u0438\u043e\u043d=10174] [\u0444\u0440\u0430\u0437=2000]require __DIR__ . '\/yc_lib.php';[$seeds, $out] = [$args[0], $args[1]];$region = $args[2] ?? '10174';$limit  = $args[3] ?? '2000';\/\/ \u041c\u0430\u0440\u043a\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 out.tsv, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c: \u0442\u0430\u043a \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\/\/ \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 429, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u0435\u0441\u0441\u0438\u0438.$done = [];if (is_file($out)) {    foreach (file($out, FILE_IGNORE_NEW_LINES) as $line) {        $p = explode(\"\\t\", $line);        if (($p[1] ?? '') !== 'err') {      \/\/ \u0443\u043f\u0430\u0432\u0448\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430            $done[$p[0]] = true;        }    }}$fh = fopen($out, 'a');foreach (file($seeds, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $seed) {    $seed = trim($seed);    if (isset($done[$seed])) {        continue;    }    $res = yc_http('POST', YC_SEARCH . '\/wordstat\/topRequests', [        'phrase'     =&gt; $seed,        'numPhrases' =&gt; $limit,        'regions'    =&gt; [$region],        'folderId'   =&gt; yc_folder(),    ]);    yc_count('wordstat');    if ($res === null) {        fwrite($fh, \"$seed\\terr\\t0\\t\\n\");   \/\/ \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e        continue;    }    foreach (['results' =&gt; 'top', 'associations' =&gt; 'assoc'] as $key =&gt; $type) {        foreach ($res[$key] ?? [] as $row) {            fwrite($fh, implode(\"\\t\", [$seed, $type, $row['count'], $row['phrase']]) . \"\\n\");        }    }    fflush($fh);                            \/\/ \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443}fclose($fh);WP_CLI::success('\u0413\u043e\u0442\u043e\u0432\u043e');<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0435\u0449\u0430\u0445: <code>fflush()<\/code> \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435. \u041c\u0430\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0440\u043e\u0448\u0451\u043b \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0439 <code>err<\/code>, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u043d\u043e\u0432\u0430.<\/p>\n<p>\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u043e\u0442\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0438\u043d\u0430\u0447\u0435 \u043e\u0431\u0440\u044b\u0432 SSH \u0435\u0433\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442:<\/p>\n<pre><code class=\"bash\">nohup setsid wp eval-file wsbatch.php seeds.txt out.tsv 10174 2000 \\  &lt; \/dev\/null &gt; wsbatch.log 2&gt;&amp;1 &amp;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0451\u043c\u0430: \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u044f\u0434\u0440\u043e \u0443 \u043d\u0430\u0441 \u2014 2 154 \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0414\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u043e\u0437\u0438\u0446\u0438\u0438: submit, status, collect<\/h3>\n<p>\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. <code>submit<\/code> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 id \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, <code>status<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u043e, <code>collect<\/code> \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 XML \u0438 \u043f\u0438\u0448\u0435\u0442 TSV.<\/p>\n<pre><code class=\"php\">&lt;?php\/\/ wp eval-file serpq.php submit keys.txt [lr=2] [\u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438=1]\/\/ wp eval-file serpq.php status\/\/ wp eval-file serpq.php collect [\u0434\u043e\u043c\u0435\u043d]require __DIR__ . '\/yc_lib.php';const QUEUE = __DIR__ . '\/serp_queue.json';function q_load(): array { return is_file(QUEUE) ? json_decode(file_get_contents(QUEUE), true) : []; }function q_save(array $q): void { file_put_contents(QUEUE, json_encode($q, JSON_UNESCAPED_UNICODE)); }$cmd = $args[0] ?? 'status';if ($cmd === 'submit') {    $keys  = file($args[1], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);    $lr    = $args[2] ?? '2';    $start = max(1, (int) ($args[3] ?? 1));    $queue = q_load();    for ($i = $start - 1; $i &lt; count($keys); $i++) {        $res = yc_http('POST', YC_SEARCH . '\/web\/searchAsync', [            'query'          =&gt; ['searchType' =&gt; 'SEARCH_TYPE_RU', 'queryText' =&gt; $keys[$i]],            'groupSpec'      =&gt; ['groupMode' =&gt; 'GROUP_MODE_DEEP', 'groupsOnPage' =&gt; '100', 'docsInGroup' =&gt; '1'],            'region'         =&gt; $lr,            'folderId'       =&gt; yc_folder(),            'responseFormat' =&gt; 'FORMAT_XML',        ]);        if ($res === null || empty($res['id'])) {            WP_CLI::error('\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 ' . ($i + 1) . '. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c: submit ' . $args[1] . \" $lr \" . ($i + 1));        }        yc_count('serp_async');        $queue[] = ['q' =&gt; $keys[$i], 'lr' =&gt; $lr, 'op' =&gt; $res['id'], 'done' =&gt; false];        q_save($queue);                     \/\/ \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430        usleep(250000);                     \/\/ 4 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043f\u0440\u0438 \u043a\u0432\u043e\u0442\u0435 10    }    WP_CLI::success(count($queue) . ' \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438');}if ($cmd === 'status') {    $q = q_load();    $ready = count(array_filter($q, fn($x) =&gt; $x['done']));    WP_CLI::line(\"\u0412\u0441\u0435\u0433\u043e: \" . count($q) . \", \u0441\u043e\u0431\u0440\u0430\u043d\u043e: $ready\");}if ($cmd === 'collect') {    $domain = $args[1] ?? 'example.ru';    $date   = gmdate('Ymd');    $pos    = fopen(__DIR__ . \"\/pos_$date.tsv\", 'a');    $top    = fopen(__DIR__ . \"\/serp_top_$date.tsv\", 'a');    $queue  = q_load();    foreach ($queue as &amp;$item) {        if ($item['done']) {            continue;        }        $op = yc_http('GET', YC_OPS . $item['op']);        if (empty($op['done'])) {            continue;                       \/\/ \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e, \u0437\u0430\u0431\u0435\u0440\u0451\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437        }        $xml  = simplexml_load_string(base64_decode($op['response']['rawData']));        $urls = [];        foreach ($xml-&gt;xpath('\/\/group\/doc\/url') as $u) {            $urls[] = (string) $u;        }        $place = 0;        $found = '';        foreach ($urls as $n =&gt; $u) {            $host = preg_replace('~^www\\.~', '', (string) parse_url($u, PHP_URL_HOST));            if ($host === $domain) {                $place = $n + 1;                $found = $u;                break;            }        }        \/\/ \u0434\u0430\u0442\u0430, \u043f\u043e\u0437\u0438\u0446\u0438\u044f (0 = \u0432\u043d\u0435 100), \u0437\u0430\u043f\u0440\u043e\u0441, \u0440\u0435\u0433\u0438\u043e\u043d, URL        fwrite($pos, implode(\"\\t\", [$date, $place, $item['q'], $item['lr'], $found]) . \"\\n\");        foreach (array_slice($urls, 0, 20) as $n =&gt; $u) {            fwrite($top, implode(\"\\t\", [$date, $item['q'], $n + 1, $u]) . \"\\n\");        }        $item['done'] = true;        q_save($queue);    }    unset($item);    fclose($pos);    fclose($top);    WP_CLI::success('\u0421\u043e\u0431\u0440\u0430\u043d\u043e');}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439-\u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438.<\/p>\n<p>\u041f\u0430\u0443\u0437\u0430 \u0432 0,25 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u041a\u0432\u043e\u0442\u0430 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u2014 10 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0427\u0435\u0442\u044b\u0440\u0435 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0437\u0430\u043f\u0430\u0441 \u0438 \u043f\u043e\u0434 \u043f\u043e\u0432\u0442\u043e\u0440\u044b, \u0438 \u043f\u043e\u0434 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e JSON-\u0444\u0430\u0439\u043b \u0440\u044f\u0434\u043e\u043c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c. \u0415\u0441\u043b\u0438 <code>submit<\/code> \u0443\u043f\u0430\u043b \u043d\u0430 57-\u0439 \u0441\u0442\u0440\u043e\u043a\u0435, 56 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0443\u0436\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0430 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c: <code>submit keys.txt 2 57<\/code>. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u0430\u043a \u043d\u0435 \u0443\u043c\u0435\u043b\u0430, \u0438 \u043f\u043e\u0441\u043b\u0435 429 \u0432\u044b\u0431\u043e\u0440 \u0431\u044b\u043b \u043d\u0435\u0432\u0435\u0441\u0451\u043b\u044b\u0439: \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0451 \u0437\u0430\u043d\u043e\u0432\u043e \u0438 \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0438\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0438\u0441\u043a\u0430\u0442\u044c, \u0433\u0434\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p><code>GROUP_MODE_DEEP<\/code> \u0438 100 \u0433\u0440\u0443\u043f\u043f. \u0412\u044b\u0434\u0430\u0447\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0430\u0439\u0442\u0430\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u0430. 0 \u0432 TSV \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0432\u043d\u0435 \u0441\u043e\u0442\u043d\u0438\u00bb.<\/p>\n<p>\u0422\u043e\u043f-20 \u0440\u044f\u0434\u043e\u043c \u0441 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439. <code>collect<\/code> \u043f\u0438\u0448\u0435\u0442 \u0432\u0442\u043e\u0440\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043f\u0435\u0440\u0432\u044b\u0435 20 \u0441\u0430\u0439\u0442\u043e\u0432 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443. \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0435\u043b\u0430 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u043a\u0442\u043e \u0432\u0441\u0442\u0430\u043b \u043d\u0430 \u0432\u0430\u0448\u0435 \u043c\u0435\u0441\u0442\u043e. \u0417\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0437 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<h3>\u041d\u0430 \u0447\u0442\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u0438<\/h3>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u044b\u0433\u0430\u044e\u0442 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u043c\u0435\u0440\u0430\u043c\u0438. 6 \u043e\u043a\u0442\u044f\u0431\u0440\u044f 4 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 25 \u0432 \u043e\u0434\u043d\u043e\u043c \u0437\u0430\u043c\u0435\u0440\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u00ab\u0432\u043d\u0435 100\u00bb, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430\u0448\u043b\u0438\u0441\u044c. \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0432\u044b\u0432\u043e\u0434\u044b \u0434\u0435\u043b\u0430\u044e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0434\u0432\u0443\u043c \u0437\u0430\u043c\u0435\u0440\u0430\u043c, \u0431\u043b\u0430\u0433\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043c\u0435\u0440 \u043f\u043e \u0441\u043e\u0442\u043d\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 3 \u20bd.<\/p>\n<p>429 \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u043f\u0430\u043a\u0435\u0442\u0430. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u0437-\u0437\u0430 \u043d\u0435\u0433\u043e \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 <code>submit<\/code> \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0432 <code>wsbatch<\/code>.<\/p>\n<p>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 504 \u043d\u0430 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0435. \u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0430 \u043d\u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0430\u0434\u0430\u043b\u0430. \u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u0431\u0435\u0437\u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 <code>err<\/code> \u0438 \u0438\u0434\u0451\u0442 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0418 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439. \u0420\u0430\u0437\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043b\u0435\u0433\u043a\u043e \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0446\u0438\u043a\u043b, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0442\u044b\u0441\u044f\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0431\u043e\u0439\u0434\u0451\u0442\u0441\u044f \u0432 488 \u20bd \u0432\u043c\u0435\u0441\u0442\u043e 30,5 \u20bd. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0443 \u043c\u0435\u043d\u044f \u043b\u0435\u0436\u0438\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u0432 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430\u043c \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0441\u044a\u0451\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442. \u0414\u0430\u043d\u043d\u044b\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432 TSV \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0440\u0430\u0441\u0445\u043e\u0434 \u0432\u0438\u0434\u043d\u043e \u043f\u043e \u0434\u043d\u044f\u043c, \u0430 \u0441\u0431\u043e\u0439 API \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u043f\u0430\u0443\u0437\u044b, \u0430 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u043f\u043b\u0430\u0442\u044b.<\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0443\u0442 \u043d\u0435\u0442, \u0438 \u044f \u0438\u0445 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e: TSV \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445. \u0415\u0441\u043b\u0438 \u0431\u0435\u0437 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430 \u043d\u0438\u043a\u0430\u043a, \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u041c\u043d\u0435 \u0432\u0430\u0436\u043d\u0435\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u0437\u0430 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044f \u043f\u043b\u0430\u0447\u0443.<\/p>\n<p>\u0410 \u043a\u0430\u043a \u0432\u044b \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438: \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c, \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0438\u043b\u0438 \u0443\u0436\u0435 \u043d\u0438\u043a\u0430\u043a, \u0440\u0430\u0437 \u0432\u044b\u0434\u0430\u0447\u0430 \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u0430\u044f?<\/p>\n<\/div>\n<p>\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\/1099628\/\">https:\/\/habr.com\/ru\/articles\/1099628\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0423 \u043d\u0430\u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0430\u0439\u0442 \u043d\u0430 WordPress \u0432 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043d\u0438\u0448\u0435, SEO \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u041f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043d\u0438\u043c\u0430\u043b \u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441, \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u043c \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0435, \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0444\u0440\u0430\u0437\u0435. \u0412 \u043e\u043a\u0442\u044f\u0431\u0440\u0435 \u043f\u0435\u0440\u0435\u0432\u0451\u043b \u0438 \u0442\u043e \u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430 Search API \u042f\u043d\u0434\u0435\u043a\u0441 \u041e\u0431\u043b\u0430\u043a\u0430. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0433\u043e\u0440\u0441\u0442\u043a\u0430 PHP-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 wp eval-file \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u0441\u0430\u0439\u0442.\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0445\u0435\u043c\u0430, \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0433\u0440\u0430\u0431\u043b\u0438. \u041a\u043e\u0434 \u043e\u0431\u0435\u0437\u043b\u0438\u0447\u0435\u043d: \u043d\u0438 \u043a\u043b\u044e\u0447\u0435\u0439, \u043d\u0438 \u043f\u0443\u0442\u0435\u0439, \u043d\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043e\u0431\u043b\u0430\u043a\u0430. \u041f\u043e\u043b\u044f API \u0443 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.\u0417\u0430\u0447\u0435\u043c WP-CLI\u0421\u0430\u0439\u0442 \u0438 \u0442\u0430\u043a \u043d\u0430 WordPress. wp eval-file script.php \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 PHP-\u0444\u0430\u0439\u043b \u0441 \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u043c \u044f\u0434\u0440\u043e\u043c, \u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u0431\u0432\u044f\u0437\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e:get_option() \u0438 update_option() \u0445\u0440\u0430\u043d\u044f\u0442 \u043a\u043b\u044e\u0447, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430;wp_remote_request() \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a HTTP-\u043a\u043b\u0438\u0435\u043d\u0442, \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u0438 WP_Error \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439;\u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0435\u0441\u0442\u044c WP_CLI::error() \u0438 WP_CLI::success();\u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 $args.\u041d\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u0438 \u0434\u0435\u043f\u043b\u043e\u044f. \u0418 \u043a\u043b\u044e\u0447 \u043d\u0435 \u0432\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435.\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442\u0426\u0435\u043d\u044b \u043d\u0430 \u043e\u043a\u0442\u044f\u0431\u0440\u044c 2026, \u0437\u0430 1 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442 (\u0442\u043e\u043f \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430) \u2014 20 \u20bd, \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u043f\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c \u2014 50 \u20bd. \u041f\u043e\u0438\u0441\u043a \u0432 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435: 30,5 \u20bd \u0434\u043d\u0451\u043c, 25,41 \u20bd \u043d\u043e\u0447\u044c\u044e. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u2014 488 \u20bd.\u0426\u0435\u043d\u044b Search API \u043d\u0430 \u043e\u043a\u0442\u044f\u0431\u0440\u044c 2026, \u0437\u0430 1 000 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443. \u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0435, \u043e\u0442\u0434\u0430\u0451\u0442 id \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043f\u043e\u0442\u043e\u043c. \u041f\u043e\u0437\u0438\u0446\u0438\u044f\u043c \u0441\u043f\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u043a\u0443\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439, \u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b: \u0441\u043e\u0442\u043d\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 2 \u20bd, \u0441\u043e\u0442\u043d\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u2014 \u0432 3 \u20bd. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d (61 \u043c\u0430\u0440\u043a\u0435\u0440 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430, \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e 106 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c, \u0442\u043e\u043f-10 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u043f\u043e 25 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e 10 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u043c) \u0441\u0442\u043e\u0438\u043b \u043e\u043a\u043e\u043b\u043e 6 \u20bd. \u042f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0433\u0434\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430\u0445.\u0414\u043e\u0441\u0442\u0443\u043f \u0438 \u043a\u043b\u044e\u0447\u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043e\u0431\u043b\u0430\u043a\u0430 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0439 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0441 \u0440\u043e\u043b\u044c\u044e search-api.webSearch.user, \u0435\u0451 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442, \u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a. \u0410\u043a\u043a\u0430\u0443\u043d\u0442\u0443 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c API-\u043a\u043b\u044e\u0447.\u041a\u043b\u044e\u0447 \u0436\u0438\u0432\u0451\u0442 \u0432 \u043e\u043f\u0446\u0438\u0438 WordPress. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u0441\u0432\u0435\u0442\u0438\u043b\u0441\u044f \u043d\u0438 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 shell, \u043d\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0438 \u0442\u0443\u0442 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u0435\u043b\u043e\u0447\u044c: \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c, WP-CLI \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 STDIN.tr -d &#8216;\\r\\n &#8216; &lt; key.txt | wp option update yc_api_key &#8212;autoload=no&#8212;autoload=no \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u044e\u0447 \u043d\u0435 \u0433\u0440\u0443\u0437\u0438\u043b\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0430\u0439\u0442\u0443.\u041c\u0438\u043d\u0443\u0441 \u0443 \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c: \u043e\u043f\u0446\u0438\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d. \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0432 wp-config.php \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435, \u0437\u0430\u0442\u043e \u043e\u043f\u0446\u0438\u044e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0444\u0430\u0439\u043b\u0430\u043c. \u0423 \u043d\u0430\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043d\u0435\u043c\u043d\u043e\u0433\u043e, \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u044f \u0431\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u0435\u0449\u0451 \u0440\u0430\u0437.\u041a\u0430\u043a \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043eyc_lib.php      \u043a\u043b\u044e\u0447, id \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430, HTTP \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438, \u0443\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430   \u2502   \u251c\u2500\u2500 ws.php       \u0444\u0440\u0430\u0437\u0430 \u2192 \u0442\u043e\u043f \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0430 + \u00ab\u043f\u043e\u0445\u043e\u0436\u0438\u0435\u00bb (\u0440\u0430\u0437\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441)   \u251c\u2500\u2500 wsdyn.php    \u0444\u0440\u0430\u0437\u0430 \u2192 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043f\u043e \u043c\u0435\u0441\u044f\u0446\u0430\u043c \/ \u043d\u0435\u0434\u0435\u043b\u044f\u043c \/ \u0434\u043d\u044f\u043c   \u251c\u2500\u2500 wsbatch.php  seeds.txt \u2192 out.tsv (\u043c\u0430\u0440\u043a\u0435\u0440, top|assoc, \u0447\u0430\u0441\u0442\u043e\u0442\u0430, \u0444\u0440\u0430\u0437\u0430)   \u2502   \u2514\u2500\u2500 serpq.php    \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a         submit keys.txt [lr] [\u0441\u0442\u0440\u043e\u043a\u0430]  \u2192 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439         status                         \u2192 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u043e         collect [\u0434\u043e\u043c\u0435\u043d]                \u2192 pos_\u0413\u0413\u0413\u0413\u041c\u041c\u0414\u0414.tsv, serp_top_\u0413\u0413\u0413\u0413\u041c\u041c\u0414\u0414.tsv\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u044a\u0451\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a\u0412\u044b\u0445\u043e\u0434 \u0432\u0435\u0437\u0434\u0435 \u0432 TSV. \u0415\u0433\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043b\u044e\u0431\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0438 \u0441 \u043d\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 cut, sort \u0438 awk.\u0420\u0435\u0433\u0438\u043e\u043d\u044b \u0432 \u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0434\u0430\u043c\u0438: 10174 \u2014 \u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433 \u0441 \u041b\u0435\u043d\u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e (\u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439), 2 \u2014 \u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433, 1 \u2014 \u041c\u043e\u0441\u043a\u0432\u0430 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u044c, 225 \u2014 \u0432\u0441\u044f \u0420\u043e\u0441\u0441\u0438\u044f. \u0414\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0438\u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a lr=2.\u041e\u0431\u0449\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0421\u044e\u0434\u0430 \u0443\u0448\u043b\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u043e\u0441\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435: \u043a\u043b\u044e\u0447, HTTP, \u043f\u043e\u0432\u0442\u043e\u0440\u044b \u0438 \u0443\u0447\u0451\u0442.&lt;?php\/\/ yc_lib.php \u2014 \u043e\u0431\u0449\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0432\u0441\u0435\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 `wp eval-file`, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 WordPress \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d.const YC_SEARCH = &#8216;https:\/\/searchapi.api.cloud.yandex.net\/v2&#8217;;const YC_OPS    = &#8216;https:\/\/operation.api.cloud.yandex.net\/operations\/&#8217;;function yc_key(): string {    $k = (string) get_option(&#8216;yc_api_key&#8217;, &#187;);    if ($k === &#187;) {        WP_CLI::error(&#8216;\u041d\u0435\u0442 \u043a\u043b\u044e\u0447\u0430 \u0432 \u043e\u043f\u0446\u0438\u0438 yc_api_key&#8217;);    }    return $k;}function yc_folder(): string {    return (string) get_option(&#8216;yc_folder_id&#8217;, &#187;);}\/\/ \u0423\u0447\u0451\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u0430: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u0448\u043b\u043e \u0437\u0430 \u0434\u0435\u043d\u044c.function yc_count(string $kind, int $n = 1): void {    $u = get_option(&#8216;yc_usage&#8217;, []);    $d = gmdate(&#8216;Y-m-d&#8217;);    $u[$d][$kind] = ($u[$d][$kind] ?? 0) + $n;    update_option(&#8216;yc_usage&#8217;, $u, false);}\/\/ HTTP \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u0430\u043c\u0438: 429 \u0438 5xx \u2014 \u043f\u0430\u0443\u0437\u0430 \u0438 \u0435\u0449\u0451 \u043f\u043e\u043f\u044b\u0442\u043a\u0430, 401\/403 \u2014 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u043e\u043f.function yc_http(string $method, string $url, ?array $body = null, int $tries = 5): ?array {    $args = [        &#8216;method&#8217;  =&gt; $method,        &#8216;timeout&#8217; =&gt; 60,        &#8216;headers&#8217; =&gt; [            &#8216;Authorization&#8217; =&gt; &#8216;Api-Key &#8216; . yc_key(),            &#8216;Content-Type&#8217;  =&gt; &#8216;application\/json&#8217;,        ],    ];    if ($body !== null) {        $args[&#8216;body&#8217;] = wp_json_encode($body);    }    for ($i = 1; $i &lt;= $tries; $i++) {        $r = wp_remote_request($url, $args);        if (is_wp_error($r)) {              \/\/ \u0442\u0430\u0439\u043c\u0430\u0443\u0442, \u043e\u0431\u0440\u044b\u0432 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f            sleep(2 * $i);            continue;        }        $code = wp_remote_retrieve_response_code($r);        if ($code === 200) {            return json_decode(wp_remote_retrieve_body($r), true);        }        if ($code === 401 || $code === 403) {            WP_CLI::error(&#171;HTTP $code: \u043a\u043b\u044e\u0447 \u043e\u0442\u043e\u0437\u0432\u0430\u043d \u0438\u043b\u0438 \u0443 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u043d\u0435\u0442 \u0440\u043e\u043b\u0438&#187;);        }        if ($code === 429 || $code &gt;= 500) { \/\/ \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437, 504 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435            sleep(2 * $i);            continue;        }        WP_CLI::warning(&#171;HTTP $code: &#187; . wp_remote_retrieve_body($r));        return null;    }    return null;                            \/\/ \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c}\u041f\u0430\u0440\u0430 \u043c\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c.\u041d\u0430 401 \u0438 403 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443. \u042d\u0442\u043e \u0438\u043b\u0438 \u043e\u0442\u043e\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u0438\u043b\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0431\u0435\u0437 \u0440\u043e\u043b\u0438, \u0438 \u043f\u043e\u0432\u0442\u043e\u0440 \u0442\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0441\u0442. \u0412 \u043e\u0431\u043b\u0430\u043a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442 \u0441\u0430\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442.\u041d\u0430 429 \u0438 5xx \u043e\u043d \u0436\u0434\u0451\u0442 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437. 429 API \u043e\u0442\u0434\u0430\u0432\u0430\u043b \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0435, \u0430 \u043d\u0430 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u043b\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 504.\u0423\u0447\u0451\u0442 \u043f\u043e \u0434\u043d\u044f\u043c \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u043f\u0446\u0438\u0438: wp option get yc_usage &#8212;format=json \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u043a\u0430\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0443\u0448\u043b\u043e. \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0442\u043e\u044f\u0442 \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u043d\u043e \u043a\u043e\u043f\u0435\u0439\u043a\u0438, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0446\u0438\u043a\u043b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0442\u0443\u0434\u0430 \u043f\u043e\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044e.\u0412\u043e\u0440\u0434\u0441\u0442\u0430\u0442 \u043f\u0430\u0447\u043a\u043e\u0439\u041d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0444\u0430\u0439\u043b \u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430\u043c\u0438, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 TSV. \u0413\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0435\u0433\u043e \u044f \u0445\u043e\u0442\u0435\u043b: \u0447\u0442\u043e\u0431\u044b \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u0431\u043e\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0430 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u0441 \u043d\u0443\u043b\u044f.&lt;?php\/\/ wp eval-file wsbatch.php seeds.txt out.tsv [\u0440\u0435\u0433\u0438\u043e\u043d=10174] [\u0444\u0440\u0430\u0437=2000]require __DIR__ . &#8216;\/yc_lib.php&#8217;;[$seeds, $out] = [$args[0], $args[1]];$region = $args[2] ?? &#8216;10174&#8217;;$limit  = $args[3] ?? &#8216;2000&#8217;;\/\/ \u041c\u0430\u0440\u043a\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 out.tsv, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c: \u0442\u0430\u043a \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\/\/ \u0441 \u043c\u0435\u0441\u0442\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 429, \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u0438\u043b\u0438 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u0435\u0441\u0441\u0438\u0438.$done = [];if (is_file($out)) {    foreach (file($out, FILE_IGNORE_NEW_LINES) as $line) {        $p = explode(&#171;\\t&#187;, $line);        if (($p[1] ?? &#187;) !== &#8216;err&#8217;) {      \/\/ \u0443\u043f\u0430\u0432\u0448\u0438\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430            $done[$p[0]] = true;        }    }}$fh = fopen($out, &#8216;a&#8217;);foreach (file($seeds, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $seed) {    $seed = trim($seed);    if (isset($done[$seed])) {        continue;    }    $res = yc_http(&#8216;POST&#8217;, YC_SEARCH . &#8216;\/wordstat\/topRequests&#8217;, [        &#8216;phrase&#8217;     =&gt; $seed,        &#8216;numPhrases&#8217; =&gt; $limit,        &#8216;regions&#8217;    =&gt; [$region],        &#8216;folderId&#8217;   =&gt; yc_folder(),    ]);    yc_count(&#8216;wordstat&#8217;);    if ($res === null) {        fwrite($fh, &#171;$seed\\terr\\t0\\t\\n&#187;);   \/\/ \u043f\u0440\u043e\u0433\u043e\u043d\u0438\u043c \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e        continue;    }    foreach ([&#8216;results&#8217; =&gt; &#8216;top&#8217;, &#8216;associations&#8217; =&gt; &#8216;assoc&#8217;] as $key =&gt; $type) {        foreach ($res[$key] ?? [] as $row) {            fwrite($fh, implode(&#171;\\t&#187;, [$seed, $type, $row[&#8216;count&#8217;], $row[&#8216;phrase&#8217;]]) . &#171;\\n&#187;);        }    }    fflush($fh);                            \/\/ \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0441\u0440\u0430\u0437\u0443}fclose($fh);WP_CLI::success(&#8216;\u0413\u043e\u0442\u043e\u0432\u043e&#8217;);\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0443\u0445 \u0432\u0435\u0449\u0430\u0445: fflush() \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435. \u041c\u0430\u0440\u043a\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0440\u043e\u0448\u0451\u043b \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0439 err, \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u043d\u043e\u0432\u0430.\u0414\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u043e\u0442\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u0438\u043d\u0430\u0447\u0435 \u043e\u0431\u0440\u044b\u0432 SSH \u0435\u0433\u043e \u0443\u0431\u0438\u0432\u0430\u0435\u0442:nohup setsid wp eval-file wsbatch.php seeds.txt out.tsv 10174 2000 \\  &lt; \/dev\/null &gt; wsbatch.log 2&gt;&amp;1 &amp;\u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0451\u043c\u0430: \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0435 \u044f\u0434\u0440\u043e \u0443 \u043d\u0430\u0441 \u2014 2 154 \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0414\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f.\u041f\u043e\u0437\u0438\u0446\u0438\u0438: submit, status, collect\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 \u0442\u0440\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. submit \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 id \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, status \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u043e, collect \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 XML \u0438 \u043f\u0438\u0448\u0435\u0442 TSV.&lt;?php\/\/ wp eval-file serpq.php submit keys.txt [lr=2] [\u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438=1]\/\/ wp eval-file serpq.php status\/\/ wp eval-file serpq.php collect [\u0434\u043e\u043c\u0435\u043d]require __DIR__ . &#8216;\/yc_lib.php&#8217;;const QUEUE = __DIR__ . &#8216;\/serp_queue.json&#8217;;function q_load(): array { return is_file(QUEUE) ? json_decode(file_get_contents(QUEUE), true) : []; }function q_save(array $q): void { file_put_contents(QUEUE, json_encode($q, JSON_UNESCAPED_UNICODE)); }$cmd = $args[0] ?? &#8216;status&#8217;;if ($cmd === &#8216;submit&#8217;) {    $keys  = file($args[1], FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);    $lr    = $args[2] ?? &#8216;2&#8217;;    $start = max(1, (int) ($args[3] ?? 1));    $queue = q_load();    for ($i = $start &#8212; 1; $i &lt; count($keys); $i++) {        $res = yc_http(&#8216;POST&#8217;, YC_SEARCH . &#8216;\/web\/searchAsync&#8217;, [            &#8216;query&#8217;          =&gt; [&#8216;searchType&#8217; =&gt; &#8216;SEARCH_TYPE_RU&#8217;, &#8216;queryText&#8217; =&gt; $keys[$i]],            &#8216;groupSpec&#8217;      =&gt; [&#8216;groupMode&#8217; =&gt; &#8216;GROUP_MODE_DEEP&#8217;, &#8216;groupsOnPage&#8217; =&gt; &#8216;100&#8217;, &#8216;docsInGroup&#8217; =&gt; &#8216;1&#8217;],            &#8216;region&#8217;         =&gt; $lr,            &#8216;folderId&#8217;       =&gt; yc_folder(),            &#8216;responseFormat&#8217; =&gt; &#8216;FORMAT_XML&#8217;,        ]);        if ($res === null || empty($res[&#8216;id&#8217;])) {            WP_CLI::error(&#8216;\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 &#8216; . ($i + 1) . &#8216;. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c: submit &#8216; . $args[1] . &#187; $lr &#187; . ($i + 1));        }        yc_count(&#8216;serp_async&#8217;);        $queue[] = [&#8216;q&#8217; =&gt; $keys[$i], &#8216;lr&#8217; =&gt; $lr, &#8216;op&#8217; =&gt; $res[&#8216;id&#8217;], &#8216;done&#8217; =&gt; false];&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500359","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500359","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=500359"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500359\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}