+
    0°¿jэ  ã                   óp  € R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	 ]	! ]
4      P                  4       P                  t]P                  P                  t]R,          t]R,          t]R,          t]R,          R,          t]R	,          R
,          t]R	,          R,          R,          t]P*                  ! 4       P-                  4       t^
tR t]! ]R,          R,          R4      t]! ]R,          R4      tR tR tR tR tR t R t!R t"/ t#R t$R t%R t&R t'R t(. R!Ot)R t*R t+],R 8X  d   ]-! ]+! 4       4      hR# )"uÛ  Единый экран семантики: строка на каждый одобренный ключ ядра.

Черновик 30.09.2026, написан без запуска (оболочка сессии мертва: исчерпана
квота на /tmp, разбор в материалы/разбор-видео-2026-09-30/план-сборки.md).
Перед первым применением - сухой прогон:
    python3 панель/данные/обновить-ключи.py --сухой

Зачем. Задача руководителя из видео 30.09.2026: выработка семантики должна
быть видна в одном месте - «ключ → статья → позиция», а не «отдельно ядро,
отдельно вышедшие статьи». Этот скрипт собирает единственный источник для
всего экрана: и для таблицы ключей в SEO → Аналитика, и для плиток
выработки, и для среза «Порядок работы» во вкладке ядра. Раньше каждый
из них считал бы ключи сам, и они разошлись бы, как разошлись витрина
и панель в сентябре.

Главное правило, из-за которого всё это и делается (решение по ревью плана
30.09.2026): **ключ считается закрытым только если его фраза реально вошла
в текст** - статьи портала или опубликованного материала площадки. Иначе
одна статья кластера А1 «закрыла» бы 59 ключей разом, и плитка врала бы
ровно так, как руководитель жаловался на «265 ключевиков». Ключ, который
в текст не вошёл, попадает в один из двух рабочих списков - «дописать
в статью» или «нужна своя статья», - и это разные задачи, см. функцию
«состояние».

Что считается по каждому ключу:
  тема словами, код кластера, приоритет, показы Wordstat, интент;
  статья портала кластера и вошёл ли ключ в её текст (и куда именно);
  индекс Яндекса и Google по этой странице;
  позиция Google - по парам «страница-запрос» из Search Console;
  позиция Яндекса - из популярных запросов хоста, с пометкой «по хосту»:
    связку «страница-запрос» Вебмастер не отдаёт;
  площадки - сколько опубликованных материалов взяли ключ в шапку
    и лучшая позиция площадки в Яндексе (первая сотня, Google не меряем);
  раскрытие статьи - запросов всего по данным Google, из них ключей ядра.

Чего здесь намеренно нет: своего сравнения фразы с текстом (оно одно на всех,
в семантика/ключ_в_тексте.py), своего определения индексации и своего счёта
материалов площадок - эти функции берутся из обновить-расход-ядра.py через
importlib, чтобы два экрана не считали по-разному.

Зависимость от шага 3 плана: поле «ключи» в реестре текстов. Пока реестр его
не читает, скрипт берёт ключи прямо из шапки материала - поэтому его можно
прогнать и проверить до правки реестра, а после правки он сам начнёт брать
готовое поле.

Запуск:
  python3 панель/данные/обновить-ключи.py --сухой   # показать сводку и сверки
  python3 панель/данные/обновить-ключи.py           # записать keys.json
Место в панель/сборщики.sh: после обновить-расход-ядра.py и обновить-позиции.py,
до обновить-карточки-статей.py и обновить-фолбэк.py (фолбэк вшивает копию
данных в страницу, поэтому он последний).
N)Údate)ÚPathz	keys.jsonzsemantics.jsonzpositions.jsonu   семантикаu   ядро.jsonu
   заводu    реестр-текстов.jsonõ   вебмастерu   историяc                 ó¸   € \         P                  P                  W4      p\         P                  P                  V4      pVP                  P                  V4       V# )N)Ú	importlibÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)ô   путьô   имяô   спецô   мs   &&  ô   обновить-ключи.pyô   _модульr   M   sA   € Ü�~‰~×5Ñ5°fÓG€HÜ	�‰×	(Ñ	(¨Ó	2€BØ‡O�O×Ñ Ô#Ø€Ió    u   ключ_в_тексте.pyõ   ключ_в_текстеu)   обновить-расход-ядра.pyu   расход_ядраc                ó¢   € T ;'       g    RP                  4       P                  4       P                  RR4      p\        P                  ! RRV4      # )uu   Одна форма записи запроса: регистр и «ё» не считаются различием.Ú u   ёu   еz\s+Ú )ÚstripÚlowerÚreplaceÚreÚsub)ô
   фразаô   тs   & r   ô
   нормаr   X   sA   € à
×
Ð
˜×	!Ñ	!Ó	#×	)Ñ	)Ó	+×	3Ñ	3°D¸$Ó	?€BÜ�6Š6�&˜#˜rÓ"Ð"r   c                 óü   € \         P                  ! R RT ;'       g    RP                  4       P                  4       4      p\         P                  ! RRV4      pVP	                  R4      P                  R4      ^ ,          # )z
^https?://r   z^www\.Ú/Ú?)r   r   r   r   ÚrstripÚsplit)ô
   адресô   аs   & r   ô   адрес_нормаr&   ^   s^   € Ü	�Š�˜r J×$4Ð$4°"×#;Ñ#;Ó#=×#CÑ#CÓ#EÓ	F€BÜ	�Š�	˜2˜rÓ	"€BØ�9‰9�S‹>×Ñ Ó$ QÕ'Ð'r   c                 óx   € \        T ;'       g    R 4      P                  R4      P                  R^4      R,          # )r   r    éÿÿÿÿ)Ústrr"   Úrsplit)r$   s   &r   ô   слаг_изr+   d   s2   € Üˆz×Ð˜RÓ ×'Ñ'¨Ó,×3Ñ3°C¸Ó;¸BÕ?Ð?r   c                 óJ  € \         P                  4       '       d   \        \         P                  R4      4      M. p \	        V 4       FA  p \
        P                  ! VP                  RR7      4      pTP                  R4      f   K?  Tu # 	  / #   \        \        3 d     K[  i ; i)u€   Последний снимок Вебмастера: запросы хоста с позицией (до 500 за 14 дней).z*.jsonúutf-8©Úencodingõ   строки)ô   ВЕБМАСТЕРÚexistsÚsortedÚglobÚreversedÚjsonÚloadsÚ	read_textÚOSErrorÚ
