{"id":490223,"date":"2026-08-08T07:34:41","date_gmt":"2026-08-08T07:34:41","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=490223"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=490223","title":{"rendered":"\u0414\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u044c\u00a0\u0433\u0440\u0430\u0431\u043b\u0435\u0439\u00a0Gmail\u00a0API,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0435\u00a0\u044f\u00a0\u0441\u043e\u0431\u0440\u0430\u043b,\u00a0\u043f\u043e\u043a\u0430\u00a0\u0443\u0447\u0438\u043b\u00a0Claude\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u00a0\u043f\u043e\u0447\u0442\u0443"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u044f: \u0447\u0442\u043e\u0431\u044b Claude \u043c\u043e\u0433 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0435, \u043d\u0435\u00a0\u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c\u00a0\u2014 Zapier, \u0432\u0441\u044f\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b. \u041d\u043e\u00a0\u0442\u0430\u043c \u043c\u043e\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0447\u0443\u0436\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430\u00a0\u043c\u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u0432\u043e\u0439 MCP\u2011\u0441\u0435\u0440\u0432\u0435\u0440: \u043f\u0430\u0440\u0430 \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a, Gmail API, \u0437\u0430\u00a0\u0432\u0435\u0447\u0435\u0440.<\/p>\n<p>\u0412\u0435\u0447\u0435\u0440 \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0438 300\u00a0\u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435\u00a0\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u043e\u0447\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u0438\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043b\u043e\u0447\u044c \u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u0441\u0451 \u043c\u043e\u043b\u0447\u0430 \u0438 \u043d\u0435\u00a0\u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u0421\u043e\u0431\u0440\u0430\u043b \u0433\u0440\u0430\u0431\u043b\u0438 \u0432\u00a0\u043a\u0443\u0447\u0443. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435\u00a0\u2014 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u0435 \u0441\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0447\u0435\u0440\u043e\u0432.<\/p>\n<h4>\u0427\u0442\u043e\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c<\/h4>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 MCP\u2011\u0441\u0435\u0440\u0432\u0435\u0440: \u0432\u043e\u0441\u0435\u043c\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b, \u043f\u043e\u0438\u0441\u043a, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0451\u043c, \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0441\u0432\u043e\u0438\u0445 OAuth\u2011\u043a\u0440\u0435\u0434\u0435\u043d\u0448\u0435\u043b\u0430\u0445, \u0445\u043e\u0434\u0438\u0442 \u0432\u00a0Google \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/771\/b7b\/3b9\/771b7b3b9c7b262d7a4e4cc72f8f3e2f.png\" alt=\" \u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. \u041f\u0443\u043d\u043a\u0442\u0438\u0440 \u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043e\u043d\u0438 \u043d\u0435 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\" title=\" \u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. \u041f\u0443\u043d\u043a\u0442\u0438\u0440 \u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043e\u043d\u0438 \u043d\u0435 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\" width=\"1568\" height=\"996\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/771\/b7b\/3b9\/771b7b3b9c7b262d7a4e4cc72f8f3e2f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/771\/b7b\/3b9\/771b7b3b9c7b262d7a4e4cc72f8f3e2f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. \u041f\u0443\u043d\u043a\u0442\u0438\u0440\u00a0\u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043e\u043d\u0438 \u043d\u0435\u00a0\u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. <code>server.py<\/code> \u0442\u043e\u043d\u043a\u0438\u0439\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442. \u0412\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0436\u0438\u0432\u0451\u0442 \u0432\u00a0\u043f\u0430\u043a\u0435\u0442\u0435 <code>gws<\/code> \u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0431\u0435\u0437\u00a0\u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 300\u00a0\u0442\u0435\u0441\u0442\u043e\u0432 \u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u00a0\u0434\u0435\u0432\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u00a0\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 Google.<\/p>\n<p>\u0421\u0435\u043a\u0440\u0435\u0442\u044b\u00a0\u2014 refresh\u2011\u0442\u043e\u043a\u0435\u043d \u0438 \u043a\u043b\u044e\u0447\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u00a0\u2014 \u043b\u0435\u0436\u0430\u0442 \u0432\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435 \u043d\u0438 \u0444\u0430\u0439\u043b\u0430, \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043f\u0443\u0441\u0442\u043e.<\/p>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u043a\u00a0\u0433\u0440\u0430\u0431\u043b\u044f\u043c.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 1. \u041f\u0438\u0441\u044c\u043c\u043e \u0432\u00a0windows-1251\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u0430\u0448\u0443. \u041c\u043e\u043b\u0447\u0430<\/h4>\n<p>\u0421\u0430\u043c\u0430\u044f \u043a\u043e\u0432\u0430\u0440\u043d\u0430\u044f \u0438\u0437\u00a0\u0432\u0441\u0435\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u043f\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>Gmail API \u043e\u0442\u0434\u0430\u0451\u0442 \u0442\u0435\u043b\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043a\u0430\u043a\u00a0base64\u00a0<strong>\u0432\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f<\/strong>. \u041d\u0435\u00a0\u0432\u00a0UTF-8. \u0412\u00a0\u0442\u043e\u0439, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0438\u0441\u044c\u043c\u043e\u00a0\u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e.<\/p>\n<p>\u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">raw = base64.urlsafe_b64decode(data)return raw.decode(\u201cutf-8\u201d, errors=\u201creplace\u201d)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0420\u043e\u0432\u043d\u043e \u0434\u043e\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0438\u0437\u00a0\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u00a0\u0441\u0438\u0445 \u043f\u043e\u0440 \u0448\u043b\u0451\u0442 \u0432 <code>windows-1251<\/code>. \u0422\u0430\u043a\u0438\u0445 \u0432\u00a0\u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442\u00a0\u2014 \u043b\u0435\u0433\u0430\u0441\u0438\u2011MTA, \u0441\u0442\u0430\u0440\u044b\u0435 CRM, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u0441\u0438\u0441\u0442\u0435\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u043c \u0441\u00a0\u043c\u0435\u043d\u044f.<\/p>\n<p>\u0417\u0430\u043c\u0435\u0440\u0438\u043b \u043d\u0430\u00a0\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435: \u0438\u0437 41\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b <strong>34\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u0432 <\/strong><code><strong>U+FFFD<\/strong><\/code>. \u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0440\u043e\u043c\u0431\u0438\u043a \u0441\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u0442\u0430\u043b \u043c\u0443\u0441\u043e\u0440\u043e\u043c, \u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u0447\u0438\u0442\u0430\u043b\u0441\u044f, \u0447\u0442\u043e\u00a0\u0432\u0441\u0451 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00a0\u2014 \u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u0438\u0437 <code>Content-Type<\/code> \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<pre><code class=\"python\">def partcharset(part):\u00a0 \u00a0 for header in part.get(\"headers\", []):\u00a0 \u00a0 \u00a0 \u00a0 if header.get(\"name\", \"\").lower() == \"content-type\":\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 match = re.search(\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 r'charset\\s*=\\s*\"?([\\w.-]+)\"?', header.get(\"value\", \"\"), re.IGNORECASE\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 )\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if match:\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return match.group(1)\u00a0 \u00a0 return \"utf-8\"def decodepart(part):\u00a0 \u00a0 data = part.get(\"body\", {}).get(\"data\")\u00a0 \u00a0 if not data:\u00a0 \u00a0 \u00a0 \u00a0 return \"\"\u00a0 \u00a0 raw = base64.urlsafe_b64decode(data)\u00a0 \u00a0 try:\u00a0 \u00a0 \u00a0 \u00a0 return raw.decode(_part_charset(part), errors=\"replace\")\u00a0 \u00a0 except LookupError:\u00a0 \u00a0 \u00a0 \u00a0 # \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u2014 \u043d\u0435 \u0440\u043e\u043d\u044f\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e\u00a0 \u00a0 \u00a0 \u00a0 return raw.decode(\"utf-8\", errors=\"replace\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>LookupError<\/code> \u0442\u0443\u0442 \u043d\u0435\u00a0\u0434\u043b\u044f\u00a0\u043a\u0440\u0430\u0441\u043e\u0442\u044b: \u0432\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f. \u041f\u0430\u0434\u0430\u0442\u044c \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u00a0\u0447\u0442\u0435\u043d\u0438\u0438 \u043f\u0438\u0441\u044c\u043c\u0430\u00a0\u2014 \u043f\u043b\u043e\u0445\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u043d.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 2. \u0422\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439<\/h4>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439. \u042f\u00a0\u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e\u00a0\u0443\u0436 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\u2011\u0442\u043e Gmail API \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u043e\u2011\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>\u041d\u0435\u00a0\u043e\u0442\u0434\u0430\u0451\u0442. <code>Subject<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0432\u00a0\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432\u00a0\u043a\u0430\u043a\u043e\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c. \u0410\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u043d\u0430\u00a0\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435, \u0448\u043b\u0451\u0442 \u043f\u043e\u00a0RFC 2047:<\/p>\n<blockquote>\n<p>=?utf-8?B?0KLQtdC80LAg0L\/QuNGB0YzQvNCw?=<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u00a0\u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0422\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430\u00bb. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">from email.errors import HeaderParseErrorfrom email.header import decode_header, make_headerdef decodeheader_value(value):\u00a0 \u00a0 \"\"\"\u0420\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 RFC 2047. \u041e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c.\"\"\"\u00a0 \u00a0 if not value or \"=?\" not in value:\u00a0 \u00a0 \u00a0 \u00a0 return value\u00a0 \u00a0 try:\u00a0 \u00a0 \u00a0 \u00a0 return str(make_header(decode_header(value)))\u00a0 \u00a0 except (UnicodeDecodeError, LookupError, ValueError, HeaderParseError):\u00a0 \u00a0 \u00a0 \u00a0 return value<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 <code>HeaderParseError<\/code> \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435. \u042f \u0435\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043b\u00a0\u2014 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e <code>ValueError<\/code> \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, <code>email.errors.HeaderParseError<\/code> \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <code>MessageError<\/code>, \u0430\u00a0\u043d\u0435\u00a0\u043e\u0442 <code>ValueError<\/code>, \u0438 \u0431\u0438\u0442\u044b\u0439 base64\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 <code>=?utf-8?B?...?=<\/code> \u043f\u0440\u043e\u043b\u0435\u0442\u0430\u043b \u043c\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 3. \u0420\u0443\u0441\u0441\u043a\u0438\u0439 Outlook \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u00ab\u041e\u0442\u0432\u0435\u0442:\u00bb, \u0430\u00a0\u043d\u0435 \u00abRe:\u00bb<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u00ab\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Re: \u043a\u00a0\u0442\u0435\u043c\u0435, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0451 \u043d\u0435\u0442\u00bb:<\/p>\n<pre><code class=\"python\">if subject.lower().startswith(\"re:\"):\u00a0 \u00a0 return subjectreturn f\"Re: {subject}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435. \u041f\u043e\u043a\u0430 \u0432\u0430\u043c \u043d\u0435\u00a0\u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438\u0437\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e Outlook, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00ab\u041e\u0442\u0432\u0435\u0442:\u00bb. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<blockquote>\n<p>Re: \u041e\u0442\u0432\u0435\u0442: Re: \u041e\u0442\u0432\u0435\u0442: \u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430<\/p>\n<\/blockquote>\n<p>\u041f\u043b\u044e\u0441 \u0431\u043e\u043d\u0443\u0441: \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u043e\u0431\u0435\u043b \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. <code>\" \u00a0Re: \u0422\u0435\u043c\u0430\"<\/code> \u043d\u0435\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>re:<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.\u00bb<\/p>\n<pre><code class=\"python\">REPLY_PREFIXES = (\"re:\", \"\u043e\u0442\u0432\u0435\u0442:\", \"\u0440\u0435:\", \"fwd:\", \"fw:\", \"\u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0430:\")def reply_subject(subject):\u00a0 \u00a0 stripped = subject.strip()\u00a0 \u00a0 lowered = stripped.lower()\u00a0 \u00a0 if any(lowered.startswith(prefix) for prefix in REPLY_PREFIXES):\u00a0 \u00a0 \u00a0 \u00a0 return stripped\u00a0 \u00a0 return f\"Re: {stripped}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 4. \u0417\u0430\u043f\u044f\u0442\u0430\u044f \u0432\u00a0\u0438\u043c\u0435\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0432\u00a0\u0434\u0432\u0443\u0445<\/h4>\n<p>\u0418\u0437\u00a0\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0430\u0434\u0440\u0435\u0441 \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<blockquote>\n<p>\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;<\/p>\n<\/blockquote>\n<p>\u041f\u043e\u00a0RFC 5322\u00a0\u0437\u0430\u043f\u044f\u0442\u0430\u044f\u00a0\u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0440\u0441\u0435\u0440 \u0447\u0435\u0441\u0442\u043d\u043e \u0432\u0438\u0434\u0438\u0442 \u0437\u0434\u0435\u0441\u044c <strong>\u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439<\/strong>: \u043d\u0435\u043a\u043e\u0435\u0433\u043e <code>\u0418\u0432\u0430\u043d\u043e\u0432<\/code> \u0431\u0435\u0437\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0438 <code>\u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;<\/code>.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043b:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; getaddresses([\"\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;\"])[('', '\u0418\u0432\u0430\u043d\u043e\u0432'), ('\u0418\u0432\u0430\u043d', 'ivan@example.com')]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f:\u00a0\u043b\u0438\u0431\u043e Gmail \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400,\u00a0\u043b\u0438\u0431\u043e\u00a0\u2014 \u0447\u0442\u043e\u00a0\u0445\u0443\u0436\u0435\u00a0\u2014 \u043f\u0438\u0441\u044c\u043c\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u00a0\u0442\u043e\u043c\u0443, \u043a\u043e\u043c\u0443 \u0432\u044b \u0434\u0443\u043c\u0430\u043b\u0438.<\/p>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u00ab\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00bb \u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434\u00a0\u2014 \u043d\u0435\u00a0\u043c\u043e\u043b\u0447\u0430\u0442\u044c:<\/p>\n<pre><code class=\"python\">for name, address in parsed:\u00a0 \u00a0 if not address or \"@\" not in address:\u00a0 \u00a0 \u00a0 \u00a0 broken = f\"{name} &lt;{address}&gt;\".strip() if name else address\u00a0 \u00a0 \u00a0 \u00a0 raise ValueError(\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 f\"\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f: {broken}. \"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"\u0415\u0441\u043b\u0438 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0430\u044f, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0430\u0432\u044b\u0447\u0438\u0442\u044c: \"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 '\"\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d\" &lt;ivan@example.com&gt;'\u00a0 \u00a0 \u00a0 \u00a0 )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u043a\u0430\u0432\u044b\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>\"\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d\" &lt;ivan@example.com&gt;<\/code> \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u00a0\u2014 \u044d\u0442\u043e \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c: \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 <code>formataddr<\/code> \u043d\u0435\u043b\u044c\u0437\u044f. \u041e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 ASCII \u0432\u00a0\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 \u043d\u0430\u00a0\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 <code>UnicodeEncodeError<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043d\u0430\u00a0\u043c\u0438\u043d\u0443\u0442\u043e\u0447\u043a\u0443, \u0442\u043e\u0436\u0435 <code>ValueError<\/code>. \u0423\u00a0\u043c\u0435\u043d\u044f \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442 \u043d\u0430 \u00ab\u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441\u00bb \u043a\u0430\u043a\u043e\u0435\u2011\u0442\u043e \u0432\u0440\u0435\u043c\u044f\u00a0\u0431\u044b\u043b \u0437\u0435\u043b\u0451\u043d\u044b\u043c, \u043b\u043e\u0432\u044f \u043d\u0435\u00a0\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443. \u041c\u043e\u0440\u0430\u043b\u044c: <code>pytest.raises(ValueError)<\/code> \u0431\u0435\u0437\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430\u00a0\u2014 \u043d\u0435\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 5. Bcc \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043f\u0438\u0441\u044c\u043c\u0435. \u0414\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a<\/h4>\n<p>\u0422\u0443\u0442 \u044f \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u0447\u0443\u0442\u044c \u043d\u0435\u00a0\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u0438\u0437\u00a0\u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c MIME \u0440\u0443\u043a\u0430\u043c\u0438, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Bcc<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0\u044f\u0432\u043d\u0430\u044f \u0443\u0442\u0435\u0447\u043a\u0430: \u043e\u043d\u00a0\u0436\u0435 \u0443\u0435\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e, \u0438 \u0432\u0441\u0435 \u0443\u0432\u0438\u0434\u044f\u0442 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043e\u043f\u0438\u0438. \u0420\u0443\u043a\u0430 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c.<\/p>\n<p>\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0414\u043b\u044f\u00a0Gmail API <code>Bcc<\/code> \u0432\u00a0raw\u2011\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438\u00a0\u2014 <strong>\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/strong> \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u0443\u044e \u043a\u043e\u043f\u0438\u044e. <a href=\"https:\/\/developers.google.com\/workspace\/gmail\/api\/reference\/rest\/v1\/users.messages\/send\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a> \u043f\u0440\u044f\u043c\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f\u043c \u0438\u0437\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 <code>To<\/code>, <code>Cc<\/code> \u0438 <code>Bcc<\/code>. Gmail \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 MSA \u0438 \u0441\u0430\u043c \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u043e\u0439.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u00ab\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u00a0\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u00a0\u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442. \u041f\u0440\u0438\u0447\u0451\u043c \u043c\u043e\u043b\u0447\u0430\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 API.<\/p>\n<p>\u0412\u00a0\u043a\u043e\u0434\u0435 \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0430\u00a0\u043f\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a (\u0438\u043b\u0438 \u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430) \u043d\u0435 \u00ab\u043f\u043e\u0447\u0438\u043d\u0438\u043b\u00bb \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 6. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c \u043d\u0435\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0434\u0430\u0442\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435<\/h4>\n<p>\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b, \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0447\u0442\u044b. \u0410\u0433\u0430.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0438\u0442\u0435 \u00ab\u0432\u0441\u0442\u0440\u0435\u0447\u0443 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c 6\u00a0\u0430\u0432\u0433\u0443\u0441\u0442\u0430\u00bb\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>start.date = 2026-08-06<\/code> \u0438 <code>end.date = 2026-08-06<\/code>. Google \u043d\u0430\u00a0\u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400\u00a0\u0441 <code>reason: timeRangeEmpty<\/code>.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>end.date<\/code> \u0443\u00a0\u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c\u00a0\u2014 <strong>\u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430<\/strong>. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u00a0\u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u044d\u0442\u043e <code>start = 2026-08-06<\/code>, <code>end = 2026-08-07<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u043d\u043e\u00a0\u0441\u0434\u0432\u0438\u0433 \u043d\u0435\u00a0\u0441\u0434\u0435\u043b\u0430\u043d, \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442\u00a0\u2014 \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u0445\u0430\u044f \u043f\u043e\u0442\u0435\u0440\u044f \u0434\u043d\u044f: \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0441 6-\u0433\u043e \u043f\u043e 8-\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0432\u0435\u0447\u0435\u0440\u043e\u043c 7-\u0433\u043e.<\/p>\n<pre><code class=\"python\">def shiftall_day_end(body):\u00a0 \u00a0 start_date = body.get(\"start\", {}).get(\"date\")\u00a0 \u00a0 end_date = body.get(\"end\", {}).get(\"date\")\u00a0 \u00a0 if start_date and end_date:\u00a0 \u00a0 \u00a0 \u00a0 shifted = datetime.date.fromisoformat(end_date) + datetime.timedelta(days=1)\u00a0 \u00a0 \u00a0 \u00a0 body[\"end\"][\"date\"] = shifted.isoformat()\u00a0 \u00a0 return body<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0441\u0440\u0430\u0437\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043c\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0430\u043c: \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442 <code>body<\/code>, \u0430\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0435\u0451 <code>create_event<\/code> \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u0430 \u0432\u00a0\u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432. \u041f\u0440\u0438 429\u00a0\u043e\u0442\u00a0Google \u043f\u043e\u0432\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c\u00a0\u2014 \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u0443\u044e \u0434\u0430\u0442\u0443 <strong>\u0435\u0449\u0451 \u043d\u0430\u00a0\u0434\u0435\u043d\u044c<\/strong>. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043e\u043b\u0447\u0430 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430\u00a0\u0441\u0443\u0442\u043a\u0438, \u043f\u0440\u0438\u0447\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u00a0Google \u0438\u043a\u043d\u0443\u043b\u043e\u0441\u044c.<\/p>\n<p>\u041b\u0435\u0447\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0435\u0439 \u043d\u0430\u00a0\u0432\u0445\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">@with_retriesdef create_event(body, calendar_id=\"primary\", add_meet=False):\u00a0 \u00a0 body = copy.deepcopy(body)\u00a0 \u00a0 shiftall_day_end(body)\u00a0 \u00a0 ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0440\u0430\u043b\u044c \u043e\u0431\u0449\u0430\u044f: \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u0430 \u0432\u00a0retry, \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430\u00a0\u0431\u044b\u0442\u044c \u0447\u0438\u0441\u0442\u043e\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u043d\u0430\u0447\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437\u00bb, \u0430 \u00ab\u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438\u00bb.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 7. \u0421\u043a\u043e\u0443\u043f calendar.events \u043d\u0435\u00a0\u0434\u0430\u0451\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c<\/h4>\n<p>\u0412\u043e\u0442 \u044d\u0442\u0443 \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0436\u0438\u0432\u043e\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 299\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u00a0\u0431\u044b\u043b\u0438 \u0437\u0435\u043b\u0451\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u0430 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u00ab\u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432 15:00\u00bb \u0431\u0435\u0437\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430\u00a0\u043d\u0435\u00a0\u0432\u00a0UTC. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431:<\/p>\n<pre><code class=\"python\">info = service.calendars().get(calendarId=\"primary\").execute()timezone = info.get(\"timeZone\", \"UTC\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043a\u043e\u0443\u043f <code>calendar<\/code> \u0438\u043b\u0438 <code>calendar.readonly<\/code>, \u0430\u00a0\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 <code>calendar.events<\/code>\u00a0\u2014 \u043f\u043e\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00ab\u0431\u0435\u0440\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0443\u0436\u043d\u043e\u00bb. \u0412\u00a0\u043e\u0442\u0432\u0435\u0442:<\/p>\n<blockquote>\n<p>403\u00a0insufficientPermissions: Request had insufficient authentication scopes.<\/p>\n<\/blockquote>\n<p>\u041f\u0440\u0438\u0447\u0451\u043c <code>calendars.get<\/code> \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 <em>Calendars<\/em>, \u0430 <code>calendar.events<\/code> \u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 <em>Events<\/em>. \u0420\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u0448\u044c, \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0448\u044c.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: <code>calendar_timezone()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432 <code>create_event<\/code> \u0438 <code>update_event<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c <strong>\u0432\u0435\u0441\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u00a0\u0431\u044b\u043b \u043c\u0451\u0440\u0442\u0432<\/strong>, \u0430\u00a0\u0442\u0435\u0441\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u0432\u0438\u0434\u0435\u043b\u0438\u00a0\u2014 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u043e\u0439\u043d\u0438\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430\u00a0\u043b\u044e\u0431\u043e\u0439 \u0432\u044b\u0437\u043e\u0432, \u0435\u043c\u0443 \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 Google.<\/p>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043d\u0435\u00a0\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c: <code>events.list<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u0443 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u0432\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441 <code>calendar.events<\/code>.<\/p>\n<pre><code class=\"python\">response = service.events().list(\u00a0 \u00a0 calendarId=calendar_id, maxResults=1, singleEvents=True).execute()timezone = response.get(\"timeZone\", \"UTC\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0437\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0435\u0431\u0435 \u043d\u0430\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u0435: <strong>\u0442\u0435\u0441\u0442\u044b \u0441\u00a0\u043c\u043e\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e\u00a0\u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 API \u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0438. \u041e\u043d\u0438 \u043d\u0435\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e\u00a0\u0432\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c.<\/strong><\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 8. \u041f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445, \u043a\u043e\u0433\u043e \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/h4>\n<p><code>people.searchContacts<\/code> \u0438\u0449\u0435\u0442 \u043f\u043e \u00ab\u041c\u043e\u0438\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430\u043c\u00bb\u00a0\u2014 \u0442\u0435\u043c, \u043a\u043e\u0433\u043e \u0432\u044b \u044f\u0432\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0432\u00a0\u0430\u0434\u0440\u0435\u0441\u043d\u0443\u044e \u043a\u043d\u0438\u0433\u0443.<\/p>\n<p>\u0423\u00a0\u043c\u0435\u043d\u044f \u0432\u00a0\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435 \u0442\u0430\u043a\u0438\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c <strong>\u043d\u043e\u043b\u044c<\/strong>. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0430 \u0438\u0434\u0451\u0442 \u0433\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>\u0412\u0441\u0451, \u0441\u00a0\u043a\u0435\u043c \u0432\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c, Google \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u00ab\u0414\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b\u00bb, \u0438 \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>otherContacts.search<\/code> \u0441\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u043a\u043e\u0443\u043f\u043e\u043c <code>contacts.other.readonly<\/code>. \u0411\u0435\u0437\u00a0\u043d\u0435\u0433\u043e \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u043d\u0430\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<p>\u0414\u0432\u0435 \u043c\u0435\u043b\u043e\u0447\u0438 \u0441\u0432\u0435\u0440\u0445\u0443:<\/p>\n<p><code><strong>readMask<\/strong><\/code><strong> \u0443\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0439.<\/strong> \u0423 <code>searchContacts<\/code> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c <code>organizations<\/code>, \u0443 <code>otherContacts.search<\/code>\u00a0\u2014 \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 400. \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <code>names<\/code>, <code>emailAddresses<\/code>, <code>phoneNumbers<\/code>, <code>metadata<\/code>.<\/p>\n<p><strong>\u041e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u043e\u00a0\u043f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u043c\u0443 \u043a\u044d\u0448\u0443.<\/strong> \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0442\u0443, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0430\u043a\u0442 \u0435\u0441\u0442\u044c. <a href=\"https:\/\/developers.google.com\/people\/api\/rest\/v1\/people\/searchContacts\" rel=\"noopener noreferrer nofollow\">Google \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442<\/a> \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u043e\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u00a0\u043f\u0443\u0441\u0442\u044b\u043c <code>query<\/code> \u0438 \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c. \u0414\u0430, \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0\u043a\u043e\u0441\u0442\u044b\u043b\u044c. \u041d\u0435\u0442, \u044d\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 9. pageSize \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 10, \u0430\u00a0\u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435<\/h4>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0432\u043e\u0441\u044c\u043c\u043e\u0439, \u043d\u043e\u00a0\u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0443\u043d\u043a\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0442\u0438\u0445\u043e \u043b\u043e\u043c\u0430\u0435\u0442 \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u0443\u00a0\u043c\u0435\u043d\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <strong>\u0432\u0441\u0435<\/strong> \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f\u00a0\u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u00ab\u043b\u0443\u0447\u0448\u0435\u0435\u00bb \u0437\u0430\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u043d\u0435\u043b\u044c\u0437\u044f: \u043f\u0438\u0441\u044c\u043c\u043e \u043d\u0435\u00a0\u0442\u043e\u043c\u0443 \u0418\u0432\u0430\u043d\u043e\u0432\u0443 \u043d\u0435\u00a0\u043e\u0442\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 <code>searchContacts<\/code> \u0431\u0435\u0437\u00a0\u044f\u0432\u043d\u043e\u0433\u043e <code>pageSize<\/code> \u043e\u0442\u0434\u0430\u0451\u0442 <strong>10<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u0410\u00a0\u0432\u00a0\u043e\u0442\u0432\u0435\u0442\u0435 <code>SearchResponse<\/code> \u043d\u0435\u0442 <code>nextPageToken<\/code>\u00a0\u2014 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0443\u00a0\u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0435\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435. \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u00a0\u2014 30, \u0438 \u044d\u0442\u043e \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043b\u043e\u043a.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f\u00bb \u043d\u0430\u00a0\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u043e\u0439 \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u0442\u0438\u0445\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u043e\u0441\u044c \u0432 \u00ab\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 \u0434\u0435\u0441\u044f\u0442\u044c\u00bb. \u041e\u0431\u0435\u0449\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u0434 \u043d\u0435\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0445\u0443\u0436\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u044f.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 10. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 &lt;script&gt; \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0\u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430<\/h4>\n<p>\u042d\u0442\u0430 \u0443\u0436\u0435 \u043d\u0435\u00a0\u043f\u0440\u043e\u00a0\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0430\u00a0\u043f\u0440\u043e\u00a0\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u00a0\u2014 \u0438 \u043e\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0AI\u2011\u0430\u0433\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043c\u0435\u0435\u0442 \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0443, \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0451,\u00a0\u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u043c\u0438\u0448\u0435\u043d\u044c. \u041f\u0438\u0441\u044c\u043c\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0442\u00a0\u043a\u043e\u0433\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0430\u00a0\u043c\u043e\u0434\u0435\u043b\u044c \u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a\u00a0\u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043d\u0435\u043f\u0440\u044f\u043c\u0430\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u043c\u043f\u0442\u0430: \u00ab\u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u044d\u0442\u043e\u0442 \u0442\u0440\u0435\u0434 \u043d\u0430\u00a0\u0430\u0434\u0440\u0435\u0441\u2026\u00bb.<\/p>\n<p>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442\u00a0\u2014 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0435\u043b\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u043c \u00ab\u044d\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u00a0\u043d\u0435\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438\u00bb. \u0421\u0434\u0435\u043b\u0430\u043b. \u041d\u043e\u00a0\u0435\u0441\u0442\u044c \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 HTML \u043a\u00a0\u0442\u0435\u043a\u0441\u0442\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">text = re.sub(r\"&lt;[^&gt;]+&gt;\", \" \", html)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u0433\u0438 \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u044b. \u0410\u00a0\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <code>&lt;script&gt;<\/code> \u0438 <code>&lt;style&gt;<\/code>\u00a0\u2014 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c. \u041f\u0440\u0438\u0447\u0451\u043c \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c\u2011\u0447\u0435\u043b\u043e\u0432\u0435\u043a <strong>\u043d\u0435\u00a0\u0432\u0438\u0434\u0438\u0442<\/strong>: \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0435\u00a0\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442.<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043f\u0440\u0438\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043f\u0438\u0441\u044c\u043c\u0430, \u043d\u043e\u00a0\u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0432\u0438\u0434\u0438\u043c\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<pre><code class=\"python\">def htmlto_text(raw):\u00a0 \u00a0 cleaned = re.sub(r\"&lt;!--.*?--&gt;\", \" \", raw, flags=re.DOTALL)\u00a0 \u00a0 cleaned = re.sub(\u00a0 \u00a0 \u00a0 \u00a0 r\"&lt;(script|style)\\b[^&gt;]*&gt;.*?(?:&lt;\/\\1\\s*&gt;|\\Z)\",\u00a0 \u00a0 \u00a0 \u00a0 \" \",\u00a0 \u00a0 \u00a0 \u00a0 cleaned,\u00a0 \u00a0 \u00a0 \u00a0 flags=re.IGNORECASE | re.DOTALL,\u00a0 \u00a0 )\u00a0 \u00a0 without_tags = re.sub(r\"&lt;[^&gt;]+&gt;\", \" \", cleaned)\u00a0 \u00a0 return re.sub(r\"\\s+\", \" \", html_module.unescape(without_tags)).strip()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u0432\u043e\u0441\u0442 <code>|\\Z<\/code> \u0432\u00a0\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435\u00a0\u2014 \u043d\u0435\u00a0\u043f\u0430\u0440\u0430\u043d\u043e\u0439\u044f. \u0423 <strong>\u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e<\/strong> <code>&lt;script&gt;<\/code> \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043a\u0430\u043a\u00a0\u043a\u043e\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u043f\u044f\u0442\u044c \u043d\u0435\u00a0\u0432\u0438\u0434\u0438\u0442. \u0411\u0435\u0437\u00a0\u044d\u0442\u043e\u0433\u043e \u0445\u0432\u043e\u0441\u0442\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043d\u0435\u00a0\u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430\u00a0\u0431\u044b \u0432\u043e\u043e\u0431\u0449\u0435, \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0443\u0442\u0435\u043a\u043b\u043e\u00a0\u0431\u044b \u0432\u00a0\u0442\u0435\u043b\u043e \u043f\u0438\u0441\u044c\u043c\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b53\/4c0\/94c\/b534c094c9ee3d212aa640d89201366c.png\" alt=\"\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442\u0438\u0440 \u2014 \u043f\u0443\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e\" title=\"\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442\u0438\u0440 \u2014 \u043f\u0443\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e\" width=\"922\" height=\"1644\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b53\/4c0\/94c\/b534c094c9ee3d212aa640d89201366c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b53\/4c0\/94c\/b534c094c9ee3d212aa640d89201366c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442\u0438\u0440\u00a0\u2014 \u043f\u0443\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u043e<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u044f \u043f\u043e\u043c\u0435\u0442\u0438\u043b \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u00a0\u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 MCP: <code>destructive_hint<\/code> \u0443\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438, <code>read_only_hint<\/code> \u0443\u00a0\u0447\u0442\u0435\u043d\u0438\u044f. \u041f\u0440\u043e\u0441\u044c\u0431\u0430 \u0432\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u00a0\u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u044c\u0431\u0430, \u0435\u0451 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u00a0\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u0432\u00a0\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u0430\u00a0\u043b\u0438 \u043f\u0440\u043e\u0437\u0430.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 11. \u0412\u00a0\u0441\u0442\u0430\u0442\u0443\u0441\u0435 Testing \u0442\u043e\u043a\u0435\u043d \u0436\u0438\u0432\u0451\u0442 \u043d\u0435\u0434\u0435\u043b\u044e<\/h4>\n<p>\u041d\u0435\u00a0\u043f\u0440\u043e\u00a0API, \u0430\u00a0\u043f\u0440\u043e\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443\u00a0\u2014 \u043d\u043e\u00a0\u0441\u0442\u043e\u0438\u043b\u0430\u00a0\u0431\u044b \u043c\u043d\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043f\u044f\u0442\u044c \u043e\u0442\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c\u00bb.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u00a0Google Cloud \u043f\u043e\u00a0\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u00a0\u0441\u0442\u0430\u0442\u0443\u0441\u0435 <em>Testing<\/em>. \u0414\u043b\u044f\u00a0\u043d\u0435\u0433\u043e Google \u0432\u044b\u0434\u0430\u0451\u0442 refresh\u2011\u0442\u043e\u043a\u0435\u043d \u0441\u043e \u0441\u0440\u043e\u043a\u043e\u043c \u0436\u0438\u0437\u043d\u0438 <strong>7\u00a0\u0434\u043d\u0435\u0439<\/strong>\u00a0\u2014 \u044d\u0442\u043e <a href=\"https:\/\/developers.google.com\/identity\/protocols\/oauth2\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u0440\u044f\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/strong><\/a>, \u043d\u043e\u00a0\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e \u0430\u0431\u0437\u0430\u0446\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432.<\/p>\n<p>\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (<em>*Publishing status \u2192 In production*<\/em>) \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435. \u0412\u0437\u0430\u043c\u0435\u043d \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0445\u043e\u0434\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u044d\u043a\u0440\u0430\u043d \u00abGoogle hasn&#8217;t verified this app\u00bb \u2192 Advanced \u2192 Go to app. \u0420\u0430\u0437\u043e\u0432\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0442\u0438\u0432 \u0435\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\u00a0\u2014 \u043f\u043e\u2011\u043c\u043e\u0435\u043c\u0443, \u0440\u0430\u0437\u043c\u0435\u043d \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439.<\/p>\n<p>\u0412\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u0430: \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435. \u0414\u043b\u044f\u00a0\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u00a0\u043b\u0438\u043c\u0438\u0442 \u0432 100\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.<\/p>\n<h4>\u0413\u0440\u0430\u0431\u043b\u044f 12. mcp 2.0\u00a0\u0432\u044b\u043a\u0438\u043d\u0443\u043b FastMCP<\/h4>\n<p>\u0423\u0436\u0435 \u043d\u0430\u00a0\u0444\u0438\u043d\u0438\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u044f \u043e\u0431\u043d\u043e\u0432\u0438\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\u00a0\u2014 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0412 <code>mcp 2.0.0<\/code> \u043c\u043e\u0434\u0443\u043b\u044c <code>mcp.server.fastmcp<\/code> \u0443\u0434\u0430\u043b\u0451\u043d. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e <code>mcp.server.MCPServer<\/code>. API \u043f\u043e\u0445\u043e\u0436\u00a0\u2014 \u0442\u043e\u0442\u00a0\u0436\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 <code>@tool()<\/code>, \u0434\u043e\u043a\u0441\u0442\u0440\u0438\u043d\u0433 \u043f\u043e\u2011\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430,\u00a0\u2014 \u043d\u043e\u00a0\u0438\u043c\u043f\u043e\u0440\u0442 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c\u00a0\u0431\u044b\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a <code>\"mcp\"<\/code>, \u0431\u0435\u0437\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043b\u0438\u00a0\u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0PyPI \u043e\u0442\u0434\u0430\u043b \u0432\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0423\u00a0\u043c\u0435\u043d\u044f \u043f\u043e\u00a0\u044d\u0442\u043e\u0439\u00a0\u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u043e\u043b\u0447\u0430 \u0441\u043b\u0451\u0433 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 MCP\u2011\u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u0438 \u043d\u0435\u00a0\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u0439 \u043c\u0435\u0441\u044f\u0446\u0430\u043c\u0438.<\/p>\n<pre><code class=\"python\"># \/\/\/ script# dependencies = [# \u00a0 \"mcp&gt;=2\", \u00a0 \u00a0 \u00a0 \u00a0 \u00a0# \u2190 \u0432\u043e\u0442 \u044d\u0442\u043e# \u00a0 \"google-api-python-client\",# ]# \/\/\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043a\u0443\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0437\u043d\u0430\u044e\u0442 \u0438 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u0442: <strong>\u043f\u0438\u043d\u044c\u0442\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0435\u0440\u0441\u0438\u0439<\/strong>. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043b\u043e\u043c\u0430\u044e\u0442 API.<\/p>\n<p>\u041a\u0430\u043a\u00a0\u044f \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u043b<\/p>\n<p>\u041e\u0431\u0435\u0449\u0430\u043b \u0447\u0435\u0441\u0442\u043d\u043e\u00a0\u2014 \u043f\u0438\u0448\u0443 \u0447\u0435\u0441\u0442\u043d\u043e: \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0434\u0435\u043b\u0430\u043d \u0432\u00a0\u043f\u0430\u0440\u0435 \u0441\u00a0Claude Code, \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0430\u043c \u043f\u043e\u00a0\u0441\u0435\u0431\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u00a0\u0431\u044b\u043b\u0430 \u0442\u0430\u043a\u0430\u044f. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043f\u0435\u043a\u0430\u00a0\u2014 \u0447\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0435\u043c, \u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0435\u043c, \u0433\u0434\u0435 \u0436\u0438\u0432\u0443\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u044b. \u041f\u043e\u0442\u043e\u043c \u043f\u043b\u0430\u043d: 12\u00a0\u0437\u0430\u0434\u0430\u0447, \u0443\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0444\u0430\u0439\u043b\u044b, \u0442\u0435\u0441\u0442\u044b \u0438 \u0448\u0430\u0433\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u043f\u043e\u00a0TDD\u00a0\u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u0441\u0442, \u043f\u043e\u0442\u043e\u043c \u043a\u043e\u0434. \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438\u00a0\u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u2011\u0440\u0435\u0432\u044c\u044e\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0451 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e.<\/p>\n<p><strong>\u0420\u0435\u0432\u044c\u044e \u043d\u0430\u0448\u043b\u043e \u0434\u0435\u0432\u044f\u0442\u044c \u0434\u0435\u0444\u0435\u043a\u0442\u043e\u0432, \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u00a0\u2014 \u0432\u00a0\u043c\u043e\u0451\u043c\u00a0\u0436\u0435 \u043f\u043b\u0430\u043d\u0435.<\/strong> \u041d\u0435\u00a0\u0432\u00a0\u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0441\u0430\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u044b, \u0430\u00a0\u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u044f \u0438\u043c \u043f\u043e\u0440\u0443\u0447\u0438\u043b. \u041c\u0451\u0440\u0442\u0432\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u00a0\u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043d\u0435\u00a0\u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442. \u0423\u0442\u0435\u0447\u043a\u0430 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>doc<\/code> \u0443 <code>JSONDecodeError<\/code>. \u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0431\u043e\u0438. \u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0445\u0435\u043b\u043f\u0435\u0440\u0435, \u0438\u0437\u2011\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0435\u0441\u0442\u0430 \u043f\u0430\u0434\u0430\u043b\u0438 \u043d\u0430\u00a0\u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435.<\/p>\n<p><strong>\u0410\u0433\u0435\u043d\u0442\u044b \u0441\u043f\u043e\u0440\u0438\u043b\u0438\u00a0\u2014 \u0438\u00a0\u0431\u044b\u043b\u0438 \u043f\u0440\u0430\u0432\u044b.<\/strong> \u042f \u043f\u043e\u0440\u0443\u0447\u0438\u043b \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c <code>update_event<\/code> \u043a\u0430\u043a\u00a0\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439: \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0430\u0442\u0447 \u0442\u0435\u043c\u0438\u00a0\u0436\u0435 \u043f\u043e\u043b\u044f\u043c\u0438 \u0434\u0430\u0451\u0442 \u0442\u043e\u00a0\u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f. \u0410\u0433\u0435\u043d\u0442 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b: \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 <code>sendUpdates=\"all\"<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435. \u041f\u043e\u043c\u0435\u0442\u043a\u0430 \u00ab\u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u043b\u044f\u00a0\u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u00ab\u043c\u043e\u0436\u043d\u043e \u043c\u043e\u043b\u0447\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c\u00bb\u00a0\u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u0436\u0438\u0432\u044b\u043c \u043b\u044e\u0434\u044f\u043c. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u043c\u043e\u0435\u0433\u043e, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0430\u0433\u0435\u043d\u0442\u0430 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u00a0\u043a\u043e\u0434\u0435.<\/p>\n<p><strong>\u0421\u0430\u043c\u0430\u044f \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0430 \u043f\u0440\u0438\u0448\u043b\u0430 \u043d\u0435\u00a0\u043e\u0442\u00a0\u0442\u0435\u0441\u0442\u043e\u0432.<\/strong> \u0413\u0440\u0430\u0431\u043b\u044f \u043d\u043e\u043c\u0435\u0440 7\u00a0\u2014 \u0442\u0430, \u0433\u0434\u0435 <code>calendars.get<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u0441\u043a\u043e\u0443\u043f,\u00a0\u2014 \u0432\u044b\u0436\u0438\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 299\u00a0\u0437\u0435\u043b\u0451\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0434\u0432\u0430 \u0440\u0430\u0443\u043d\u0434\u0430 \u0440\u0435\u0432\u044c\u044e. \u0415\u0451 \u043f\u043e\u0439\u043c\u0430\u043b\u0430 \u043f\u0435\u0440\u0432\u0430\u044f\u00a0\u0436\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u00a0\u0436\u0438\u0432\u043e\u0439 Google. \u041d\u0438\u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u043b\u043e\u0432\u044f\u0442 \u043f\u043e\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e: \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u043e\u0439\u043d\u0438\u043a \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442 \u043f\u0440\u043e\u00a0\u043f\u0440\u0430\u0432\u0430.<\/p>\n<p>\u041e\u0449\u0443\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u00a0\u0438\u0442\u043e\u0433\u0443 \u0442\u0430\u043a\u043e\u0435: \u0430\u0433\u0435\u043d\u0442\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u043e, \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043b\u043e\u0432\u044f\u0442 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e. \u041d\u043e\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00ab\u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e\u00bb \u0438 \u00ab\u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00bb \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0441\u044c\u00a0\u2014 \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u043d\u0430\u00a0\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u044b\u0448\u0435, \u0432\u00a0\u0441\u043f\u0435\u043a\u0443 \u0438 \u043f\u043b\u0430\u043d.<\/p>\n<h4>\u0427\u0442\u043e\u00a0\u0432 \u0438\u0442\u043e\u0433\u0435<\/h4>\n<p>\u0412\u043e\u0441\u0435\u043c\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, 300\u00a0\u0442\u0435\u0441\u0442\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/071\/863\/4f6\/0718634f6a8510886f23d72552108790.png\" alt=\"\u0414\u0432\u0435 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0432\u0441\u0451 \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u0435\u0442\u0438: \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 build_mime\" title=\"\u0414\u0432\u0435 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0432\u0441\u0451 \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u0435\u0442\u0438: \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432 build_mime\" width=\"1568\" height=\"1268\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/071\/863\/4f6\/0718634f6a8510886f23d72552108790.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/071\/863\/4f6\/0718634f6a8510886f23d72552108790.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><em>\u0414\u0432\u0435 \u0442\u043e\u0447\u043a\u0438, \u0433\u0434\u0435 \u0432\u0441\u0451 \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u00a0\u0441\u0435\u0442\u0438: \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u00a0build_mime<\/em><\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0431\u043e\u0435\u0432\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e \u0443\u0448\u043b\u043e \u0441\u00a0\u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438\u00a0\u2014 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430 \u0432\u00a0\u0442\u0435\u043c\u0435, \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u0432\u00a0\u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u0432\u0441\u0451 \u043d\u0430\u00a0\u043c\u0435\u0441\u0442\u0435. \u041f\u043e\u0441\u043b\u0435 \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u0433\u0440\u0430\u0431\u043b\u0435\u0439 \u044d\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u0430\u0436\u0435 \u043a\u0430\u043a\u2011\u0442\u043e \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p><a href=\"https:\/\/github.com\/Canados00\/google-workspace-mcp\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u0434 \u043d\u0430\u00a0\u0413\u0438\u0442\u0445\u0430\u0431\u0435<\/a>, MIT, \u0444\u043e\u0440\u043a\u0438 \u0438 issues \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u0435\u043b\u0430\u0435\u0442\u0435 \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435\u00a0\u2014 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043e\u0432\u0435\u0442 \u043d\u0435\u00a0\u043f\u0440\u043e\u00a0Gmail API. \u0417\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u0435\u0431\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u00a0\u0436\u0438\u0432\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <strong>\u0434\u043e<\/strong> \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0434\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041c\u043e\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442, \u0447\u0442\u043e\u00a0\u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 API \u0442\u0430\u043a, \u043a\u0430\u043a\u00a0\u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0438. \u0427\u0442\u043e\u00a0\u0432\u0430\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u00a0\u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0438\u0441.<\/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\/1068140\/\">https:\/\/habr.com\/ru\/articles\/1068140\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e\u00a0\u0436\u0435\u043b\u0430\u043d\u0438\u044f: \u0447\u0442\u043e\u0431\u044b Claude \u043c\u043e\u0433 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0435, \u043d\u0435\u00a0\u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u043c\u0435\u043d\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0431\u0440\u0430\u0443\u0437\u0435\u0440. \u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c\u00a0\u2014 Zapier, \u0432\u0441\u044f\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b. \u041d\u043e\u00a0\u0442\u0430\u043c \u043c\u043e\u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0447\u0443\u0436\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430\u00a0\u043c\u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u0432\u043e\u0439 MCP\u2011\u0441\u0435\u0440\u0432\u0435\u0440: \u043f\u0430\u0440\u0430 \u0441\u043e\u0442\u0435\u043d \u0441\u0442\u0440\u043e\u043a, Gmail API, \u0437\u0430\u00a0\u0432\u0435\u0447\u0435\u0440.\u0412\u0435\u0447\u0435\u0440 \u0440\u0430\u0441\u0442\u044f\u043d\u0443\u043b\u0441\u044f \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u0438 300\u00a0\u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435\u00a0\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u043e\u0436\u043d\u0430\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u043e\u0447\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u0438\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u0435\u043c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043b\u043e\u0447\u044c \u043b\u043e\u043c\u0430\u0435\u0442 \u0432\u0441\u0451 \u043c\u043e\u043b\u0447\u0430 \u0438 \u043d\u0435\u00a0\u0441\u0440\u0430\u0437\u0443.\u0421\u043e\u0431\u0440\u0430\u043b \u0433\u0440\u0430\u0431\u043b\u0438 \u0432\u00a0\u043a\u0443\u0447\u0443. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435\u00a0\u2014 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u0435 \u0441\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0447\u0435\u0440\u043e\u0432.\u0427\u0442\u043e\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 MCP\u2011\u0441\u0435\u0440\u0432\u0435\u0440: \u0432\u043e\u0441\u0435\u043c\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u044b, \u043f\u043e\u0438\u0441\u043a, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0\u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0451\u043c, \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0441\u0432\u043e\u0438\u0445 OAuth\u2011\u043a\u0440\u0435\u0434\u0435\u043d\u0448\u0435\u043b\u0430\u0445, \u0445\u043e\u0434\u0438\u0442 \u0432\u00a0Google \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. \u041f\u0443\u043d\u043a\u0442\u0438\u0440\u00a0\u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u043e\u043d\u0438 \u043d\u0435\u00a0\u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f. server.py \u0442\u043e\u043d\u043a\u0438\u0439\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0432\u0435\u0442. \u0412\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u0436\u0438\u0432\u0451\u0442 \u0432\u00a0\u043f\u0430\u043a\u0435\u0442\u0435 gws \u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0431\u0435\u0437\u00a0\u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 300\u00a0\u0442\u0435\u0441\u0442\u043e\u0432 \u0433\u043e\u043d\u044f\u044e\u0442\u0441\u044f \u0437\u0430\u00a0\u0434\u0435\u0432\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043d\u0435\u00a0\u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442\u00a0\u0442\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u00a0\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 Google.\u0421\u0435\u043a\u0440\u0435\u0442\u044b\u00a0\u2014 refresh\u2011\u0442\u043e\u043a\u0435\u043d \u0438 \u043a\u043b\u044e\u0447\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u00a0\u2014 \u043b\u0435\u0436\u0430\u0442 \u0432\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u00a0\u0434\u0438\u0441\u043a\u0435 \u043d\u0438 \u0444\u0430\u0439\u043b\u0430, \u0432\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u043f\u0443\u0441\u0442\u043e.\u0410\u00a0\u0442\u0435\u043f\u0435\u0440\u044c \u043a\u00a0\u0433\u0440\u0430\u0431\u043b\u044f\u043c.\u0413\u0440\u0430\u0431\u043b\u044f 1. \u041f\u0438\u0441\u044c\u043c\u043e \u0432\u00a0windows-1251\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u0430\u0448\u0443. \u041c\u043e\u043b\u0447\u0430\u0421\u0430\u043c\u0430\u044f \u043a\u043e\u0432\u0430\u0440\u043d\u0430\u044f \u0438\u0437\u00a0\u0432\u0441\u0435\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u043f\u0430\u0434\u0430\u0435\u0442.Gmail API \u043e\u0442\u0434\u0430\u0451\u0442 \u0442\u0435\u043b\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043a\u0430\u043a\u00a0base64\u00a0\u0432\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f. \u041d\u0435\u00a0\u0432\u00a0UTF-8. \u0412\u00a0\u0442\u043e\u0439, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0438\u0441\u044c\u043c\u043e\u00a0\u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e.\u041d\u0430\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:raw = base64.urlsafe_b64decode(data)return raw.decode(\u201cutf-8\u201d, errors=\u201creplace\u201d)\u0418 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0420\u043e\u0432\u043d\u043e \u0434\u043e\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u0438\u0437\u00a0\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u00a0\u0441\u0438\u0445 \u043f\u043e\u0440 \u0448\u043b\u0451\u0442 \u0432 windows-1251. \u0422\u0430\u043a\u0438\u0445 \u0432\u00a0\u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442\u00a0\u2014 \u043b\u0435\u0433\u0430\u0441\u0438\u2011MTA, \u0441\u0442\u0430\u0440\u044b\u0435 CRM, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u0441\u0438\u0441\u0442\u0435\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u043c \u0441\u00a0\u043c\u0435\u043d\u044f.\u0417\u0430\u043c\u0435\u0440\u0438\u043b \u043d\u0430\u00a0\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435: \u0438\u0437 41\u00a0\u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b 34\u00a0\u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u0432 U+FFFD. \u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0440\u043e\u043c\u0431\u0438\u043a \u0441\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043f\u0438\u0441\u044c\u043c\u0430 \u0441\u0442\u0430\u043b \u043c\u0443\u0441\u043e\u0440\u043e\u043c, \u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0442\u0447\u0438\u0442\u0430\u043b\u0441\u044f, \u0447\u0442\u043e\u00a0\u0432\u0441\u0451 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b.\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00a0\u2014 \u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u0438\u0437 Content-Type \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438:def partcharset(part):\u00a0 \u00a0 for header in part.get(&#171;headers&#187;, []):\u00a0 \u00a0 \u00a0 \u00a0 if header.get(&#171;name&#187;, &#171;&#187;).lower() == &#171;content-type&#187;:\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 match = re.search(\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 r&#8217;charset\\s*=\\s*&#187;?([\\w.-]+)&#187;?&#8217;, header.get(&#171;value&#187;, &#171;&#187;), re.IGNORECASE\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 )\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if match:\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return match.group(1)\u00a0 \u00a0 return &#171;utf-8&#8243;def decodepart(part):\u00a0 \u00a0 data = part.get(&#171;body&#187;, {}).get(&#171;data&#187;)\u00a0 \u00a0 if not data:\u00a0 \u00a0 \u00a0 \u00a0 return &#171;&#187;\u00a0 \u00a0 raw = base64.urlsafe_b64decode(data)\u00a0 \u00a0 try:\u00a0 \u00a0 \u00a0 \u00a0 return raw.decode(_part_charset(part), errors=&#187;replace&#187;)\u00a0 \u00a0 except LookupError:\u00a0 \u00a0 \u00a0 \u00a0 # \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 \u2014 \u043d\u0435 \u0440\u043e\u043d\u044f\u0435\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0438\u0441\u044c\u043c\u0430 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e\u00a0 \u00a0 \u00a0 \u00a0 return raw.decode(&#171;utf-8&#8243;, errors=&#187;replace&#187;)LookupError \u0442\u0443\u0442 \u043d\u0435\u00a0\u0434\u043b\u044f\u00a0\u043a\u0440\u0430\u0441\u043e\u0442\u044b: \u0432\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f. \u041f\u0430\u0434\u0430\u0442\u044c \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u00a0\u0447\u0442\u0435\u043d\u0438\u0438 \u043f\u0438\u0441\u044c\u043c\u0430\u00a0\u2014 \u043f\u043b\u043e\u0445\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u043d.\u0413\u0440\u0430\u0431\u043b\u044f 2. \u0422\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0439. \u042f\u00a0\u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e\u00a0\u0443\u0436 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\u2011\u0442\u043e Gmail API \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u043e\u2011\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438.\u041d\u0435\u00a0\u043e\u0442\u0434\u0430\u0451\u0442. Subject \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0432\u00a0\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432\u00a0\u043a\u0430\u043a\u043e\u043c \u0435\u0433\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c. \u0410\u00a0\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u043d\u0430\u00a0\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435, \u0448\u043b\u0451\u0442 \u043f\u043e\u00a0RFC 2047:=?utf-8?B?0KLQtdC80LAg0L\/QuNGB0YzQvNCw?=\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u00a0\u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u00ab\u0422\u0435\u043c\u0430 \u043f\u0438\u0441\u044c\u043c\u0430\u00bb. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438:from email.errors import HeaderParseErrorfrom email.header import decode_header, make_headerdef decodeheader_value(value):\u00a0 \u00a0 &#171;&#187;&#187;\u0420\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 RFC 2047. \u041e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0441\u0442\u044c.&#187;&#187;&#187;\u00a0 \u00a0 if not value or &#171;=?&#187; not in value:\u00a0 \u00a0 \u00a0 \u00a0 return value\u00a0 \u00a0 try:\u00a0 \u00a0 \u00a0 \u00a0 return str(make_header(decode_header(value)))\u00a0 \u00a0 except (UnicodeDecodeError, LookupError, ValueError, HeaderParseError):\u00a0 \u00a0 \u00a0 \u00a0 return value\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 HeaderParseError \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435. \u042f \u0435\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043b\u00a0\u2014 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e ValueError \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, email.errors.HeaderParseError \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 MessageError, \u0430\u00a0\u043d\u0435\u00a0\u043e\u0442 ValueError, \u0438 \u0431\u0438\u0442\u044b\u0439 base64\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 =?utf-8?B?&#8230;?= \u043f\u0440\u043e\u043b\u0435\u0442\u0430\u043b \u043c\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430.\u0413\u0440\u0430\u0431\u043b\u044f 3. \u0420\u0443\u0441\u0441\u043a\u0438\u0439 Outlook \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u00ab\u041e\u0442\u0432\u0435\u0442:\u00bb, \u0430\u00a0\u043d\u0435 \u00abRe:\u00bb\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u00ab\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Re: \u043a\u00a0\u0442\u0435\u043c\u0435, \u0435\u0441\u043b\u0438 \u0435\u0433\u043e \u0435\u0449\u0451 \u043d\u0435\u0442\u00bb:if subject.lower().startswith(&#171;re:&#187;):\u00a0 \u00a0 return subjectreturn f&#187;Re: {subject}&#187;\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0435. \u041f\u043e\u043a\u0430 \u0432\u0430\u043c \u043d\u0435\u00a0\u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438\u0437\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e Outlook, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u00ab\u041e\u0442\u0432\u0435\u0442:\u00bb. \u0427\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u0435\u043c\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:Re: \u041e\u0442\u0432\u0435\u0442: Re: \u041e\u0442\u0432\u0435\u0442: \u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430\u041f\u043b\u044e\u0441 \u0431\u043e\u043d\u0443\u0441: \u0432\u0435\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u043e\u0431\u0435\u043b \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. &#187; \u00a0Re: \u0422\u0435\u043c\u0430&#187; \u043d\u0435\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 re:, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441.\u00bbREPLY_PREFIXES = (&#171;re:&#187;, &#171;\u043e\u0442\u0432\u0435\u0442:&#187;, &#171;\u0440\u0435:&#187;, &#171;fwd:&#187;, &#171;fw:&#187;, &#171;\u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0430:&#187;)def reply_subject(subject):\u00a0 \u00a0 stripped = subject.strip()\u00a0 \u00a0 lowered = stripped.lower()\u00a0 \u00a0 if any(lowered.startswith(prefix) for prefix in REPLY_PREFIXES):\u00a0 \u00a0 \u00a0 \u00a0 return stripped\u00a0 \u00a0 return f&#187;Re: {stripped}&#187;\u0413\u0440\u0430\u0431\u043b\u044f 4. \u0417\u0430\u043f\u044f\u0442\u0430\u044f \u0432\u00a0\u0438\u043c\u0435\u043d\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f \u0432\u00a0\u0434\u0432\u0443\u0445\u0418\u0437\u00a0\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 \u0430\u0434\u0440\u0435\u0441 \u0447\u0430\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u00a0\u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;\u041f\u043e\u00a0RFC 5322\u00a0\u0437\u0430\u043f\u044f\u0442\u0430\u044f\u00a0\u2014 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432\u00a0\u0441\u043f\u0438\u0441\u043a\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0440\u0441\u0435\u0440 \u0447\u0435\u0441\u0442\u043d\u043e \u0432\u0438\u0434\u0438\u0442 \u0437\u0434\u0435\u0441\u044c \u0434\u0432\u0443\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439: \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0418\u0432\u0430\u043d\u043e\u0432 \u0431\u0435\u0437\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;.\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043b:&gt;&gt;&gt; getaddresses([&#171;\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d &lt;ivan@example.com&gt;&#187;])[(&#187;, &#8216;\u0418\u0432\u0430\u043d\u043e\u0432&#8217;), (&#8216;\u0418\u0432\u0430\u043d&#8217;, &#8216;ivan@example.com&#8217;)]\u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f:\u00a0\u043b\u0438\u0431\u043e Gmail \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400,\u00a0\u043b\u0438\u0431\u043e\u00a0\u2014 \u0447\u0442\u043e\u00a0\u0445\u0443\u0436\u0435\u00a0\u2014 \u043f\u0438\u0441\u044c\u043c\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u00a0\u0442\u043e\u043c\u0443, \u043a\u043e\u043c\u0443 \u0432\u044b \u0434\u0443\u043c\u0430\u043b\u0438.\u0424\u043e\u0440\u043c\u0430\u0442 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u0435\u043d \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u00ab\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u00bb \u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u044b\u0445\u043e\u0434\u00a0\u2014 \u043d\u0435\u00a0\u043c\u043e\u043b\u0447\u0430\u0442\u044c:for name, address in parsed:\u00a0 \u00a0 if not address or &#171;@&#187; not in address:\u00a0 \u00a0 \u00a0 \u00a0 broken = f&#187;{name} &lt;{address}&gt;&#187;.strip() if name else address\u00a0 \u00a0 \u00a0 \u00a0 raise ValueError(\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 f&#187;\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f: {broken}. &#187;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#171;\u0415\u0441\u043b\u0438 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0430\u044f, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0430\u0432\u044b\u0447\u0438\u0442\u044c: &#187;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &#8216;&#187;\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d&#187; &lt;ivan@example.com&gt;&#8217;\u00a0 \u00a0 \u00a0 \u00a0 )\u0417\u0430\u043a\u0430\u0432\u044b\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#171;\u0418\u0432\u0430\u043d\u043e\u0432, \u0418\u0432\u0430\u043d&#187; &lt;ivan@example.com&gt; \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u00a0\u2014 \u044d\u0442\u043e \u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044c: \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 formataddr \u043d\u0435\u043b\u044c\u0437\u044f. \u041e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 ASCII \u0432\u00a0\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 \u043d\u0430\u00a0\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u0441 UnicodeEncodeError, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043d\u0430\u00a0\u043c\u0438\u043d\u0443\u0442\u043e\u0447\u043a\u0443, \u0442\u043e\u0436\u0435 ValueError. \u0423\u00a0\u043c\u0435\u043d\u044f \u0438\u0437\u2011\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442 \u043d\u0430 \u00ab\u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441\u00bb \u043a\u0430\u043a\u043e\u0435\u2011\u0442\u043e \u0432\u0440\u0435\u043c\u044f\u00a0\u0431\u044b\u043b \u0437\u0435\u043b\u0451\u043d\u044b\u043c, \u043b\u043e\u0432\u044f \u043d\u0435\u00a0\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443. \u041c\u043e\u0440\u0430\u043b\u044c: pytest.raises(ValueError) \u0431\u0435\u0437\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430\u00a0\u2014 \u043d\u0435\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.\u0413\u0440\u0430\u0431\u043b\u044f 5. Bcc \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043f\u0438\u0441\u044c\u043c\u0435. \u0414\u0430, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0422\u0443\u0442 \u044f \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u0447\u0443\u0442\u044c \u043d\u0435\u00a0\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u043b, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u0438\u0437\u00a0\u043b\u0443\u0447\u0448\u0438\u0445 \u043f\u043e\u0431\u0443\u0436\u0434\u0435\u043d\u0438\u0439.\u041a\u043e\u0433\u0434\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0448\u044c MIME \u0440\u0443\u043a\u0430\u043c\u0438, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a Bcc \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a\u00a0\u044f\u0432\u043d\u0430\u044f \u0443\u0442\u0435\u0447\u043a\u0430: \u043e\u043d\u00a0\u0436\u0435 \u0443\u0435\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e, \u0438 \u0432\u0441\u0435 \u0443\u0432\u0438\u0434\u044f\u0442 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u043e\u043f\u0438\u0438. \u0420\u0443\u043a\u0430 \u0442\u044f\u043d\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c.\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0414\u043b\u044f\u00a0Gmail API Bcc \u0432\u00a0raw\u2011\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438\u00a0\u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043a\u0440\u044b\u0442\u0443\u044e \u043a\u043e\u043f\u0438\u044e. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u044f\u043c\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f\u043c \u0438\u0437\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 To, Cc \u0438 Bcc. Gmail \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0439 MSA \u0438 \u0441\u0430\u043c \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u043e\u0439.\u0422\u043e \u0435\u0441\u0442\u044c \u00ab\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u00a0\u0431\u044b \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u00a0\u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0438\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442. \u041f\u0440\u0438\u0447\u0451\u043c \u043c\u043e\u043b\u0447\u0430\u00a0\u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0432\u0438\u0434\u0438\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 API.\u0412\u00a0\u043a\u043e\u0434\u0435 \u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u043e\u0438\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0430\u00a0\u043f\u044f\u0442\u044c \u0441\u0442\u0440\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a (\u0438\u043b\u0438 \u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430) \u043d\u0435 \u00ab\u043f\u043e\u0447\u0438\u043d\u0438\u043b\u00bb \u044d\u0442\u043e \u0441\u043d\u043e\u0432\u0430.\u0413\u0440\u0430\u0431\u043b\u044f 6. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c \u043d\u0435\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0434\u0430\u0442\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b, \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u0447\u0442\u044b. \u0410\u0433\u0430.\u041f\u0440\u043e\u0441\u0438\u0442\u0435 \u00ab\u0432\u0441\u0442\u0440\u0435\u0447\u0443 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c 6\u00a0\u0430\u0432\u0433\u0443\u0441\u0442\u0430\u00bb\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c start.date = 2026-08-06 \u0438 end.date = 2026-08-06. Google \u043d\u0430\u00a0\u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 400\u00a0\u0441 reason: timeRangeEmpty.\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e end.date \u0443\u00a0\u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u00a0\u0432\u0435\u0441\u044c \u0434\u0435\u043d\u044c\u00a0\u2014 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430\u00a0\u043e\u0434\u0438\u043d \u0434\u0435\u043d\u044c \u044d\u0442\u043e start = 2026-08-06, end = 2026-08-07.\u0415\u0441\u043b\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u043d\u043e\u00a0\u0441\u0434\u0432\u0438\u0433 \u043d\u0435\u00a0\u0441\u0434\u0435\u043b\u0430\u043d, \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442\u00a0\u2014 \u0431\u0443\u0434\u0435\u0442 \u0442\u0438\u0445\u0430\u044f \u043f\u043e\u0442\u0435\u0440\u044f \u0434\u043d\u044f: \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0441 6-\u0433\u043e \u043f\u043e 8-\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0432\u0435\u0447\u0435\u0440\u043e\u043c 7-\u0433\u043e.def shiftall_day_end(body):\u00a0 \u00a0 start_date = body.get(&#171;start&#187;, {}).get(&#171;date&#187;)\u00a0 \u00a0 end_date = body.get(&#171;end&#187;, {}).get(&#171;date&#187;)\u00a0 \u00a0 if start_date and end_date:\u00a0 \u00a0 \u00a0 \u00a0 shifted = datetime.date.fromisoformat(end_date) + datetime.timedelta(days=1)\u00a0 \u00a0 \u00a0 \u00a0 body[&#171;end&#187;][&#171;date&#187;] = shifted.isoformat()\u00a0 \u00a0 return body\u0418 \u0441\u0440\u0430\u0437\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043c\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0430\u043c: \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442 body, \u0430\u00a0\u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0435\u0451 create_event \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u0430 \u0432\u00a0\u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432. \u041f\u0440\u0438 429\u00a0\u043e\u0442\u00a0Google \u043f\u043e\u0432\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043d\u043e\u0432\u043e \u0441\u00a0\u0442\u0435\u043c\u00a0\u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c\u00a0\u2014 \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u0443\u044e \u0434\u0430\u0442\u0443 \u0435\u0449\u0451 \u043d\u0430\u00a0\u0434\u0435\u043d\u044c. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043e\u043b\u0447\u0430 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430\u00a0\u0441\u0443\u0442\u043a\u0438, \u043f\u0440\u0438\u0447\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u00a0Google \u0438\u043a\u043d\u0443\u043b\u043e\u0441\u044c.\u041b\u0435\u0447\u0438\u0442\u0441\u044f \u043a\u043e\u043f\u0438\u0435\u0439 \u043d\u0430\u00a0\u0432\u0445\u043e\u0434\u0435:@with_retriesdef create_event(body, calendar_id=&#187;primary&#187;, add_meet=False):\u00a0 \u00a0 body = copy.deepcopy(body)\u00a0 \u00a0 shiftall_day_end(body)\u00a0 \u00a0 &#8230;\u041c\u043e\u0440\u0430\u043b\u044c \u043e\u0431\u0449\u0430\u044f: \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u0430 \u0432\u00a0retry, \u043e\u043d\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u0430\u00a0\u0431\u044b\u0442\u044c \u0447\u0438\u0441\u0442\u043e\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0418\u043d\u0430\u0447\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435 \u00ab\u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437\u00bb, \u0430 \u00ab\u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438\u00bb.\u0413\u0440\u0430\u0431\u043b\u044f 7. \u0421\u043a\u043e\u0443\u043f calendar.events \u043d\u0435\u00a0\u0434\u0430\u0451\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c\u0412\u043e\u0442 \u044d\u0442\u0443 \u044f \u043f\u043e\u0439\u043c\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0436\u0438\u0432\u043e\u043c \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 299\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u00a0\u0431\u044b\u043b\u0438 \u0437\u0435\u043b\u0451\u043d\u044b\u043c\u0438.\u041c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u0430 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u00ab\u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432 15:00\u00bb \u0431\u0435\u0437\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430\u00a0\u043d\u0435\u00a0\u0432\u00a0UTC. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431:info = service.calendars().get(calendarId=&#187;primary&#187;).execute()timezone = info.get(&#171;timeZone&#187;, &#171;UTC&#187;)\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043a\u043e\u0443\u043f calendar \u0438\u043b\u0438 calendar.readonly, \u0430\u00a0\u044f \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 calendar.events\u00a0\u2014 \u043f\u043e\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00ab\u0431\u0435\u0440\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0443\u0436\u043d\u043e\u00bb. \u0412\u00a0\u043e\u0442\u0432\u0435\u0442:403\u00a0insufficientPermissions: Request had insufficient authentication scopes.\u041f\u0440\u0438\u0447\u0451\u043c calendars.get \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 Calendars, \u0430 calendar.events \u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0440\u0435\u0441\u0443\u0440\u0441\u0443 Events. \u0420\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0430\u00a0\u2014 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u0448\u044c, \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0435\u0448\u044c.\u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435: calendar_timezone() \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0432 create_event \u0438 update_event. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u00a0\u0431\u044b\u043b \u043c\u0451\u0440\u0442\u0432, \u0430\u00a0\u0442\u0435\u0441\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u00a0\u0432\u0438\u0434\u0435\u043b\u0438\u00a0\u2014 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u043e\u0439\u043d\u0438\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430\u00a0\u043b\u044e\u0431\u043e\u0439 \u0432\u044b\u0437\u043e\u0432, \u0435\u043c\u0443 \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0430 \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 Google.\u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043d\u0435\u00a0\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c: events.list \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0437\u043e\u043d\u0443 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u0432\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441 calendar.events.response = service.events().list(\u00a0 \u00a0 calendarId=calendar_id, maxResults=1, singleEvents=True).execute()timezone = response.get(&#171;timeZone&#187;, &#171;UTC&#187;)\u0412\u044b\u0432\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f &#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-490223","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490223","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=490223"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490223\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=490223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=490223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=490223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}