Как мы автоматизировали ежедневный твит проекта 100DaysOfCode

Как мы автоматизировали ежедневный твит проекта 100DaysOfCode
В этом посте я покажу вам способ сделать автоматический твит о прогрессе в испытании #100DaysOfCode Challenge. После этого у вас останется больше времени на разработку. Супер, да?

Это день 007 нашего испытания 100 Days of Code. Весь код проекта хранится здесь.

Подготовка

Итак, нам понадобятся pytz, tweepy и requests. Вы можете установить их все разом командой:

pip install -r requirements.txt если вы склонировали репозиторий. Также рекомендую использовать virtualenv для изоляции окружений.

Вам также понадобятся Consumer Key/Secret и Access Token (Secret) из Twitter. Я добавил их в .bashrc, который я загружаю через os.environ в config.py. Там же запускается обработчик логгирования, записывающий исходящие твиты и все возможные ошибки.

Главный скрипт

Согласно PEP8, вначале импортируем стандартную библиотеку, затем внешние модули, а ниже — модули проекта:

import datetime
import os
import re
import sys

import requests
import pytz

from config import logging, api
Мой сервер запущен в часовом поясе Mountain Time, а мне необходимо было работать с поясами в EMEA. В этом нам поможет pytz, с ним очень легко работать с любыми часовыми поясами:

tz = pytz.timezone('Europe/Amsterdam')
now = datetime.datetime.now(tz)
start = datetime.datetime(2017, 3, 29, tzinfo=tz) # = PyBites 100 days :)

По PEP8 константы зададим символами в верхнем регистре с разделителем в виде подчёркивания. Очень удобный расчёт дат:

CURRENT_CHALLENGE_DAY = str((now - start).days).zfill(3)
LOG = 'https://raw.githubusercontent.com/pybites/100DaysOfCode/master/LOG.md'
LOG_ENTRY = re.compile(r'\[(?P.*?)\]\((?P<day>\d+)\)')<br /> REPO_URL = 'https://github.com/pybites/100DaysOfCode/tree/master/'<br /> TWEET_LEN = 140<br /> TWEET_LINK_LEN = 23</code><br /> Ну и куда без requests? Так одной строкой я получаю файл LOG.md из <a href="https://github.com/pybites/100DaysOfCode" target="_blank">репозитория</a>:</p> <p><code>def get_log():<br /> return requests.get(LOG).text.split('\n')</code><br /> Получим название скрипта и строку с соответствующей датой из LOG.md (сегодня = ‘007’):</p> <p><code>def get_day_progress(html):<br /> lines = [line.strip()<br /> for line in html<br /> if line.strip()]</p> <p> for line in lines:<br /> day_entry = line.strip('|').split('|')[0].strip()<br /> if day_entry == CURRENT_CHALLENGE_DAY:<br /> return LOG_ENTRY.search(line).groupdict()</code><br /> Создаём твит. Я добавил немного кода для сокращения названия скрипт, если он превышает допустимый размер твита:</p> <p><code>def create_tweet(m):<br /> ht1, ht2 = '#100DaysOfCode', '#Python'<br /> title = m['title']<br /> day = m['day']<br /> url = REPO_URL + day<br /> allowed_len = TWEET_LEN + len(url) - TWEET_LINK_LEN</p> <p> fmt = '{} - Day {}: {} {} {}'<br /> tweet = fmt.format(ht1, day, title, url, ht2)<br /> surplus = len(tweet) - allowed_len</p> <p> if surplus > 0:<br /> new_title = title[:-(surplus + 4)] + '...'<br /> tweet = tweet.replace(title, new_title)<br /> return tweet</code><br /> Метод tweet_status() отправляет твит. Здесь мы используем импортированный объект api (из config.py) для отправки твита, а также запишем в лог информацию об успешной отправке или об ошибке:</p> <p><code>def tweet_status(tweet):<br /> try:<br /> api.update_status(tweet)<br /> logging.info('Posted to Twitter')<br /> except Exception as exc:<br /> logging.error('Error posting to Twitter: {}'.format(exc))</code><br /> Будем запускать наш скрипт из main. Также я добавил несколько переменных для проверок:</p> <p><code>if __name__ == '__main__':<br /> import socket<br /> local = 'MacBook' in socket.gethostname()<br /> test = local or 'dry' in sys.argv[1:]</code><br /> В режиме тестирования я использую локальный файл LOG:</p> <p><code> if test:<br /> log = os.path.basename(LOG)<br /> with open(log) as f:<br /> html = f.readlines()<br /> else:<br /> html = get_log()</code><br /> Если по какой-то причине я не смогу получить данные из get_day_progress(), скрипт прекратит работу и в лог запишется ошибка:</p> <p><code> m = get_day_progress(html)<br /> if not m:<br /> logging.error('Error getting day progress from log')<br /> sys.exit(1)</code><br /> Создаём твит. В режиме тестирования просто запишем его в лог, иначе — отправляем:</p> <p><code> tweet = create_tweet(m)<br /> if test:<br /> logging.info('Test: tweet to send: {}'.format(tweet))<br /> else:<br /> tweet_status(tweet)</code></p> <h6>Деплой</h6> <p>Есть несколько вещей, которые необходимо сделать для работы нашей программы: source .bashrc для загрузки переменных среды, экспортировать PYTHONPATH, задать полный путь до python3. И как <a href="https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables/27291#27291" target="_blank">сказано здесь</a>: «Cron ничего не знает о вашей оболочке; он запускается системой, поэтому у него минимум данных о среде.»</p> <p><code>$ crontab -l<br /> ...<br /> 34 14 * * * source $HOME/.bashrc && export PYTHONPATH=$HOME/bin/python3/lib/python3.5/site-packages && cd $HOME/code/100days/007 && $HOME/bin/python3/bin/python3.5 100day_autotweet.py</code></p> <h6>Результат</h6> <p>Какое совпадение: твит о прогрессе за сегодня как раз ушёл 🙂</p> <p><img title="Как мы автоматизировали ежедневный твит проекта 100DaysOfCode" src="http://tehnojam.ru/uploads/images/00/00/24/2017/04/21/a7ac1c02ac.png" class="image-center" alt="Как мы автоматизировали ежедневный твит проекта 100DaysOfCode" /></p> <h6>Логгирование</h6> <p>Очень полезная фишка модуля логгирования — автоматическое получение лога всех внешних модулей. Посмотрите в лог, там намного больше, чем пишет моя программа:</p> <p><code>$ vi 100day_autotweet.log<br /> ...<br /> ...<br /> 14:34:02 tweepy.binder INFO PARAMS: {'status': b'#100DaysOfCode - Day 007: script to automatically tweet 100DayOfCode progress tweet https://github.com/pybites/100DaysOfCode/tree/master/007 #Python'}<br /> ...<br /> many more log entries ...<br /> ...<br /> 14:34:02 requests.packages.urllib3.connectionpool DEBUG https://api.twitter.com:443 "POST /1.1/statuses/update.json?status={33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}23100DaysOfCode+-+Day+007{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}3A+script+to+automatically+tweet+100DayOfCode+progress+tweet+https{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}3A{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2F{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2Fgithub.com{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2Fpybites{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2F100DaysOfCode{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2Ftree{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2Fmaster{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}2F007+{33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}23Python HTTP/1.1" 200 2693<br /> 14:34:02 root INFO Posted to Twitter ==> my message</code><br /> Конечно, это можно отключить, повысив уровень логгирования (INFO или ещё выше) в logging.basicConfig (в config.py). Ну и почитайте <a href="https://docs.python.org/3/library/logging.html" target="_blank">документацию</a> про это.</p> <p>По материалам «How we Automated our 100DaysOfCode Daily Tweet».</p> <div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-gravatar"><img title="Как мы автоматизировали ежедневный твит проекта 100DaysOfCode" alt="Как мы автоматизировали ежедневный твит проекта 100DaysOfCode" alt='' src='https://secure.gravatar.com/avatar/3c9a724edc3d5745342294aed20872a8?s=100&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/3c9a724edc3d5745342294aed20872a8?s=200&d=mm&r=g 2x' class='avatar avatar-100 photo' height='100' width='100' itemprop="image"/></div><div class="saboxplugin-authorname"><a href="https://tehnojam.ru/category/author/fokusov" class="vcard author" rel="author" itemprop="url"><span class="fn" itemprop="name">Фокусов Игорь</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.</p> <p>Пишите: <a href="https://t.me/ighar">@ighar</a>. <a href="https://money.yandex.ru/to/410011020365993">Buy me a coffee, please</a> :).</p> </div></div><div class="clearfix"></div><div class="saboxplugin-socials "><a target="_self" href="mailto:igor@fokusov.com" rel="nofollow" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-user_email" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M502.3 190.8c3.9-3.1 9.7-.2 9.7 4.7V400c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V195.6c0-5 5.7-7.8 9.7-4.7 22.4 17.4 52.1 39.5 154.1 113.6 21.1 15.4 56.7 47.8 92.2 47.6 35.7.3 72-32.8 92.3-47.6 102-74.1 131.6-96.3 154-113.7zM256 320c23.2.4 56.6-29.2 73.4-41.4 132.7-96.3 142.8-104.7 173.4-128.7 5.8-4.5 9.2-11.5 9.2-18.9v-19c0-26.5-21.5-48-48-48H48C21.5 64 0 85.5 0 112v19c0 7.4 3.4 14.3 9.2 18.9 30.6 23.9 40.7 32.4 173.4 128.7 16.8 12.2 50.2 41.8 73.4 41.4z"></path></svg></span></a></div></div><div class="post-views post-504 entry-meta"> <span class="post-views-icon fa fa-eye"></span> <span class="post-views-count">0</span> </div> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://tehnojam.ru/category/category/development" rel="category tag">Разработка</a></span> <nav id="nav-below" class="post-navigation"> <span class="screen-reader-text">Post navigation</span> <div class="nav-previous"><span class="prev" title="Previous"><a href="https://tehnojam.ru/category/development/generirovanie-dokumentov-odt-s-secretary-v-django.html" rel="prev">Генерирование документов ODT с Secretary в Django</a></span></div><div class="nav-next"><span class="next" title="Next"><a href="https://tehnojam.ru/category/back-to-the-future/baidu-vypustit-svobodnuju-operacionnuju-sistemu-dlja-bespilotnyh-avtomobilej.html" rel="next">Baidu выпустит свободную операционную систему для беспилотных автомобилей</a></span></div> </nav><!-- #nav-below --> </footer><!-- .entry-meta --> </div><!-- .inside-article --> </article><!-- #post-## --> <div class="comments-area"> <div id="comments"> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title">Leave a Comment <small><a rel="nofollow" id="cancel-comment-reply-link" href="/category/development/kak-my-avtomatizirovali-ezhednevnyj-tvit-proekta-100daysofcode.html#respond" style="display:none;">Отменить ответ</a></small></h3><form action="https://tehnojam.ru/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate><p class="comment-form-comment"><label for="comment" class="screen-reader-text">Comment</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p><label for="author" class="screen-reader-text">Name</label><input placeholder="Name *" id="author" name="author" type="text" value="" size="30" /> <label for="email" class="screen-reader-text">Email</label><input placeholder="Email *" id="email" name="email" type="email" value="" size="30" /> <label for="url" class="screen-reader-text">Website</label><input placeholder="Website" id="url" name="url" type="url" value="" size="30" /> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='504' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="479c1184ca" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="196"/></p></form> </div><!-- #respond --> </div><!-- #comments --> </div> </main><!-- #main --> </div><!-- #primary --> <div id="right-sidebar" itemtype="https://schema.org/WPSideBar" itemscope="itemscope" class="widget-area grid-25 tablet-grid-25 grid-parent sidebar"> <div class="inside-right-sidebar"> <aside id="social_icon_widget-2" class="widget inner-padding widget_social_icon_widget"><h2 class="widget-title">Подпишись на нас</h2><a title="Twitter" target="_blank" href="https://twitter.com/tehnojampro"><i class="fa fa-twitter"></i></a><a title="Facebook" target="_blank" href="https://www.facebook.com/tehnojam"><i class="fa fa-facebook"></i></a><a title="Google Plus" target="_blank" href="https://plus.google.com/communities/101049307081024540315"><i class="fa fa-google-plus"></i></a><a title="Telegram" target="_blank" href="http://t.me/tehnojam"><i class="fa fa-telegram"></i></a><a title="VK" target="_blank" href="https://vk.com/tehnojam"><i class="fa fa-vk"></i></a></aside><aside id="custom_html-4" class="widget_text widget inner-padding widget_custom_html"><h2 class="widget-title">Реклама</h2><div class="textwidget custom-html-widget"><a target="_blank" href="http://radiotony.ru" rel="noopener noreferrer"><img src="https://tehnojam.ru/wp-content/uploads/rtony.jpg" alt="Лучший Подкаст" style="opacity: 1;" width="300" ></a> <script data-ad-client="ca-pub-5559417666721130" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script></div></aside><aside id="categories-2" class="widget inner-padding widget_categories"><h2 class="widget-title">Категории</h2> <ul> <li class="cat-item cat-item-113"><a href="https://tehnojam.ru/category/category/it-comics" title="В Этой категории размещаются юморные картинки и комиксы из мира IT">IT Комиксы</a> </li> <li class="cat-item cat-item-1"><a href="https://tehnojam.ru/category/category/%d0%b1%d0%b5%d0%b7-%d1%80%d1%83%d0%b1%d1%80%d0%b8%d0%ba%d0%b8">Без рубрики</a> </li> <li class="cat-item cat-item-12"><a href="https://tehnojam.ru/category/category/secure" title="В этой категории размещаются статьи о компьютерной и интернет безопасности">Безопасность</a> </li> <li class="cat-item cat-item-8"><a href="https://tehnojam.ru/category/category/hardware" title="Категория о компьютерном железе, презентации нового оборудования и обсуждения старого оборудования.">Железо</a> </li> <li class="cat-item cat-item-195"><a href="https://tehnojam.ru/category/category/zhiza">Жиза</a> </li> <li class="cat-item cat-item-10"><a href="https://tehnojam.ru/category/category/internet-of-things" title="Интернет вещей всё плотнее входит в нашу жизнь, потому эта рубрика об этом.">Интернет вещей</a> </li> <li class="cat-item cat-item-9"><a href="https://tehnojam.ru/category/category/back-to-the-future" title="Статьи о новейших технологиях">Назад в будущее</a> </li> <li class="cat-item cat-item-6"><a href="https://tehnojam.ru/category/category/it-news" title="Здесь размещаются Новости мира информационных технологий">Новости IT</a> </li> <li class="cat-item cat-item-5"><a href="https://tehnojam.ru/category/category/development" title="Статьи так или иначе касающиеся разработки программного обеспечения. Здесь размещаются мануалы и практическое руководство мира разработки.">Разработка</a> </li> <li class="cat-item cat-item-4"><a href="https://tehnojam.ru/category/category/software" title="Категория со статьями о программном обеспечении">Софт</a> </li> <li class="cat-item cat-item-11"><a href="https://tehnojam.ru/category/category/itagregator">Техноагрегатор</a> </li> <li class="cat-item cat-item-7"><a href="https://tehnojam.ru/category/category/technologies" title="Статьи о новых технологиях и инновациях">Технологии</a> </li> </ul> </aside><aside id="better_recent_comments-2" class="widget inner-padding widget_recent_comments"><h2 class="widget-title">Свежие комментарии</h2><ul id="better-recent-comments" class="recent-comments-list with-avatars"><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/0c40ffbd3645e1b4478470fe161e91cf?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/0c40ffbd3645e1b4478470fe161e91cf?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link"><a href='https://teleg.run/Doorway4ik' rel='external nofollow ugc' class='url'>manjarqo</a></span> on <span class="comment-post"><a href="https://tehnojam.ru/category/software/delaem-vyvod-zvuka-na-dva-ustrojstva-linux_windows.html#comment-496">Делаем вывод звука на два устройства (Linux,Windows, Mac OS X)</a></span></div></li><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/6f0f20d94f195a884f807e935060cbb5?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/6f0f20d94f195a884f807e935060cbb5?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link">Nikita</span> on <span class="comment-post"><a href="https://tehnojam.ru/category/software/delaem-vyvod-zvuka-na-dva-ustrojstva-linux_windows.html#comment-491">Делаем вывод звука на два устройства (Linux,Windows, Mac OS X)</a></span></div></li><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/f7ef78eff63dfb942466f80258d661af?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/f7ef78eff63dfb942466f80258d661af?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link">Cryptic</span> on <span class="comment-post"><a href="https://tehnojam.ru/category/software/esli-treshit-zvuk-v-hackintosh-i-speshat-chasy.html#comment-488">Eсли трещит звук в hackintosh и спешат часы</a></span></div></li><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/b36f949965bb2691558644593a9a3e4d?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/b36f949965bb2691558644593a9a3e4d?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link">Evgeny</span> on <span class="comment-post"><a href="https://tehnojam.ru/category/software/sozdanie-zagruzochnoj-fleshki-mac-os-ustanovka-hackintosh.html#comment-478">Создание загрузочной флешки Mac OS — Установка Hackintosh 1</a></span></div></li><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/5797b992179816ef2558ae5a7cda7506?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/5797b992179816ef2558ae5a7cda7506?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link">Виктор</span> on <span class="comment-post"><a href="https://tehnojam.ru/category/software/vosstanovlenie-mac-os-cherez-internet.html#comment-477">Как восстановить Mac OS через интернет</a></span></div></li><li class="recentcomments recent-comment"><div class="comment-wrap" style="padding-left:50px; min-height:44px;"><span class="comment-avatar"><img alt='' src='https://secure.gravatar.com/avatar/d81c0db6cf498fd2560405d3067d30e1?s=40&d=mm&r=g' srcset='https://secure.gravatar.com/avatar/d81c0db6cf498fd2560405d3067d30e1?s=80&d=mm&r=g 2x' class='avatar avatar-40 photo' height='40' width='40' /></span> <span class="comment-author-link">Алексей М</span> on <span class="comment-post"><a href="https://tehnojam.ru/category/%d0%b1%d0%b5%d0%b7-%d1%80%d1%83%d0%b1%d1%80%d0%b8%d0%ba%d0%b8/macos-catalina-i-1c.html#comment-474">MacOS Catalina и 1C</a></span></div></li></ul></aside><aside id="recent-posts-widget-with-thumbnails-2" class="widget inner-padding recent-posts-widget-with-thumbnails"><div id="rpwwt-recent-posts-widget-with-thumbnails-2" class="rpwwt-widget"> <h2 class="widget-title">Свежие записи</h2> <ul> <li><a href="https://tehnojam.ru/category/software/kak-ubrat-razryvy-jekrana-tiring-v-linux.html"><span class="rpwwt-post-title">Избавляемся от тиринга в Linux</span></a></li> <li><a href="https://tehnojam.ru/category/zhiza/trudisnah.html"><img width="70" height="70" src="https://tehnojam.ru/wp-content/uploads/2019/11/christopher-burns-8kfcr12oeum-unsplash-150x150.jpg" class="attachment-70x70 size-70x70 wp-post-image" alt="" /><span class="rpwwt-post-title">Трудисьнах</span></a></li> <li><a href="https://tehnojam.ru/category/%d0%b1%d0%b5%d0%b7-%d1%80%d1%83%d0%b1%d1%80%d0%b8%d0%ba%d0%b8/macos-catalina-i-1c.html"><img width="70" height="70" src="https://tehnojam.ru/wp-content/uploads/2018/11/bez-imeni-1-150x150.jpg" class="attachment-70x70 size-70x70 wp-post-image" alt="" /><span class="rpwwt-post-title">MacOS Catalina и 1C</span></a></li> <li><a href="https://tehnojam.ru/category/zhiza/karma-ujarma.html"><img width="70" height="70" src="https://tehnojam.ru/wp-content/uploads/2019/11/milayaya-19051912280628_5-150x150.jpg" class="attachment-70x70 size-70x70 wp-post-image" alt="" /><span class="rpwwt-post-title">Карма-*уярма или НКИБМШЫБ</span></a></li> <li><a href="https://tehnojam.ru/category/zhiza/chitajnah.html"><img width="70" height="70" src="https://tehnojam.ru/wp-content/uploads/2019/11/biblioteka-nogi-knigi-chitaet-150x150.jpg" class="attachment-70x70 size-70x70 wp-post-image" alt="" /><span class="rpwwt-post-title">Читайнах</span></a></li> <li><a href="https://tehnojam.ru/category/zhiza/uspeh-v-predprinimatelstve-ili-kak-zabit-herpoelu.html"><img width="70" height="70" src="https://tehnojam.ru/wp-content/uploads/2019/11/futbol-150x150.jpeg" class="attachment-70x70 size-70x70 wp-post-image" alt="" /><span class="rpwwt-post-title">Успех в предпринимательстве или как забить Херпоелу</span></a></li> </ul> </div><!-- .rpwwt-widget --> </aside> </div><!-- .inside-right-sidebar --> </div><!-- #secondary --> </div><!-- #content --> </div><!-- #page --> <div class="site-footer grid-container grid-parent "> <footer class="site-info" itemtype="https://schema.org/WPFooter" itemscope="itemscope"> <div class="inside-site-info grid-container grid-parent"> <div class="copyright-bar"> © 2018 All rights reserved Tehnojam.pro </div> </div> </footer><!-- .site-info --> </div><!-- .site-footer --> <a title="Scroll back to top" rel="nofollow" href="#" class="koromo-back-to-top" style="opacity:0;visibility:hidden;" data-scroll-speed="400" data-start-scroll="300"> <span class="screen-reader-text">Scroll back to top</span> </a> <div class="koromo-side-left-cover"></div> <div class="koromo-side-right-cover"></div> </div> <link rel='stylesheet' id='hljstheme-css' href='https://tehnojam.ru/wp-content/plugins/wp-code-highlightjs/styles/default.css?ver=0.6.2' type='text/css' media='all' /> <script type='text/javascript'> /* <![CDATA[ */ var wpcf7 = {"apiSettings":{"root":"https:\/\/tehnojam.ru\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"}}; /* ]]> */ </script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=5.1.5'></script> <script type='text/javascript'> /* <![CDATA[ */ var PT_CV_PUBLIC = {"_prefix":"pt-cv-","page_to_show":"5","_nonce":"aa1ac42c68","is_admin":"","is_mobile":"","ajaxurl":"https:\/\/tehnojam.ru\/wp-admin\/admin-ajax.php","lang":"","loading_image_src":"data:image\/gif;base64,R0lGODlhDwAPALMPAMrKygwMDJOTkz09PZWVla+vr3p6euTk5M7OzuXl5TMzMwAAAJmZmWZmZszMzP\/\/\/yH\/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAPACwAAAAADwAPAAAEQvDJaZaZOIcV8iQK8VRX4iTYoAwZ4iCYoAjZ4RxejhVNoT+mRGP4cyF4Pp0N98sBGIBMEMOotl6YZ3S61Bmbkm4mAgAh+QQFCgAPACwAAAAADQANAAAENPDJSRSZeA418itN8QiK8BiLITVsFiyBBIoYqnoewAD4xPw9iY4XLGYSjkQR4UAUD45DLwIAIfkEBQoADwAsAAAAAA8ACQAABC\/wyVlamTi3nSdgwFNdhEJgTJoNyoB9ISYoQmdjiZPcj7EYCAeCF1gEDo4Dz2eIAAAh+QQFCgAPACwCAAAADQANAAAEM\/DJBxiYeLKdX3IJZT1FU0iIg2RNKx3OkZVnZ98ToRD4MyiDnkAh6BkNC0MvsAj0kMpHBAAh+QQFCgAPACwGAAAACQAPAAAEMDC59KpFDll73HkAA2wVY5KgiK5b0RRoI6MuzG6EQqCDMlSGheEhUAgqgUUAFRySIgAh+QQFCgAPACwCAAIADQANAAAEM\/DJKZNLND\/kkKaHc3xk+QAMYDKsiaqmZCxGVjSFFCxB1vwy2oOgIDxuucxAMTAJFAJNBAAh+QQFCgAPACwAAAYADwAJAAAEMNAs86q1yaWwwv2Ig0jUZx3OYa4XoRAfwADXoAwfo1+CIjyFRuEho60aSNYlOPxEAAAh+QQFCgAPACwAAAIADQANAAAENPA9s4y8+IUVcqaWJ4qEQozSoAzoIyhCK2NFU2SJk0hNnyEOhKR2AzAAj4Pj4GE4W0bkJQIAOw==","is_mobile_tablet":"","sf_no_post_found":"\u0417\u0430\u043f\u0438\u0441\u0435\u0439 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e."}; var PT_CV_PAGINATION = {"first":"\u00ab","prev":"\u2039","next":"\u203a","last":"\u00bb","goto_first":"\u041d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443","goto_prev":"\u041d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443","goto_next":"\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443","goto_last":"\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443","current_page":"\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","goto_page":"\u041d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443"}; /* ]]> */ </script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/content-views-query-and-display-post-page/public/assets/js/cv.js?ver=2.2.0'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/pt-content-views-pro/public/assets/js/cvpro.min.js?ver=5.4.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var pvcArgsFrontend = {"mode":"ajax","requestURL":"https:\/\/tehnojam.ru\/wp-content\/plugins\/post-views-counter\/includes\/ajax.php","postID":"504","nonce":"b8c96ae7e6"}; /* ]]> */ </script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/post-views-counter/js/frontend.js?ver=1.3.1'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/simple-share-buttons-adder/js/ssba.js?ver=5.3'></script> <script type='text/javascript'> Main.boot( [] ); </script> <script type='text/javascript'> /* <![CDATA[ */ var sticky_anything_engage = {"element":null,"topspace":"0","minscreenwidth":"0","maxscreenwidth":"999999","zindex":"1","legacymode":"1","dynamicmode":"","debugmode":null,"pushup":"","adminbar":"1"}; /* ]]> */ </script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/sticky-menu-or-anything-on-scroll/assets/js/stickThis.js?ver=2.1.1'></script> <!--[if lte IE 11]> <script type='text/javascript' src='https://tehnojam.ru/wp-content/themes/Koromo/js/classList.min.js?ver=1.0.1'></script> <![endif]--> <script type='text/javascript' src='https://tehnojam.ru/wp-content/themes/Koromo/js/menu.min.js?ver=1.0.1'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/themes/Koromo/js/a11y.min.js?ver=1.0.1'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/themes/Koromo/js/navigation-search.min.js?ver=1.0.1'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/themes/Koromo/js/back-to-top.min.js?ver=1.0.1'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-includes/js/comment-reply.min.js?ver=5.3'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/q2w3-fixed-widget/js/q2w3-fixed-widget.min.js?ver=5.1.9'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-includes/js/wp-embed.min.js?ver=5.3'></script> <script type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/wp-code-highlightjs/highlight.common.pack.js?ver=0.6.2'></script> <script async="async" type='text/javascript' src='https://tehnojam.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.1.3'></script> <style>code.hljs { /*margin: 5px;*/ }</style> <script type="text/javascript"> (function($, window) { var init_fn_flag = false; var init_fn = (function() { if (init_fn_flag) return; init_fn_flag = true; hljs.configure({"tabReplace":" "}); $('pre code').each(function(i, block) { hljs.highlightBlock(block); }); }); $(document).ready(init_fn); $(window).on("load", init_fn); })(jQuery, window); </script> </body> </html>