ValueErrorÚget)ô   снимкиr   ô   дs      r   ô   свежий_вебмастерr>   j   s�   € ä@R×@YÑ@Y×@[Ò@[”6Ô,×1Ñ1°(Ó;Ô<Ðac€LÜ˜\Ö*ˆð	Ü—’˜H×.Ñ.¸Ð.Ó@ÓAˆBð �6‰6�.Ó!Ô-ØŠIñ +ð €Iøô	 œÐ$ô 	Úð	ús   Á
&BÂB"Â!B"c           	     ór  € / pT ;'       g    / P                  R4      ;'       g    .  F‹  p\        VP                  R4      4      pVP                  V4      pVP                  R4      pVe!   Vf   KI  VR,          e   WTR,          8  g   Kc  RVRVP                  R4      RVP                  R4      /W&   K�  	  V# )ub   {запрос: {позиция, показы, клики}} из снимка Вебмастера.r0   õ   запросõ   позицияõ   показыõ
   клики)r;   r   )ô   снимокô   итогô   сr   ô   еслиô   позs   &     r   ô   запросы_хостаrI   w   sÌ   € à€HØ×!Ð!˜r×&Ñ& ~Ó6×<Ð<¸"Ò<ˆÜ˜BŸF™F >Ó2Ó3ˆØ—<‘< Ó'ˆØ—‘Ð(Ó)ˆàÒ Ô 2¸ÐAQÕ8RÒ8ZÐ^dð  qAõ  hBö  _BØ 0°&¸.È"Ï&É&ÐQ_ÓJ`ÐbnÐpr×pvÑpvð  xDó  qEð   FˆHÓñ =ð €Or   c                 ód  € \         P                  ! \        P                  RR7      4      p / . r!V P	                  R4      ;'       g    .  EFá  p\        VP	                  R4      ;'       g    R4      pVP                  4       pVP	                  R4      R8X  Ed   RV9  g   R	V9   d   K_  \        VP	                  R
4      ;'       g    R4      P                  4       P                  4       R8X  d   K¦  TP                  RVP	                  R4      ;'       g    RRVP	                  R4      ;'       g    RP                  4       RVP	                  R4      ;'       g    RRVP	                  R4      ;'       g    RRVP	                  R4      ;'       g    RR\        V4      /4       EKZ  RV9  d   EKd  \        P                  ! RV4      pVP	                  R4      ;'       g    RP                  4       pRVP	                  R4      ;'       g    RRVP	                  R4      ;'       g    RP                  R4      RVP	                  R4      ;'       g    RRVP	                  R4      ;'       ga    VP	                  R4      ;'       g    RP                  R4      '       d/   RVP	                  R4      ;'       g    RP                  R4       R2MRRV'       d   VP                  ^4      MRRV/pVP	                  V4      p	V	e-   VR,          ;'       g    RV	R,          ;'       g    R8  g   EKÝ  W�V&   EKä  	  W3# )uz   Статьи портала и материалы площадок из реестра, с ключами из шапок.r-   r.   u   текстыu   статусr   u   видu   внешняя площадкаu   опубликованu   не видноu   видно_читателюu   даu   нетõ   файлõ   кластерõ   площадкаõ   ссылкаõ   заголовокõ
   ключиu,   опубликовано на порталеz(\d{4}-\d{2}-\d{2})õ   слагr    zhttps://frantlas.ru/statya/õ
   вышлаNÚ9999)r6   r7   ô   РЕЕСТРr8   r;   r)   r   r   Úappendô   ключи_текстаr   ÚsearchÚgroup)
r=   ô   порталô   площадкиr   ô   статусô   нижнийr   ô   кластерô   записьrG   s
             r   ô   тексты_реестраr_   „   sÉ  € ä	�Š”L×*Ñ*°GÐ*Ó<Ó	=€BØ%'¨Ð"Ø�f‰f�^Ó$×*Ð*¨Ó*ˆÜ˜2Ÿ6™6 .Ó1×7Ð7°RÓ8ˆØ#×)Ñ)Ó+ˆØ�6‰6�(ÓÐ@Õ@Ø'¨|Ô;Ð?PÐT`Ô?`ÙÜ�2—6‘6Ð7Ó8×BÐB¸FÓC×IÑIÓK×QÑQÓSÐW_Ô_ÙØ×#Ñ#Ø˜BŸF™F :Ó.×4Ð4°"Ø  2§6¡6Ð*:Ó#;×#AÐ#A¸r×"HÑ"HÓ"JØ" B§F¡FÐ+=Ó$>×$DÐ$DÀ"Ø §¡ ~Ó 6× <Ð <¸"Ø$ b§f¡fÐ-AÓ&B×&HÐ&HÀbØÔ5°bÓ9ð%ô ò Ø9ÀÔMÚÜ�YŠYÐ-¨|Ó<ˆØŸ&™&Ð!1Ó2×8Ð8°b×?Ñ?ÓAˆà˜Ÿ™˜zÓ*×0Ð0¨bØ˜Ÿ™ 
Ó+×1Ð1¨r×8Ñ8¸Ó=Ø  "§&¡&Ð)=Ó">×"DÐ"DÀ"ð
 ˜BŸF™F >Ó2÷ Bð Bà—F‘F˜:Ó&×,Ð,¨"×3Ñ3°C×8Ò8ð .¨r¯v©v°jÓ/A×/GÐ/GÀR×.NÑ.NÈsÓ.SÐ-TÐTUÑVØ>@Ø¯˜"Ÿ(™( 1œ+°Ø˜nð
ˆð  ×#Ñ# NÓ3ˆØÒ ¨\Õ :× DÐ D¸fÈÐR^ÕI_×IiÐIiÐci×jØ+7˜Ô(ñM +ðN Ð)Ð)r   c                ó   € V P                  R4      p\        V\        4      '       dK   V Uu. uF=  p\        V4      P	                  4       '       g   K$  \        V4      P	                  4       NK?  	  up# \        V\        4      '       d]   VP	                  4       '       dG   VP                  R4       Uu. uF*  q"P	                  4       '       g   K  VP	                  4       NK,  	  up# \        V P                  R4      ;'       g    R,          pVP                  4       '       g   . # \        P                  ! RVP                  RR7      \        P                  R7      pV'       g   . # VP                  ^4      P                  4        Fy  pVP                  R	4      '       g   K  VP                  R
^4      ^,          P                  R4       Uu. uF*  q"P	                  4       '       g   K  VP	                  4       NK,  	  upu # 	  . # u upi u upi u upi )uò   Ключи материала: из реестра, если он их уже читает (шаг 3 плана),
иначе прямо из шапки файла - тогда скрипт работает и до правки реестра.rP   Ú,rK   r   z^---\n(.*?)\n---\nr-   r.   )Úflagsu   ключи:Ú:)r;   Ú
isinstanceÚlistr)   r   r#   ô   КОРЕНЬÚis_filer   Úmatchr8   ÚSrX   Ú
splitlinesÚ
startswith)r   ô   знô   кr   ô
   шапкаô   строкаs   &     r   rV   rV   ²   sw  € ð �6‰6�,Ó€DÜ�$œ×ÒÙ*.ÓB©$ B´#°b³'·-±-·/””�B“—‘–©$ÑBÐBÜ�$œ×Ò §¡§¢Ø%)§Z¡Z°¤_ÓC¡_˜r¿¹¿
”
�—‘–
¡_ÑCÐCÜ˜rŸv™v jÓ1×7Ð7°RÕ8€HØ×Ñ×ÒØˆ	Ü—’Ð/°×1CÑ1CÈWÐ1CÓ1UÔ]_×]aÑ]aÔb€JßØˆ	Ø"×(Ñ(¨Ó+×6Ñ6Ö8ˆØ×"Ñ" =×1Ô1Ø)5×);Ñ);¸CÀÓ)CÀAÕ)F×)LÑ)LÈSÔ)QÓ`Ñ)Q 2×U]ÑU]×U_”J�B—H‘H–JÑ)QÑ`Ò`ñ 9ð €Iùò CùâCùò as#   ¬!HÁHÂ1HÃHÇHÇ$Hc                óà   € V \         9  dX   \        V ,          pVP                  4       '       d   VP                  RR7      MRpRVR\        P                  V4      /\         V &   \         V ,          # )uX   Текст без frontmatter и служебной шапки «> ...», с кэшем.r-   r.   r   õ   полныйõ   тело)ô	   _телаrf   rg   r8   ô   _правилоô   тело_без_шапки)ô   файлr   ô
   сыроеs   &  r   ô   телоrx   É   sb   € à”yÔ Ü (Õ*ˆØ=E×=MÑ=M×=OÒ=O�X×'Ñ'°Ð'Ô9ÐUWˆ
Ø-¨z¸:Ä×GqÑGqÐr|ÓG}Ð~Œ	�(ÑÜ�XÕÐr   c                 ó~  € \         P                  4       '       g   / # \        P                  ! \         P	                  RR7      4      p / pV P                  R4      ;'       g    .  FÕ  pVP                  R4      '       g   VP                  R4      R8w  d   K2  VP                  R4      pV'       d   VR8X  d   KT  VP                  \        VP                  R	4      4      . 4      P                  R
VP                  R
4      R\        V4      RVP                  R4      ;'       g    RRVP                  R4      /4       K×  	  V# )us   {запрос: [{позиция, адрес, площадка, замер}]} из замеров контура PR.r-   r.   r0   õ   демоu   контурÚPRõ   страницаu   —r@   rA   õ
   адресrM   r   õ
   замер)
