рд╕рдВрдЧрдо рдЗрдирд▓рд╛рдЗрди рдЯрд┐рдкреНрдкрдгреА рдЖрдБрдХрдбрд╝реЗ

Confluence рдореЗрдВ рдкреЗрдЬ рдХрдореЗрдВрдЯ рдХреЗ рдЖрдБрдХрдбрд╝реЗ рдХреИрд╕реЗ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВ?

рд╣рд╛рдБ, рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ?



рдХреНрдпреЛрдВ рдФрд░ рдХреНрдпреЛрдВ


рдЬрд┐рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдЖ, рдЙрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреА рддреИрдпрд╛рд░реА рдФрд░ рдЕрдиреБрдореЛрджрди рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ:

  • рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
  • рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдЯреАрдо рдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред
  • рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдПрдХ рдмрд╛рд░, рдкреНрд░реВрдлрд░реАрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдмреИрдЪ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕реМрдВрдк рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред
  • рдЧреНрд░рд╛рд╣рдХ рдЯреАрдо рдиреЗ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред
  • рдФрд░ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдХреА рдЯреАрдо рдиреЗ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреВрд░рдХ рдХрд┐рдпрд╛, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рд╢реНрдиред
  • рдпрджрд┐ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ рд╣реИ рдпрд╛ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рддрдп рд╣реИ, рддреЛ рдЧреНрд░рд╛рд╣рдХ рдЯреАрдо рдХреЛ рдЯрд┐рдкреНрдкрдгреА рдмрдВрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
  • рдореМрдЬреВрджрд╛ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рдПрдХ рдмреИрдЪ рдкрд░ рд╕рд╡рд╛рд▓ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдЕрдЧрд▓реЗ рдмреИрдЪ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рддрдХ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рддреНрдпреЗрдХ рд╕рдкреНрддрд╛рд╣, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╡рд┐рддрд░рд┐рдд рдмреИрдЪ рдиреЗ рдХрд┐рддрдирд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХреНрдпрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдЯреАрдо рдХреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдФрд░ рдмрд╛рдХреА рдХреЗ рд╕рд╛рде рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛рдП? рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдЙрд╕ рдкрд░ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдереЛрдбрд╝реА рдЪрд╛рд▓ рдХреА рдорджрдж рд╕реЗ), рдлрд┐рд░ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреА рдЯреАрдо рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░рдиреЗ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдФрд░ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рдирд╣реАрдВ рд╣реИред

рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдмреИрдЪ рдореЗрдВ 50-100 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрда рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╢реНрд░рдо рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА рджреВрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рджреБрдЦрдж рд╣реИред рдФрд░ рд╕реНрд░реЛрдд рдХреЗ рдкрд╛рда рдХреЛ рдЧрд▓рддреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреГрд╖реНрда рдХреЗ рддреНрд░реБрдЯрд┐рдкреВрд░реНрдг рд╕рдВрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд▓рдЯрдХрдиреЗ рд╡рд╛рд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рднреА рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдЯрд┐рдкреНрдкрдгреА рд╣рд▓ рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдкреГрд╖реНрда рдХреЗ рдкрд╛рда рдореЗрдВ рдПрдХ рдЕрджреГрд╢реНрдп рдорд╛рд░реНрдХрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╕рд╛рдзрдиреЛрдВ рдХреА рдЦреЛрдЬ рдЕрд╕рдлрд▓ рд░рд╣реАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдлрд╝реНрд▓реБрдПрдВрд╕ рдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреА рдУрд░ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рди рдХрд┐ рдЦрд░реАрдж рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВред рдХреЛрдИ рдореИрдХреНрд░реЛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд╣реАрдВред

рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рд╕рдорд╛рди рдЬреАрд░рд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлреНрд▓реБрдПрдВрд╕ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рдФрд░ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╡ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рдФрд░ рдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдЪреБрдирдирд╛ рдерд╛, рдФрд░ рдЖрдк рд╣рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЯреВрд▓реНрд╕ рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдХреБрдЫ рдЕрдиреБрднрд╡ рд╣реИ рдЬреЛ рдмреИрд╢, рдкрд░реНрд▓, рдЬреЗрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реЗ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реЛрдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдореИрдВ рдХреЛрдИ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдкрд░рд┐рдЪрд┐рдд рдпрд╛ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдХрд░рдг рдирд╣реАрдВ рдерд╛ред рдореИрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдЙрдкрдпреБрдХреНрдд рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рддрдм рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдХреА рдЦреЛрдЬ рдХреА рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд


рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдереАред рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рд╡рд┐рддрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдкреГрд╖реНрда рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрди рдкрд░ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдПрдХрддреНрд░ рдХрд░реЗрдВ: рдкреГрд╖реНрда, рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ, рд▓реЗрдЦрдХ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рддрд┐рдерд┐, рдкреГрд╖реНрда рдкрд░ рд╕реНрд░реЛрдд рдкрд╛рда, рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдЙрддреНрддрд░, рд▓реЗрдЦрдХ рдФрд░ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреА рддрд┐рдерд┐, рдЯрд┐рдкреНрдкрдгреА рдХреА рд╕реНрдерд┐рддрд┐ред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░реЗрдВ, рдХреБрд▓ рдХрд┐рддрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рдХрд┐рддрдиреЗ рдЦрддрд░реЗ, рдХрд┐рддрдиреЗ рдЦреБрд▓реЗред рдпрд╣ рд╕рдм рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдБрдХрдбрд╝реЗ рдкреГрд╖реНрда рдкрд░ рд╕рд╣реЗрдЬреЗрдВред

рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдХреЛ рд░рдЦрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рджреЗрдЦреЗрдВ, рдФрд░ рдЪрд▓реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдБ:

from atlassian import Confluence UserLogin = 'xxxxxx' # input("Login: ") UserPwd = 'xxxxxx' # input("Password: ") confluenceURL = 'http://wiki.xxxxxx' confluence = Confluence( url=confluenceURL, username=UserLogin, password=UserPwd) 

рдПрдХ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдмреИрдЪ рд╕реЗ рдкреГрд╖реНрдареЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдХреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХрд╛рдо рд╣реИред

 page_label = 'week123' cql = 'space.key={} and label = "{}" and type = page ' 'ORDER BY title '.format('YYY', page_label) pages = confluence.cql(cql, expand=None, start=0, limit=200) 

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдареЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реАред рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреЗрдЬ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдирдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЙрд╕рдХреЗ рдбреЗрдЯрд╛ рд╕реЗ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдЖрдБрдХрдбрд╝реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреГрд╖реНрда рдкрд░ рдХрд┐рддрдиреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдХрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдмрд╛рд╣рд░ рдЦрдЯрдЦрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╣реИрдВред

рдкреЗрдЬ рд╕реВрдЪреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
 statistics = [] open_comments = [] #  - ? if pages is not None: #    ? if pages['size'] > 0: for page in pages['results']: print(page['title']) #       , #  page_comments = page_comments_data(page['content']['id']) #     statistics.append(page_statistics(page_comments)) #        #    . for comment in page_comments: if comment['Result'] not in ['resolved', 'nocomment']: if not (comment['Result'] == 'dangling' and comment['Author'] in excludeNames): open_comments.append(comment) #       . statistics.append(total_statistics(statistics)) #     page_id = confluence.get_page_id(space='YYY', title=page_title) #     ,    . page_body = ('<p><ac:structured-macro ac:name="toc" ac:schema-version="1"' '/></p>' '<h1>Comments Statistics</h1>{}' '<h1>Open Comments List</h1>{}' ).format(create_table(statistics), create_table(open_comments)) #  if page_id is not None: status = confluence.update_page( page_id=page_id, title=page_title, body=page_body, representation='storage' ) 

рдПрдкреАрдЖрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдЕрдм рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдкреЗрдЬ рдХреЛ рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдкреАрдЖрдИ рдХреЗрд╡рд▓ рдореВрд▓ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпрд╛ рдкреГрд╖реНрда рдХрд╛ рдирд╛рдоред рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ _expandable рдХреЗ рд╡рд░реНрдЧреЛрдВ рдпрд╛ рдЙрдкрдЦрдВрдбреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ рддрдм рддрдХ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВред

рдореБрджреНрджрд╛ рдЙрджрд╛рд╣рд░рдг
 http://wiki.xxxxxx/rest/api/content/101743895?expand=body,children.comment { "id": "97517865", "type": "page", "status": "current", "title": "w2019-47 comments status", "children": { "comment": { "results": [], "start": 0, "limit": 25, "size": 25, "_links": {} }, "_links": {}, "_expandable": { "attachment": "/rest/api/content/97517865/child/attachment", "page": "/rest/api/content/97517865/child/page" } }, "body": { "_expandable": { "editor": "", "view": "", "export_view": "", "styled_view": "", "storage": "", "anonymous_export_view": "" } }, "extensions": { "position": "none" }, "_links": {}, "_expandable": { "metadata": "", "operations": "", "restrictions": "/rest/api/content/97517865/restriction/byOperation", "history": "/rest/api/content/97517865/history", "ancestors": "", "version": "", "descendants": "/rest/api/content/97517865/descendant", } } 

рдФрд░ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рднреА рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ, рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ред рдпрд╣ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб (рдПрдкреАрдЖрдИ?) рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ 25 рд╣реИред рдХреБрдЫ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдкреГрд╖реНрда рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕рднреА рдХреЛ рдХреЗрд╡рд▓ 25 рд╣реА рдорд┐рд▓рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЖрдХрд╛рд░ рднреА рдирдХрд▓реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ 29 рдереЗред рд╣рдо рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде get_page_comments - рдХрдВрдлреНрд▓реБрдПрдВрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХреБрд╢ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

 #    import re #      XML def replace_chars2(in_text): text = re.sub(r'&', '&', in_text) text = re.sub(r'\'', ''', text) text = re.sub(r'<', '<', text) text = re.sub(r'>', '>', text) text = re.sub(r'"', '"', text) return text 

рдЕрдЧрд▓рд╛ рдиреБрдХрд╕рд╛рди рд╡рд┐рд╢реЗрд╖ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рдерд╛ред рдПрдХ рдкреГрд╖реНрда рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдХрдИ рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрдВрддрд░рд┐рдХ XML - рд╕рдВрдЧреНрд░рд╣рдг, рдореИрдХреНрд░реЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмрд┐рдирд╛ рдордзреНрдпрд╡рд░реНрддреА HTML - рдореИрдХреНрд░реЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдФрд░ HTML - Export_viewред рд▓реЗрдХрд┐рди рдкреГрд╖реНрда рдХрд╛ рд╢реАрд░реНрд╖рдХ рдФрд░ рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рдореВрд▓ рдкрд╛рда рд╣рдореЗрд╢рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХреА рдЬрд╛рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпреЗ рдЖрдВрдХрдбрд╝реЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХреБрдЫ рдкрд╛рддреНрд░реЛрдВ рдиреЗ рд░реВрдкрд╛рдВрддрд░рдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдКрдкрд░ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдиреА рдереАред

рдкреЗрдЬ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рдЕрдм рдкреЗрдЬ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреГрд╖реНрда рдХреЛ рд▓реЛрдб рдХрд░рддреА рд╣реИ, рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рдЙрддреНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдирд┐рдХрд╛рд▓рддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрддреНрд░рд╛рдЪрд╛рд░ рдореЗрдВ рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЬрд╣рд╛рдВ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдЙрддреНрддрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВред

рд╕рд┐рдВрдЧрд▓ рдкреЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
 def page_comments_data(page_identifier): #,      ,  , #   , #  ,    ,    #   (). expand_text = ('body.storage,extensions.inlineProperties' ',extensions.resolution,version,children.comment' ',children.comment.version,children.comment.body.storage' ) #    .     . conf_page = confluence.get_page_by_id(page_identifier, expand='body.storage') page_title = replace_chars2(conf_page['title']) #   . link_base = conf_page['_links']['base'] page_link = link_base + conf_page['_links']['webui'] page_code = '<a href="{}">{}</a>'.format(page_link, page_title) #   page_comments = confluence.get_page_comments(content_id=page_identifier, start=0, limit=1000, comments = [] #    for comment in page_comments['results']: #      - . if comment['extensions']['location'] == 'footer': continue #  comment_text = comment['body']['storage']['value'] comment_result = comment['extensions']['resolution']['status'] comment_link = '<a href="{}">{}</a>'\ .format(link_base + comment['_links']['webui'], 'link') #  comment_link = re.sub(r'&focusedCommentId=', '&focusedCommentId=', comment_link) #  created_when = re.sub(r'\.000\+', ' GMT+', re.sub(r'T', ' ', comment['version']['when'])) created_by = comment['version']['by']['displayName'] orig_text = replace_chars2(comment['extensions'] ['inlineProperties']['originalSelection']) #    /. thread = '<b>To text: </b>{}<br/><b>At: </b>{}<br/><b>By: ' '</b>{}<br/>{}'.format(orig_text, created_when, created_by, comment_text) last_by = '' last_when = '' #  answers = comment['children']['comment']['size'] if answers > 0: for message in comment['children']['comment']['results']: #  last_when = re.sub(r'\.000\+', ' GMT+', re.sub(r'T', ' ', message['version']['when'])) last_by = message['version']['by']['displayName'] #  thread += ('<br/>===next===<br/><b>At: </b>{}<br/><b>By: ' '</b>{}<br/>{}'.format(last_when, last_by, message['body']['storage']['value']) ) #  . row_comm = {"Page": page_code, "Comment": comment_link, "Thread": thread, "Result": comment_result, "Answers count": answers, "Creation Date": created_when, "Author": created_by, "Last Date": last_when, "Last Author": last_by} comments.append(row_comm) #   ,   , #     . if len(comments) == 0: row_comm = {"Page": page_code, "Comment": 'nolink', "Thread": 'nocomment', "Result": 'nocomment', "Answers count": 0, "Creation Date": 'never', "Author": 'nobody', "Last Date": 'never', "Last Author": 'nobody'} comments.append(row_comm) return comments 

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдФрд░ рдЯреЗрдмрд▓