ô   ПОЗИЦИИr2   r6   r7   r8   r;   Ú
setdefaultr   rU   r&   )r=   rE   rF   r$   s       r   ô   позиции_площадокr�   Ò   s  € ä× Ñ ×"Ò"Øˆ	Ü	�Š”N×,Ñ,°gÐ,Ó>Ó	?€BØ€HØ�f‰f�^Ó$×*Ð*¨Ò*ˆØ�6‰6�*×Ò §¡¨Ó!7¸4Ô!?ÙØ—V‘VÐ.Ó/ˆ
ß˜Z¨5Ô0ÙØ×ÑœJ r§v¡v¨nÓ'=Ó>ÀÓC×JÑJØ˜bŸf™fÐ%5Ó6ØÔ/°
Ó;Ø §¡Ð'9Ó :× @Ð @¸bØ˜"Ÿ&™& Ó.ð	L
ö 	ñ +ð €Or   c                óT  € / pV P                  R4      ;'       g    .  EF�  p\        VP                  R4      ;'       g    R4      P                  R4      pVP                  R4      ;'       g    .  EF8  pVP                  R4      R8w  d   K  VP                  R4      ;'       g    RP                  4       pV'       g   KO  VP	                  \        V4      . 4      P                  RTR	VP                  R	4      ;'       g    RR
\        VP                  R
4      4      RTRVP                  R4      R\        VP                  R4      ;'       g    R4      RVP                  R4      ;'       g    RRVP                  R4      ;'       g    RRVP                  R4      ;'       g    R/	4       EK;  	  EK’  	  . pVP                  4        F[  pVP                  R R7       \        V^ ,          4      pVR,           U	u. uF  q™R	,          NK  	  up	VR&   VP                  V4       K]  	  V# u up	i )u›  Одна строка на фразу, даже если она лежит в пулах нескольких кластеров.

Правило схлопывания (решение по ревью плана 30.09.2026) живёт только здесь,
панель своего больше не делает: первый приоритет - кластер, где фраза
входит в ядро; второй - кластер, у которого есть страница портала; дальше
более частотный, при равенстве - по коду, чтобы порядок не плавал
между прогонами.
õ   кластерыr|   r   Úhttpõ   пулõ   решениеÚapprovedõ
   фразаõ   кодõ   в_ядреõ   есть_страницаrB   õ   приоритетõ   интентõ   воронкаõ   разметкаc                 óp   € V R ,          '       * V R,          '       * V R,          ;'       g    ^ ) V R,          3# )rŠ   r‹   rB   r‰   © )ô   зs   &r   Ú<lambda>ô1   одобренные_ключи.<locals>.<lambda>  s6   € ¨b°Õ.?Ô*?ÀRÐHcÕEdÔAdØ%'¨Õ%7×%<Ð%<¸1Ð#=¸rÀ(½|ñ*Mr   ©Úkey:é   NNõ   ещё_в_кластерах)r;   r)   rk   r   r€   r   rU   ÚboolÚvaluesÚsortÚdict)
ô   ядроô   кандидатыrm   ô   есть_страницаô   фr   rE   ô   записиô   лучшаяr’   s
   &         r   ô   одобренные_ключиr£   é   sñ  € ð ÐØ�l‰lÐ-Ó.×4Ð4°"Ó4ˆÜ$'¨¯©Ð/AÓ(B×(HÐ(HÀbÓ$I×$TÑ$TÐU[Ó$\Ð!Ø—6‘6˜(Ó#×)Ð) rÓ)ˆBØ�v‰vÐ&Ó'¨:Ô5ÙØ—f‘f˜\Ó*×0Ð0¨b×7Ñ7Ó9ˆFßÙØ×)Ñ)¬*°VÓ*<¸bÓA×HÑHØ˜fØ˜"Ÿ&™& Ó*×0Ð0¨bØœt B§F¡F¨=Ó$9Ó:Ø+Ð-FØ §¡ ~Ó 6Ø$¤c¨"¯&©&Ð1EÓ*F×*LÐ*LÈ"Ó&MØ §¡ ~Ó 6× <Ð <¸"Ø  "§&¡&Ð)9Ó":×"@Ð"@¸bØ" B§F¡FÐ+=Ó$>×$DÐ$DÀ"ð
J÷ 
ô *ñ 5ð& €HØ*×1Ñ1Ö3ˆØ×Ññ MÐô 	Nä˜L¨�OÓ,ˆØO[Ð\^ÖO_Ó7`ÑO_È¸8¿¸ÑO_Ñ7`ˆÐ3Ñ4Ø�‰˜Ö%ñ 4ð €Oùò 8as   Ç7H%c                 ó  € \         P                  4       '       g   R# \        P                  ! \         P	                  RR7      4      p \        4       pV P                  R4      ;'       g    .  F�  pVP                  R4      ;'       g    .  Fm  pVP                  R4      R8X  g   K  VP                  R4      ;'       g    R	P                  4       '       g   KL  VP                  \        VR,          4      4       Ko  	  K‘  	  \        V4      # )
uê   Сколько уникальных одобренных фраз видит вкладка ядра. Для сверки:
экран и вкладка обязаны показывать одно и то же число ключей.Nr-   r.   r0   r…   r†   r‡   rˆ   r   )ô   СЕМАНТИКАr2   r6   r7   r8   Úsetr;   r   Úaddr   Úlen)r=   ô
   фразыrm   r    s       r   ô   approved_в_панелиrª     sÊ   € ô ×$Ñ$×&Ò&ÙÜ	�ŠÔ&×0Ñ0¸'Ð0ÓBÓ	C€BÜ“€JØ�f‰f�^Ó$×*Ð*¨Ò*ˆØ—6‘6˜(Ó#×)Ð) rÒ)ˆBØ�v‰vÐ&Ó'¨:Ö5¸2¿6¹6À,Ó;O×;UÐ;UÐSU×:\Ñ:\×:^Ô:^Ø—‘œz¨"¨\Õ*:Ó;Ö<ó *ñ +ô ˆz‹?Ðr   c                óP  € \        V 4      pV Fl  p\        VP                  R4      4      V8X  g   K$  RVP                  R4      RVP                  R4      RVP                  R4      RVP                  R4      RR/u # 	  V Uu. uF/  q2'       g   K  V\        VP                  R4      4      9   g   K-  VNK1  	  ppV'       dW   \        VR R7      pRVP                  R4      RVP                  R4      RVP                  R4      RVP                  R4      RR	/# RR
RR
RR
RR
RR/# u upi )uð  Позиция и показы Google по ключу.