рдбреЗрдЯрд╛ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ
 def page_statistics(comments_data): open_count = 0 dang_count = 0 comment_count = len(comments_data) if comment_count > 0: for comment in comments_data: #     if comment['Result'] not in ['resolved', 'nocomment']: if comment['Result'] in ['open', 'reopened']: open_count += 1 if comment['Result'] == 'dangling' and comment['Author'] not in excludeNames: dang_count += 1 res_dict = {'Page': comments_data[0]['Page'], 'Total': comment_count, 'Resolved': comment_count - open_count - dang_count, 'Dangling': dang_count, 'Open': open_count} return res_dict #   def total_statistics(stat_data): total_comment = 0 total_resolved = 0 total_open = 0 total_dangling = 0 for statRow in stat_data: total_comment += statRow['Total'] total_resolved += statRow['Resolved'] total_open += statRow['Open'] total_dangling += statRow['Dangling'] res_dict = {'Page': 'All Pages Total', 'Type': '', 'Jira': '', 'Status': '', 'Total': total_comment, 'Resolved': total_resolved, 'Dangling': total_dangling, 'Open': total_open} return res_dict 

рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ HTML рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ, рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрддрдВрдн рдЬреЛрдбрд╝рддрд╛ рд╣реИред

 def create_table(tab_data): tab_start = '<table style="width: 100.00%;"><colgroup><col />' '<col /></colgroup><tbody>' tab_end = '</tbody></table>' tab_code = tab_start + '<tr>' row_num = 1 if len(tab_data) > 0: tab_code += '<th>Num</th>' for key in tab_data[0].keys(): tab_code += '<th>{}</th>'.format(key) tab_code += '</tr>' for row in tab_data: tab_code += '<tr><td>{}</td>'.format(row_num) row_num += 1 for field in row.values(): tab_code += '<td>{}</td>'.format(field) tab_code += '</tr>' tab_code += tab_end + '\n' return tab_code 

рдЕрдм рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдкреЗрдЬ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдкреБрдирд╢реНрдЪ

рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрдВрдд рдореЗрдВ рдирд┐рдХрд▓рд╛ред рдкреГрд╖реНрдареЛрдВ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдЬреАрд░рд╛ рдореЗрдВ рдЯрд╛рд╕реНрдХ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдореИрдХреНрд░реЛ рдХреА рдЦреЛрдЬ рдереАред рдЬреАрд░рд╛ рдореЗрдВ рдЯрд╛рд╕реНрдХ рдирдВрдмрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЗрдмрд▓рд┐рдВрдЧ рдереА рдФрд░ рдЙрдирд╕реЗ рдХреЙрдиреНрдлреНрд▓реБрдПрдВрд╕ рдХреЗ рд▓рд┐рдВрдХ рдереЗред рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рд╡рд┐рддрд░рдг рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХреНрд╕реЗрд▓ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдмрдЪрдд рдФрд░ рдХрдИ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдПрдХреНрд╕реЗрд▓ рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рдЖрдо рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдерд╛ред рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Word рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВред

Source: https://habr.com/ru/post/hi485652/


All Articles