Сначала точное совпадение запроса с ключом. Вложенный запрос берём только
если точного нет, и только среди пар этой же страницы, с пометкой:
«франшиза кофейни цена» это не то же самое, что «франшиза кофейни»,
и показы таких пар не складываем.
r@   rA   rB   rC   u   по_вложенномуFc                 ó^   € V P                  R 4      RJ V P                  R 4      ;'       g    R3# )rA   Niç  ©r;   )ô   пs   &r   r“   ô(   google_по_ключу.<locals>.<lambda>0  s>   € ¸r¿v¹vÐFVÓ?WÐ[_Ð?_Ðac×agÑagÐhxÓay÷  bAð  bAð  ~Añ  ?Br   r•   TN)r   r;   Úmin)ô   ключô   пары_страницыô   нr®   ô   вложенныеr¢   s   &&    r   ô   google_по_ключуrµ      sC  € ô 
�HÓ	€BÛ'ˆÜ�b—f‘f˜^Ó,Ó-°Ö3Ø$ b§f¡fÐ-=Ó&>ÀÐPR×PVÑPVÐWeÓPfØ  "§&¡&¨Ó"6¸ÈÏÉÈ~ÓH^Ø/°ð8ò 8ñ (ñ
 (AÓtÑ'@ ÃBœ"È2ÔQ[Ð\^×\bÑ\bÐcqÓ\rÓQsÑKsŸ"˜"Ñ'@ÐÐtßÜÐ-ñ  4Bô  CˆØ  ,×"2Ñ"2Ð3CÓ"DÀnÐVb×VfÑVfÐguÓVvØ˜l×.Ñ.¨|Ó<¸nÈl×N^ÑN^Ð_mÓNnØ+¨Tð3ð 	3ð ˜d N°D¸,ÈÈnÐ^bØ'¨ð0ð 0ùò us   Â	D#ÂD#Â1D#c                ó`   € V'       d   Vf   R# V^
8:  d   R# R# V '       g   R# V'       d   R# R# )uª  Состояние ключа.

Два состояния вместо одного «статья есть, ключ не вошёл» - решение
руководителя 30.09.2026 «развести». Разница в том, что делать дальше,
и валить это в один список нельзя:

  «дописать в статью»  - ключ входит в ядро темы, статья писалась под неё,
                         и фразы в тексте просто нет. Дописать абзац.
  «нужна своя статья»  - ключ лежит только в пуле темы, а статья досталась
                         ему потому, что у темы она есть. «что такое
                         франшиза» (16 201 показ) так оказался приписан
                         статье про заказные отзывы: дописывать туда
                         определение франшизы бессмысленно, под такой
                         запрос нужен свой текст.
õ+   закрыт, не показываетсяõ   в топ-10õ   показываетсяõ   без статьиõ    дописать в статьюõ    нужна своя статьяr‘   )ô   есть_статьяô
   вошёлr¢   ô   в_ядре_кластераs   &&&&r   ô   состояниеrÀ   ?  s8   € ÷  ØÒÙ@Ø!-°Ô!3ˆ~ÐSÐ9SÐSß Ù$ß1MÐ-ÐuÐSuÐur   c            #      óz  a3€ R \         P                  9   p \        P                  ! \        P                  RR7      4      p\        P                  4        Uu/ uF  q"R,          VR,          bK  	  ppVP                  R4      ;'       g    .  Uu/ uF7  q"P                  R4      ;'       g    RVP                  R4      ;'       g    RbK9  	  pp\        P                  4       p\        P                  V4      p\        P                  4       \        P                  V4      r‡\        4       p	\        V	4      p
\        4       w  r¼\!        4       p\#        V4      pV Uu0 uF  p\%        VR,          4      kK  	  upo3. pV EFú  pVR,          pVP                  V4      pT;'       g    / P                  R	4      ;'       g    RpV'       d   VP                  V. 4      M. pR
p/ pV'       dr   VR,          '       dc   \'        VR,          4      p\(        P+                  VR,          VR,          4      pV'       d%   \(        P-                  VR,          VR,          4      p. R
ppV Fá  p\%        VR,          4      VR,           Uu0 uF  p\%        V4      kK  	  up9   pVR,          '       dK   V'       g   VR,          V8X  d5   \(        P+                  VR,          \'        VR,          4      R,          4      MR
pV'       g   V'       g   K¥  T;'       g    TpVP/                  RVR,          RVR,          RVR,          RVRV/4       Kã  	  V Uu0 uF&  pVR,          '       g   K  \1        VR,          4      kK(  	  ppVP                  \%        VR,          4      . 4       Uu. uF&  pVR,          V9   g   K  VR,          '       g   K$  VNK(  	  p p\3        R V  4       RR7      p!\5        VR,          V4      p"V
P                  \%        VR,          4      4      ;'       g	    RRRRRR/p#V"R,          V#R,          V!3 Uu. uF  pVf   K	  VNK  	  p$pV$'       d   \3        V$4      MRp%T;'       g    Tp&\7        V4      ;'       g    \7        V4      p'\9        V33R lV 4       4      p(TP/                  / RVR,          bRVP                  V4      ;'       g    TbRVbRVP                  V4      ;'       g    RbRVR,          bRVR,          bRVR,          bR VR ,          bR!VR",          bR#VR#,          bR$VR%,          bR&VR%,          '       d   R'MR(bR)V'       d    R	VRVR,          RVR,          R*VR*,          /MRbRVbR+VbR,\7        V4      ;'       d    VV9   bR-\7        V4      ;'       d    VV9   bR.T"R/\;        V#R0R17      R2R3\=        V4      R4V!R5VR\>         /R4T%R6R7\=        V4      R8T(R5VR\>          Uu. uFf  pR9VP                  R94      RVP                  R4      RVP                  R4      RVP                  R4      R:\%        VP                  R94      4      S39   /NKh  	  up/R;\A        V'V&V%VR%,          4      /C4       EKý  	  VPC                  R< R=7       / p)V F-  p*V)P                  V*R;,          ^ 4      ^,           V)V*R;,          &   K/  	  \9        R> V)PE                  4        4       4      p+V)P                  R?^ 4      V)P                  R@^ 4      ,           p,RA\=        V4      RBV+RCV,RDV)P                  R@^ 4      REV)P                  RF^ 4      RGV)P                  RH^ 4      /p-\G        V UUu0 uF'  pVR,           F  p\%        V4      S39  g   K  VkK  	  K)  	  upp4      p.\I        4       p/. p0V/e1   V/\=        V4      8w  d!   V0P/                  RI\=        V4       RJV/ 24       \9        V)PK                  4       4      \=        V4      8w  d   V0P/                  RK4       V-RD,          V-RC,          8”  d   V0P/                  RL4       V-RB,          \=        V4      8”  d   V0P/                  RM4       RNRORPRQR
RR\L        RSRTRURVT;'       g    / P                  RU4      RWT	;'       g    / P                  RU4      RX\=        T	;'       g    / P                  RY4      ;'       g    . 4      RZ\O        R[ VPK                  4        4       RR7      /R\R]R^R/R_R.R`R2Ra/Rb\P        RcV-Rd\;        V)\=        V4      Re7      RfRgV/RhV0RiV.//RYV/p1\S        Rj\=        V4       RkV-RB,           RlV-RC,           RmV-RD,           24       \S        Rn\        PT                  ! V)R
Ro7      4       \S        Rp\=        V U*u0 uF$  p*V*R),          '       g   K  V*R),          R	,          kK&  	  up*4       Rq\9        Rr V 4       4       24       V0 F  p2\S        RsV24       K  	  V.'       d7   \S        Rt\=        V.4       Ru2RvPW                  Rw V.Rx,           4       4      4       V '       d   \S        Ry4       V0'       d   ^# ^ # \X        P[                  4       '       dL   \]        \_        \X        4      Rz\L         2,           4      Pa                  \X        P                  RR7      RR7       \X        Pa                  \        PT                  ! V1R
^R{7      R|,           RR7       \S        R}\X        Pc                  \d        4      4       V0'       d   ^# ^ # u upi u upi u upi u upi u upi u upi u upi u upi u uppi u up*i )~u   --сухойr-   r.   r‰   u   имяrƒ   r   u
   веткаrˆ   rQ   FrK   rr   rq   rP   rL   rM   r}   rN   rO   u   в_шапкеr   rA   c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)rA   Nr‘   )Ú.0r’   s   & r   Ú	<genexpr>ô!   главная.<locals>.<genexpr>�  s   é € Ð,cÑLbÀbÐ0@×-AÒ-AÓLbùs   ‚N)ÚdefaultrB   rC   c              3   ój   <"  € T F(  p\        VP                  R 4      4      S9   g   K$  ^x € K*  	  R# 5i)r@   N)r   r;   )rÃ   r®   ô   все_ключиs   & €r   rÄ   rÅ   ™  s8   øé € ð  2C¹h¸Ì*ÐUW×U[ÑU[Ð\jÓUkÓJlð  qBñ  KB·!²!»hùs   ƒ!3©
3u   темаrŒ   r�   rŽ   u   разметка_интентаr�   r˜   u   в_ядре_кластераrŠ   u
   связьu   ядро кластераu$   только пул кластераu   статьяrR   u   где_ключu    в_индексе_яндексаu   в_индексе_googleÚgoogleu   яндексT)ô   по_хостуõ   площадкиõ   материаловu   лучшая_позицияu   списокu   раскрытиеu   запросовu!   из_них_ключей_ядраr@   u   ключ_ядраu   состояниеc                 ó`   € V R ,          ;'       g    RV R,          ;'       g    ^ ) V R,          3# )rŒ   Ú9rB   rˆ   r‘   )rF   s   &r   r“   ô    главная.<locals>.<lambda>Ê  s1   €  bÐ)=Õ&>×&EÐ&EÀ#ÈÈNÕI[×I`ÐI`Ð_`ÐGaÐceÐfrÕcsÑ%tr   r•   c              3   ó<   "  € T F  w  rVR9   g   K  Vx € K  	  R# 5i)r·   N)r·   r¹   r¸   r‘   )rÃ   rm   Úvs   &  r   rÄ   rÅ   Ï  s%   é € ð xÑ(B™u˜rØÐvÑv÷ šÓ(Bùs   ‚’
r¹   r¸   u   ключей_в_ядреu   закрытоu   показываютсяu   в_топ10u    дописать_в_статьюr»   u    нужна_своя_статьяr¼   u   ключей в keys.json u@   , а одобренных фраз во вкладке ядра uE   сумма состояний не равна числу ключейuB   «в топ-10» больше, чем «показываются»u7   «закрыто» больше числа ключейu   метаu   разделu%   Выработка семантикиrz   u   собраноu   собрано_изu  семантика/ядро.json, завод/реестр-текстов.json, снимки Search Console и Вебмастера, панель/данные/positions.json; скриптом панель/данные/обновить-ключи.py - руками не правитьu
   снятоÚsearch_consoler   u5   запросов_в_снимке_вебмастераr0   u   замер_площадокc              3   óv   "  € T F/  q F'  pVP                  R 4      '       g   K  VR ,          x € K)  	  K1  	  R# 5i)r~   Nr­   )rÃ   ô   спr’   s   &  r   rÄ   rÅ   ÿ  s;   é € ð 4@ÑQfÈÒquÐkmØ*,¯&©&°×*>ô 5E°B°|×4DÒ4DÑquÑ4DÓQfùs   ‚9¤9u   правило_закрытияuD  Ключ закрыт, только если его фраза вошла в текст - статьи портала или опубликованного материала площадки. Сравниваем по словам: все слова ключа без стоп-слов стоят в одном предложении, порядок не важен (семантика/ключ_в_тексте.py). «Статья есть, ключ не вошёл» - отдельное состояние, а не «закрыто»: это список на дописать.u   оговоркиu_   Яндекс: позиция сайта целиком за 14 дней, не страницы.uD   Google: пары «страница-запрос» за 28 дней.uR   Площадки: только Яндекс, топ-100. Google не меряем.u   состоянияu   плиткиu   сводка)ô   ключейu   сверкиu1   одобренных_во_вкладке_ядраu   расхожденияu-   фразы_из_шапок_не_из_ядраu   ключей: u    | закрыто u   , показываются u   , в топ-10 u   состояния:)Úensure_asciiu3   статей портала под ключами: u;   , ключей с материалами площадок: c              3   óT   "  € T F  qR ,          R,          '       g   K  ^x € K   	  R# 5i)rË   rÌ   Nr‘   )rÃ   rF   s   & r   rÄ   rÅ     s4   é € ð  JVÑVbÐPRÐi{Õf|ð  ~T÷  gUñ  gUÏ!Ê!ÓVbùs   ‚(ž
(u#     СВЕРКА НЕ СОШЛАСЬ:u'     в шапках материалов u-    фраз, которых нет в ядре:z; c              3   ó.   "  € T F  pR V R2x € K  	  R# 5i)ô   «ô   »Nr‘   )rÃ   r    s   & r   rÄ   rÅ     s   é € ÐHÑ.G¨˜"˜R˜D �Ó.Gùs   ‚:Né   Nu4   сухой прогон: keys.json не тронутu   .до-сборки-)rÖ   ÚindentÚ
u   записано:)3ÚsysÚargvr6   r7   ô   ЯДРОr8   ô   _расходô   кластеры_ядраr;   ô   свежий_gscô   по_страницам_gscô    в_индексе_яндексаô   в_индексе_googler>   rI   r_   r�   r£   r   rx   rt   ô   ключ_в_текстеô   где_ключrU   r&   r°   rµ   r™   Úsumrœ   r¨   ô   СПИСОКrÀ   r›   Úitemsr3   rª   rš   ô   СЕГОДНЯÚmaxô   СОСТОЯНИЯÚprintÚdumpsÚjoinô
   КЛЮЧИr2   r   r)   Ú
write_textÚrelative_torf   )4ô
   сухойr�   rm   ô
   именаô
   веткиô   снимок_gscô   пары_gscô   в_яô   в_гô   снимок_яô   хостrY   rZ   ô   замерыô
   ключиô   строкиô   кодô   статьяô   слагô   парыô   вошёл_порталô   гдеr   ô   свои_площадкиô   вошёл_площадкаr   ô   хô   взялô
   вошлоr®   ô   мои_адресаr’   ô   площадочныеô   лучшая_площадкаô   гô   яô   своиr¢   r¾   r½   ô#   ключей_ядра_в_парахô   состоянияrF   ô   закрытоô   показываютсяô   плиткиô   чужие_ключиô   в_панелиô   расхожденияrE   ô   рrÈ   s4                                                      @r   ô   главнаяr  X  sA  ø€ Ø¤3§8¡8Ñ+€JÜ�zŠzœ(×,Ñ,°gÐ,Ó>Ó?€HÜ7D×7^Ñ7^Ô7`ÓaÑ7`°�X•,  8¥Ò,Ñ7`€JÐað PXÏ|É|Ð\nÓOo×OuÐOuÐsuÐOuÓvÑOuÈ—&‘&˜Ó"×(Ð( b¨"¯&©&°Ó*>×*DÐ*DÀ"ÒDÑOu€JÐvÜ$×5Ñ5Ó7ÐÜ ×<Ñ<Ð=MÓN€LÜ ×AÑAÓCÄ]×EkÑEkÐl|ÓE}ˆ5Ü5Ó7€OÜ(¨Ó9€HÜ%@Ó%BÑ"€LÜ2Ó4€LÜ0°Ó:€JÙ@JÓKÁ
¸"œ B |Õ$4Ö5Á
ÑKÐà€LÜˆØ�H•ˆØ#×'Ñ'¨Ó/ˆØ ×&Ð& B×+Ñ+¨JÓ7×=Ð=¸2ˆß5=�<×#Ñ# H¨bÔ1À2ˆà"'ÐØˆß˜L¨×4Ô4Ü˜, zÕ2Ó3ˆBÜ&5×&NÑ&NÈrÐR^ÕO_ÐacÐdnÕaoÓ&pÐ#ß&Ü(×8Ñ8¸¸LÕ9IÈ2ÈnÕK]Ó^�ð BDÀUÐ#>Ð!Û"ˆBÜ! " \Õ"2Ó3ÐQSÐT`ÖQaÓ7bÑQaÈ2¼
À2¾ÑQaÑ7bÑbˆHà˜:Ÿœ¯H¸Ð;KÕ8LÐPVÔ8Vô *×BÑBÀ2ÀlÕCSÔU]Ð^`ÐakÕ^lÓUmÐnxÕUyÔzØ]bð ç§JÙØ*E×*SÐ*SÈÐ'Ø%×,Ñ,Ð.@À"ÐEWÕBXÐZfÐhjÐkyÕhzØ"6¸Ð;OÕ8PÐRaÐckØ"<¸jð.Jö Kñ #ñ RkÓÑQjÈ2ÐnpÐq}×n~Ñn~ÔFÔ4°R¸Õ5EÖFÑQjÐÐØ/;×/?Ñ/?Ä
È2ÈlÕK[Ó@\Ð^`Ô/aó "\Ñ/a¨Ø˜\Õ*Ð.AÑAô #%ØFHÐIY×FZÑFZ÷ #% "Ñ/aÐð "\ä(+Ñ,cÑLbÓ,cÐmqÔ(rÐ%ä# B |Õ$4°hÓ?ˆØ�\‰\œ* R¨Õ%5Ó6Ó7×}Ð}Ð<LÈdÐTbÐdhÐjvÐx|Ð;}ˆà"$Ð%5Õ"6¸Ð;KÕ8LÐNkÑ!lÓÑ!l˜2Ðpr—B�BÑ!lˆÐß(0”s˜8”}°dˆØ,×KÐKÐ0Kˆ
Ü $ \Ó 2× UÐ U´dÐ;TÓ6UÐä.1ô  2C¹hó  2Có  /CÐ+Ø×Ñð ,
Ø˜"˜\Õ*ð,
à˜
Ÿ™ vÓ.×8Ð8°&ð,
ð �fð,
ð ˜*Ÿ.™.¨Ó0×6Ð6°Bð	,
ð
 ! "Ð%9Õ":ð,
ð ˜B˜~Õ.ð,
ð ˜B˜~Õ.ð,
ð ˜bÐ!1Õ2ð,
ð .¨rÐ2DÕ/Eð,
ð +¨BÐ/MÕ,Nð,
ð$ +¨B¨}Õ,=ð%,
ð& ¸¸M×9JÔ9JÑ5ÐPvð',
ð( ç&ð )¨(Ð4HÈ,ÐWkÕJlØ&¨°^Õ(DÀlÐT`ÐamÕTnñpà,0ð-,
ð. 'Ð(?ð/,
ð0 ˜vð1,
ð2 /´°X³×0TÐ0TÀ8ÈuÑCTð3,
ð4 '¬¨X«×(LÐ(L¸8ÀuÑ;Lð5,
ð6 �bØœD °TÔ:ØØ&¬Ð,EÓ(FØ-Ð/LØÐ 9¸-¼<Ð Hð!ð
 *¨<Ø Ø"¤C¨£MØ3Ð5XØð &.¨m¬|Ñ%<ó!>ñ &=˜rð #1°"·&±&¸Ó2HÐJZÐ\^×\bÑ\bÐcsÓ\tØ*¨B¯F©F°>Ó,BÀLÐRT×RXÑRXÐYeÓRfØ/´¸B¿F¹FÀ>Ó<RÓ1SÐWhÑ1hó"jñ &=ñ!>ð#ð !Ô"4Ð5JÈJÐXdÐfhÐivÕfwÓ"xñW,
÷ ,	ña ð@ ×ÑÑtÐÔuàÐÛˆØ7I×7MÑ7MÈbÐQeÕNfÐhiÓ7jÐmnÕ7nÐ˜2Ð2Õ3Ó4ñ äñ xÐ(:×(@Ñ(@Ô(Bó xó x€Nà1×5Ñ5Ð6PÐRSÓTÐWi×WmÑWmÐn|Ð~ó  XAõ   AÐà"¤C¨Ó$5Ø˜.Ø"Ð$<ØÐ)×-Ñ-¨n¸aÓ@ð 	+Ð,>×,BÑ,BÐCeÐghÓ,iØ*Ð,>×,BÑ,BÐCeÐghÓ,ið	€Lô #Ñ1Aô $FÑ1A¨2ÈBÈ|×L\ÐL\ÀbÜ'¨›^Ð3DÑD÷ %' BÑL\¡BÑ1Aò $Fó GÐô /Ó0€OØÐØÒ" ¼#¸lÓ:KÔ'KØ×%Ñ%Ð(BÄ3À|ÓCTÐBUð V\Ø\kÐ[lð'nô 	oä
Ð×$Ñ$Ó&Ó'¬3¨|Ó+<Ô<Ø×%Ñ%Ð&mÔnØ�MÕ" \Ð2LÕ%MÔMØ×%Ñ%Ð&jÔkØÐ$Õ%¬¨LÓ(9Ô9Ø×%Ñ%Ð&_Ô`ð 	ØÐCØ˜ØœnØ!ð %Jð Ø Ð#3×#9Ð#9°r×">Ñ">¸|Ó"LØ$ ×'<Ð'<¸"×&AÑ&AÀ,Ó&Oð HÌÈo×NcÐNcÐac×MhÑMhÐiwÓMx×M~ÐM~Ð|~ÓIØ-¬sñ 4@ÐQ]×QdÑQdÔQfó 4@ØIMô0Oð	ð .ð@ð
 Øð  !BØÐ`Ø"Ð$xð!ð
 !Ô"4Ø˜LØœDÐ!3Ä#ÀlÓBSÔTØÐPÐRaÐc{ð  ~TØFÐH]ð_ð?!
ðD 	˜ðG$€HôL 
ˆNœ3˜|Ó,Ð-Ð-?ÀÐM]Õ@^Ð?_ð `&Ø&2Ð3MÕ&NÐ%OÈÐ_kÐlyÕ_zÐ^{ð}ô ~ä	Ð
¤§¢Ð,>ÈUÔ!SÔTÜ	Ð?ÄÑnzó  ERÑnzÐhjð  Að  BP÷  Qñ  QÔEcÀRÈÕEWÐXb×EcÐEcÑnzñ  ERó  ASð  @Tð TFÜFIñ  JVÑVbó  JVó  GVð  FWðXô Yã$ˆÜÐ3°RÖ8ñ %çÜÐ7¼Ð<QÓ8RÐ7Sð  TAð  BØ�i‰iÑHÐ.CÀBÖ.GÓHÓHô	JçÜÐDÔEß*ˆqÐ1°Ð1Ü×Ñ×ÒÜŒS”‹_Ð!4´^Ð4DÐEÕEÓF×QÑQÜ× Ñ ¨'Ð Ó2¸Wð 	Rô 	Fä×Ñœ$Ÿ*š* X¸EÈ!ÔLÈtÕSÐ^eÐÔfÜ	Ð
œz×5Ñ5´lÓCÔDß&ˆ1Ð-¨AÐ-ùò[ bùò wùò Lùò4 8cùò @ùò"\ùò @ùòX!>ùóB$Fùòp ERsm   Ál
ÂlÂ)lÃlÅlÉ:l
ÍlÍlÎl#Î+l#Î<l#Ð1l(Ð<l(×(A,l-(Ýl2
Ý=
l2
æl8æl8Ú__main__)rº   r¼   r»   r·   r¹   r¸   ).Ú__doc__Úimportlib.utilr   r6   r   rÞ   Údatetimer   Úpathlibr   Ú__file__ÚresolveÚparentô   ДАННЫЕrf   rò   r¥   r   rà   rT   r1   ÚtodayÚ	isoformatrì   rê   r   rt   rá   r   r&   r+   r>   rI   r_   rV   rs   rx   r�   r£   rª   rµ   rî   rÀ   r  Ú__name__Ú
SystemExitr‘   r   r   Ú<module>r)     sj  ðñ3ój Û Û 	Û 
Ý Ý á�H‹~×%Ñ%Ó'×.Ñ.€Ø×"Ñ"×)Ñ)€Ø˜KÕ'€
Ø!Ð$4Õ4Ð ØÐ 0Õ0€ØÐ.Õ.°Õ@€Ø˜lÕ*Ð-OÕO€Ø! LÕ0Ð3GÕGÐJZÕZÐ Ø—’“×'Ñ'Ó)€ð €òñ   Ð/CÕ CÐFcÕ cÐeó  A€Ù˜lÐ-XÕXÐZqÓr€ò#ò(ò@ò
ò
ò+*ò\ð( €	òòò.$òNò 0ò6hÐ òvò2P.ðf ˆzÔÙ
‘^Ó%Ó
&Ð&ñ r   