<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>lust g</title><generator>teletype.in</generator><description><![CDATA[lust g]]></description><link>https://teletype.in/@seswq?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/seswq?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/seswq?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Jul 2026 10:37:32 GMT</pubDate><lastBuildDate>Sun, 05 Jul 2026 10:37:32 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@seswq/Nm2MVU2zh</guid><link>https://teletype.in/@seswq/Nm2MVU2zh?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq</link><comments>https://teletype.in/@seswq/Nm2MVU2zh?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq#comments</comments><dc:creator>seswq</dc:creator><title>LightShot и чужие скриншоты</title><pubDate>Thu, 13 May 2021 20:47:22 GMT</pubDate><category>Веб-мастер</category><description><![CDATA[<img src="https://habrastorage.org/storage3/a82/694/0bb/a826940bbaee9c7a78df0df118036864.gif"></img>Результат выполнения в браузере (как видно, ~95% сгенерированных рандомных ссылок выдают скриншоты)]]></description><content:encoded><![CDATA[
  <pre>&lt;?php
set_time_limit(0); // убираем ограничение по времени выполнения скрипта
ob_implicit_flush();

function random_string($length)
{ // функция генерации рандомной строки
	$chars = &quot;abcdefghijklmnopqrstuvwxyz1234567890&quot;; // символы из которых генерируем
	$numChars = strlen($chars); // Определяем длину $chars
	$string = &#x27;&#x27;; // задаем пустую переменную
	for ($i = 0; $i &lt; $length; $i++) { // Собираем строку
		$string.= substr($chars, rand(1, $numChars) - 1, 1);
	}
	return $string; // Возвращаем готовую строку
}

function get_http_response_code($url) { // функция проверки http кода
	$headers = get_headers($url);
	return substr($headers[0], 9, 3);
}

if (!file_exists(&#x27;lightshot_images&#x27;)) { // создаем директорию куда сохранять картинки, если отсутствует
	mkdir(&#x27;lightshot_images&#x27;, 0777);
}

$options = array(
	&#x27;http&#x27; =&gt; array(
		&#x27;method&#x27; =&gt; &quot;GET&quot;,
		&#x27;header&#x27; =&gt; &quot;Accept-language: en\r\n&quot; . &quot;User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n&quot;
	)
);
$context = stream_context_create($options);

while (1) {
	$randstring = random_string(5); // генерируем рандомную сроку
	$htmldata = file_get_contents(&#x27;https://prnt.sc/m&#x27; . $randstring, false, $context); // подставляем рандомную строку и получаем код страницы
	preg_match_all(&#x27;/&lt;meta name=\&quot;twitter:image:src\&quot; content=\&quot;(.*?)\&quot;\/&gt;/is&#x27;, $htmldata, $img_url); // парсим регуляркой url картинки
	if (strlen($img_url[1][0]) &gt; 1) { // проверяем длину полученной строки, если больше 1 - картинка по этому адресу есть
		$imgs = str_replace(&#x27;//st.prntscr&#x27;, &#x27;https://st.prntscr&#x27;, $img_url[1][0]);
		$localname = array_pop(explode(&#x27;/&#x27;, $img_url[1][0])); // разбиваем строку в массив и извлекаем последний элемент массива (т.е. imagename.png)
		$localpath = &quot;./lightshot_images/&quot; . $localname; // определяем куда будет сохраняться картинка локально.
		if (get_http_response_code($imgs) != &quot;200&quot;) {
			echo &quot;&lt;span style=&#x27;color:red;display:block;margin-bottom:10px;font-size:14px;&#x27;&gt;404. По адресу &quot; . $imgs . &quot; картинки больше нет :(&lt;/span&gt;&quot;;
		} else {
			file_put_contents($localpath, file_get_contents($imgs, false, $context)); // скачиваем, можно было бы реализовать через curl, но на мой взгляд это проще и быстрее
			echo &quot;&lt;span style=&#x27;color:green;display:block;margin-bottom:10px;font-size:14px;&#x27;&gt;Сохранение - &quot; . $localname . &quot; , url - http://prntscr.com/m&quot; . $randstring . &quot; , скачиваем с &quot; . $imgs . &quot;&lt;/span&gt;&quot;;
		}
	} else {
		echo &quot;&lt;span style=&#x27;color:red;display:block;margin-bottom:10px;font-size:14px;&#x27;&gt;По адресу http://prntscr.com/m&quot; . $randstring . &quot; нет картинки&lt;/span&gt;&quot;;
	}
}
?&gt;
</pre>
  <p>Результат выполнения в браузере (как видно, ~95% сгенерированных рандомных ссылок выдают скриншоты)</p>
  <figure class="m_original">
    <img src="https://habrastorage.org/storage3/a82/694/0bb/a826940bbaee9c7a78df0df118036864.gif" width="846" />
  </figure>
  <p>В итоге накачал целую кучу скриншотов, среди которых есть слишком личные фото людей, скриншоты кода, и много других интересных вещей.</p>
  <p><strong>UPD 2018:</strong> Поправил скрипт с учетом изменений произошедших на lightshot. Теперь снова работает.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@seswq/ybFumGXkQd6</guid><link>https://teletype.in/@seswq/ybFumGXkQd6?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq</link><comments>https://teletype.in/@seswq/ybFumGXkQd6?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq#comments</comments><dc:creator>seswq</dc:creator><title>Полезные и проверенные боты Telegram</title><pubDate>Thu, 13 May 2021 20:41:41 GMT</pubDate><category>Веб-мастер</category><description><![CDATA[Последнее обновление 02.12.18]]></description><content:encoded><![CDATA[
  <p><strong><em>Последнее обновление 02.12.18</em></strong></p>
  <p>Ботов в Телеграм сейчас уже как грязи. С каждым днем их становится все больше и больше, а функционал обрастает новыми возможностями. Это нормально, т.к. мессенджер постоянно развивается, аудитория Телеграм растет бешеными темпами, появляются конструкторы ботов, пользователи делают собственных...</p>
  <p>Каждого бота нужно найти, запустить, проверить, а если бот говно - отключить и удалить... время, время и еще раз время.</p>
  <p>Но телеграм любят из-за того, что он позволяет экономить время, а не тратить. Я за вас потратил свое время, проверил, изучил и сделал подборку самых популярных и полезных ботов. Их не 5, 7, 10 как пишут во многих других статьях (по-правде говоря и не пишут вовсе, а тупо копируют друг у друга), а <strong>больше 60 must have ботов</strong>. Поехали!</p>
  <p>Все боты разделены по рубрикам. Чтобы запустить любого бота достаточно перейти по ссылке и нажать кнопку &quot;Начать&quot; (Start). Бывает, что разработчики бота перестают его развивать и он умирает долгой и мучительной смертью, если Вы нашли такого, пишите мне в <a href="https://t.me/niktobesfamilniy" target="_blank">Telegram</a> и я его отправлю на кладбище ботов.</p>
  <h3><strong>Must Have финансовые и криптовалютные боты:</strong></h3>
  <ol>
    <li><a href="https://telegram.me/profitrobot?start=549f6ef7c5340c6bbcfe259c933987d9" target="_blank">https://t.me/ProfitRobot</a> - заработок на офферах, веб-серфинге, партнерской программе.</li>
    <li><a href="https://t.me/Moneytellbot?start=617693725" target="_blank">https://t.me/Moneytellbot</a> - раскрутка телеграм-каналов. Можно зарабатывать на выполнении заданий.</li>
    <li><a href="http://telegram.me/BTC_CHANGE_BOT?start=617693725ssAffiliate" target="_blank">https://t.me/BTC_CHANGE_BOT</a> - продажа и покупка Bitcoin, бесплатные кошельки, заработок на комиссиях.</li>
    <li><a href="http://telegram.me/DASH_CHANGE_BOT?start=617693725ssAffiliate" target="_blank">https://t.me/DASH_CHANGE_BOT</a> - быстрый и бесплатный кошелек, а также сервис моментально обмена криптовалюты DASH (DASH), заработок на комиссиях.</li>
    <li><a href="http://telegram.me/LTC_CHANGE_BOT?start=617693725ssAffiliate" target="_blank">https://t.me/LTC_CHANGE_BOT</a> - быстрый и бесплатный кошелек, а также сервис моментально обмена LTC (Litecoin), заработок на комиссиях.</li>
    <li><a href="http://telegram.me/DOGE_CHANGE_BOT?start=617693725ssAffiliate" target="_blank">https://t.me/DOGE_CHANGE_BOT</a> - быстрый и бесплатный кошелек, а также сервис моментально обмена DOGE (Dogecoin), заработок на комиссиях.</li>
    <li><a href="http://telegram.me/ETH_CHANGE_BOT?start=617693725ssAffiliate" target="_blank">http://telegram.me/ETH_CHANGE_BOT</a> - быстрый и бесплатный кошелек, а также сервис моментального обмена Ethereum, заработок на комиссиях.</li>
  </ol>
  <h3><strong>Must Have официальные боты (со звездочкой):</strong></h3>
  <ol>
    <li><a href="https://t.me/BotFather" target="_blank">https://t.me/BotFather</a> - отец всех ботов, главный и официальный бот Телеграм, создает ваших собственных ботов.</li>
    <li><a href="https://t.me/telegraph" target="_blank">https://t.me/telegraph</a> - бот для залогинивания в Telegra.ph (Телеграф), и просмотра всех своих статей.</li>
    <li><a href="https://t.me/SpamBot" target="_blank">https://t.me/SpamBot</a> - официальный бот, сообщает когда исчезнет блокировка вашего аккаунта из-за спама.</li>
    <li><a href="https://t.me/IFTTT" target="_blank">https://t.me/IFTTT</a> - бот известного сервиса для интеграции телеграм с другими сайтами и службами.</li>
    <li><a href="https://t.me/gamee" target="_blank">https://t.me/gamee</a> - бот для игр в телеграм.</li>
  </ol>
  <h3><strong>Must Have боты в помощь администратору канала:</strong></h3>
  <ol>
    <li><a href="https://t.me/vote" target="_blank">https://t.me/vote</a> - бот для создания анонимных опросов.</li>
    <li><a href="https://t.me/groupagreebot" target="_blank">https://t.me/groupagreebot</a> - бот для создания персонализированных опросов, проголосовавших видят все.</li>
    <li><a href="https://t.me/ControllerBot" target="_blank">https://t.me/ControllerBot</a> - бот-комбайн, для форматирования постов, публикации по таймингу, просмотра статистики и др.</li>
    <li><a href="https://t.me/markdownrobot" target="_blank">https://t.me/markdownrobot</a> - бот для публикаций в формате маркдаун.</li>
    <li><a href="https://t.me/chatkeeperbot" target="_blank">https://t.me/chatkeeperbot</a> - бот помогает в управлении группой с правилами, анти-флуд, описанием, пользовательскими триггерами, и многое другое.</li>
    <li><a href="https://t.me/UtmGeneratorBot" target="_blank">https://t.me/UtmGeneratorBot</a> - бот для генерации UTM меток в пару кликов.</li>
    <li><a href="https://t.me/combot" target="_blank">https://t.me/combot</a> - бот для администрирования чатов, сбора статистики и её визуализации.</li>
    <li><a href="https://t.me/LivegramBot" target="_blank">https://t.me/LivegramBot</a> - бот для создания своих ботов обратной связи.</li>
    <li><a href="https://telegram.me/chotamreaderbot" target="_blank">https://telegram.me/chotamreaderbot</a> - Автоматически переносит в Telegraph содержимое любой статьи — копирует заголовки, базовое форматирование, изображения и видео. Всё это пользователи Телеграм могут смотреть в режиме Instant View.</li>
    <li><a href="https://t.me/vk_bot" target="_blank">https://t.me/vk_bot</a> - интеграция с ВКонтакте, для админов групп VK.</li>
    <li><a href="https://t.me/banofbot" target="_blank">https://t.me/banofbot</a> - бот, организующий голосование за бан пользователя в отсутствие админов групп.</li>
    <li><a href="https://t.me/crssbot" target="_blank">https://t.me/crssbot</a> - бот создает RSS для вашего Telegram канала.</li>
    <li><a href="https://t.me/SecretgramBot" target="_blank">https://t.me/SecretgramBot</a> - создание анонимных комментов к посту.</li>
    <li><a href="https://t.me/ShortUrlRUBot" target="_blank">https://t.me/ShortUrlRUBot</a> - сокращатель ссылок.</li>
    <li><a href="https://t.me/crosser_bot" target="_blank">https://t.me/crosser_bot</a> - Бот считает пересечения в каналах/чатах. Показывает твою аудиторию. Спасает от неэффективных ВП. Экономит расходы на маркетинг. Чистит от неактивных и удаленных аккаунтов.</li>
  </ol>
  <h3><strong>Must Have боты для пользователей мессенджера:</strong></h3>
  <ol>
    <li><a href="https://t.me/tgvpnbot?start=5c62c0e527a0432" target="_blank">https://t.me/tgvpnbot</a> - быстрый, безопасный и безлимитный VPN для обхода различных блокировок и анонимизации деятельности в сети.</li>
    <li><a href="https://t.me/DrWebBot" target="_blank">https://t.me/DrWebBot</a> - бот антивирусник, проверяет файлы и сообщения на предмет вредоносных программ.</li>
    <li><a href="https://t.me/AVinfoBot" target="_blank">https://t.me/AVinfoBot</a> - проверка продавца автомобиля по телефону владельца, гос. номеру или VIN-номеру автомобиля.</li>
    <li><a href="https://t.me/zdorobot" target="_blank">https://t.me/zdorobot</a> - бот показывает инструкции к лекарствам, значение симптомов, позволяет заказать лекарства и др.</li>
    <li><a href="https://t.me/topdf_bot" target="_blank">https://t.me/topdf_bot</a> - конвертирует документы в pdf.</li>
    <li><a href="https://t.me/ya" target="_blank">https://t.me/ya</a> - бот яндекса, ищет любую информацию.</li>
    <li><a href="https://t.me/storebot" target="_blank">https://t.me/storebot</a> - бот-магазин, топ ботов, описания.</li>
    <li><a href="https://t.me/Dict_bot" target="_blank">https://t.me/Dict_bot</a> - бот переводит слова с английского языка на русский и обратно.</li>
    <li><a href="https://t.me/ipgeobot" target="_blank">https://t.me/ipgeobot</a> - бот для определения гео локации домена или IP.</li>
    <li><a href="https://t.me/voicybot" target="_blank">https://t.me/voicybot</a> - бот переводит в текст люыбе аудио и голосовые сообщения.</li>
    <li><a href="https://t.me/MyTeleCloudBot" target="_blank">https://t.me/MyTeleCloudBot</a> - личное облачное хранилище в телеграм, безлимитное и приватное.</li>
    <li><a href="https://t.me/Wikishbot" target="_blank">https://t.me/Wikishbot</a> - присылает статьи из википедии.</li>
    <li><a href="https://t.me/egrul_bot" target="_blank">https://t.me/egrul_bot</a> - умеет показывать информацию о юр. лицах и их учредителях.</li>
    <li><a href="https://t.me/tgchans_bot" target="_blank">https://t.me/tgchans_bot</a> - бот-поисковик по каналам и группам Телеграм.</li>
    <li><a href="https://t.me/TrafficRobot" target="_blank">https://t.me/TrafficRobot</a> - создает анонимный почтовый ящик, который можно в любой момент удалить, все письма приходят в Телеграм.</li>
    <li><a href="https://t.me/Cryptoneto_bot" target="_blank">https://t.me/Cryptoneto_bot</a> - самый быстрый криптоновостной бот в телеграме, оповещает о свежих новостях (по выбранной валюте) сразу после их публикации.</li>
  </ol>
  <h3><strong>Must Have боты для работы с соц. сетями:</strong></h3>
  <ol>
    <li><a href="https://t.me/Soberubot" target="_blank">https://t.me/Soberubot</a> - бот для парсинга списка аккаунтов подписчиков в Инстаграм.</li>
    <li><a href="https://t.me/hashtags_bot" target="_blank">https://t.me/hashtags_bot</a> - подбирает хештеги по фотографии, хештеги выдает на англ. языке.</li>
    <li><a href="https://t.me/JoinstaBot" target="_blank">https://t.me/JoinstaBot</a> - бесплатно накручивает лайки на любое фото в Инстаграм.</li>
    <li><a href="https://t.me/Instasave_bot" target="_blank">https://t.me/Instasave_bot</a> - скачивает фото и видео с Инстаграм и YouTube.</li>
    <li><a href="https://t.me/izibot" target="_blank">https://t.me/izibot</a> - бот скачивает видео из Instagram, YouTube, VK, FB и Coub.</li>
    <li><a href="https://t.me/pstrbot" target="_blank">https://t.me/pstrbot</a> - отправляет записи из разных социальных сетей в ваши каналы.</li>
    <li><a href="https://t.me/junction_bot?start=617693725" target="_blank">https://t.me/junction_bot</a> - бот собирает посты из Telegram и Twitter каналов в одну новостную ленту. Также можно использовать для трансляции каналов и других ботов в группы или в другие каналы.</li>
  </ol>
  <h3><strong>Must Have боты для развлечений и досуга:</strong></h3>
  <ol>
    <li><a href="https://t.me/guggystickerbot" target="_blank">https://t.me/guggystickerbot</a> - бот генерирует стикеры, вы пишите текст он подбирает стикер и вставляет текст.</li>
    <li><a href="https://t.me/tap2bot" target="_blank">https://t.me/tap2bot</a> - бот ищет фильмы, торенты, авиабилеты, гостиницы, кафе.</li>
    <li><a href="https://t.me/freelancehelp_bot" target="_blank">https://t.me/freelancehelp_bot</a> - бот который придумывает отмазки для фрилансеров.</li>
    <li><a href="https://t.me/guggybot" target="_blank">https://t.me/guggybot</a> - бот для постинга гифок (gif файлы).</li>
  </ol>
  <p><strong>Вступайте в наше комьюнити кибермастеров:</strong></p>
  <p><a href="https://t.me/cybermasters" target="_blank"><strong>https://t.me/cybermasters</strong></a></p>
  <p><a href="https://t.me/cybermasterschat" target="_blank"><strong>https://t.me/cybermasterschat</strong></a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@seswq/Blockchain_client</guid><link>https://teletype.in/@seswq/Blockchain_client?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq</link><comments>https://teletype.in/@seswq/Blockchain_client?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=seswq#comments</comments><dc:creator>seswq</dc:creator><title>Внедряем оплату BTC куда угодно (Python)</title><pubDate>Wed, 05 May 2021 20:58:07 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/1c/a8/1ca892b6-eafb-458f-beac-785732ddf822.png"></media:content><category>Веб-мастер</category><description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/73a/2c1/c5c/73a2c1c5c6153e56577cd941b4a04de8.jpeg"></img>Предыстория]]></description><content:encoded><![CDATA[
  <ul>
    <li>- генерация кошелька на основе seed фразы</li>
    <li>- проверка баланса и транзакций</li>
    <li>- отправка BTC на другие кошельки</li>
    <li>- создаем телеграм бота для выполнения операций с BTC</li>
    <li>- исходники бота (github)</li>
  </ul>
  <figure class="m_original">
    <img src="https://habrastorage.org/getpro/habr/upload_files/73a/2c1/c5c/73a2c1c5c6153e56577cd941b4a04de8.jpeg" width="696" />
    <figcaption>📍 Source 👉  <a href="https://habr.com/ru/post/525638/" target="_blank">https://habr.com/ru/post/525638/</a></figcaption>
  </figure>
  <p>Предыстория</p>
  <p>Полгода назад взялся за один проект с возможностью оплаты биткойном. Так как проект делали на языке python, то и оплату хотелось реализовать на нем же. Сразу же взялся анализировать готовые решения, доступные библиотеки и Rest API Blockchain.com. С апи блокчейна я моментально обломался, так как их токен для использования апи довольно не просто получить.</p>
  <p>Затем решил юзать различные библиотеки (block-io, bitcoinlib, blockchain и др.) После пару ночей попыток реализовать нормальную оплату, остановился на bitcoinlib, так как она более менее стабильно работала, и я спокойно переводил с одного кошелька на другой. Беда наступила когда появились первые 100 пользователей и вся оплата внезапно рухнула. Возможно я криво написал или что-то не так понял с работой библиотеки, но любые попытки восстановить работу оплаты были безуспешны, только если обнулять бдшку, но и так неизвестно сколько бы она продержалась.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/07/64/07644c77-4902-45e9-99de-fcc40accb23b.png" width="940" />
  </figure>
  <p>В итоге решили оставить без BTC оплаты. Я опечалился и не связывался с оплатой биткойном полгода.</p>
  <h2>К чему я пришел</h2>
  <p>На днях я все-таки решил добить этот вопрос для себя, надеюсь кому-то еще пригодятся мои наработки.</p>
  <p>Все начинается с <strong>seed </strong>фразы. Мнемоническая фраза (англ. Mnemonic phrase или Seed фраза) - это список слов, которые хранят всю информацию, необходимую для восстановления биткоин-кошелька. Существуют несколько стандартов генерации фраз BIP 32, BIP 39, BIP 44, и еще BIP 49. Самый распространенный - это BIP 44 (12 слов).</p>
  <p><strong>Пример seed фразы:</strong></p>
  <p>vivid area able second bicycle advance demand alpha flip stable drift route</p>
  <p>Чтобы сгенерировать фразу будем использовать библиотеку<strong> bipwallet</strong>. Чтобы ее установить воспользуемся командой<strong> pip install bipwallet</strong>.</p>
  <pre>from bipwallet import wallet

# generate 12 word mnemonic seed
seed = wallet.generate_mnemonic()

print(seed)
</pre>
  <p>Если мы хотим получить напрямую доступ к биткойн кошельку, то, зная фразу, можем сразу восставновить кошелек в blockhain.com:</p>
  <p><a href="https://login.blockchain.com/#/recover" target="_blank">https://login.blockchain.com/#/recover</a></p>
  <figure class="m_retina">
    <img src="https://habrastorage.org/getpro/habr/upload_files/dc0/c03/202/dc0c03202abe417ed613df27c1644023.JPG" width="278" />
  </figure>
  <p>Следующим шагом мы будем преобразовывать нашу seed фразу до получения нужного адреса кошелька биткойна.</p>
  <p>Чтобы во всем не запутаться и знать какие данные мы должны получить, я использовал сайт <a href="https://iancoleman.io/bip39/" target="_blank">https://iancoleman.io/bip39/</a></p>
  <figure class="m_retina">
    <img src="https://habrastorage.org/getpro/habr/upload_files/138/4e8/828/1384e88282bc9339997f980e9105d066.JPG" width="709.5" />
  </figure>
  <figure class="m_retina">
    <img src="https://habrastorage.org/getpro/habr/upload_files/d4b/b9b/24d/d4bb9b24d3a5a821cfae3f4adde7fded.JPG" width="862" />
  </figure>
  <h2>Генерация дочернего адреса кошелька для каждого пользователя:</h2>
  <p>Чтобы получить наш нулевой адрес Биткойн кошелька на основе seed фразы (12VeK1eRgPHRUikNLXq3Nuz99gS2S46QMD), нам нужно пройти всю цепочку преобразований. Методом проб и ошибок мне все-таки удалось получить адрес кошелька следующим кодом:</p>
  <pre>from bipwallet.utils import *

def gen_address(index):
    # Наша seed фраза
    seed = &#x27;vivid area able second bicycle advance demand alpha flip stable drift route&#x27;

    # Мастер ключ из seed фразы
    master_key = HDPrivateKey.master_key_from_mnemonic(seed)

    # Public key из мастер ключа по пути &#x27;m/44/0/0/0&#x27;
    root_keys = HDKey.from_path(master_key, &quot;m/44&#x27;/0&#x27;/0&#x27;/0&quot;)[-1].public_key.to_b58check()

    # Extended public key
    xpublic_key = str(root_keys, encoding=&quot;utf-8&quot;)

    # Адрес дочернего кошелька в зависимости от значения index
    address = Wallet.deserialize(xpublic_key, network=&#x27;BTC&#x27;).get_child(index, is_prime=False).to_address()

    rootkeys_wif = HDKey.from_path(master_key, f&quot;m/44&#x27;/0&#x27;/0&#x27;/0/{index}&quot;)[-1]

    # Extended private key
    xprivatekey = str(rootkeys_wif.to_b58check(), encoding=&quot;utf-8&quot;)

    # Wallet import format
    wif = Wallet.deserialize(xprivatekey, network=&#x27;BTC&#x27;).export_to_wif()

    return address, str(wif, &#x27;utf-8&#x27;)

print(gen_address(0))</pre>
  <p>Данная функция возвращает адрес кошелька и <strong>wif </strong>в зависимости номера. Максимальное число с которым удалось получить адрес это 999999999.</p>
  <p><strong>wif (Wallet import format)</strong> - это просто кодирование байтов ключа в кодировку Base58 + контрольная сумма. Он нам понадобится в дальнейшем при генерации транзакции.</p>
  <p>Это все значит, что имея только одну seed фразу мы можем создать 1 млрд дочерних адресов. Каждому пользователю при регистрации мы будем выдавать новый адрес, через который он сможет оплачивать по BTC. Появляется ограничение на 1 млрд пользователей, но нам никто не запрещает использовать несколько seed фраз или генерировать каждому юзеру новую фразу, но тогда каждая оплата будет кидаться не в общий ваш кошелек, а по разным.</p>
  <h2>Проверка баланса и транзакции:</h2>
  <p>Теперь когда у каждого пользователя свой личный адрес биткойн кошелька, нужно проверить баланс этого адреса. Для этого мы будем обращаться к сайту Blockchain.com дабы получить нужную информацию.</p>
  <pre>import requests

# Адрес кошелька пользователя 
wallet = &#x27;12VeK1eRgPHRUikNLXq3Nuz99gS2S46QMD&#x27;
# wallet = gen_address(0)

url = f&#x27;https://blockchain.info/rawaddr/{wallet}&#x27;
x = requests.get(url)
wallet = x.json()

print(&#x27;Итоговый баланс:&#x27;+str(wallet[&#x27;final_balance&#x27;]))
print(&#x27;Транзакции:&#x27;+str(wallet[&#x27;txs&#x27;]))

if wallet[&#x27;total_received&#x27;]==0:
  print(&#x27;баланс пустой&#x27;)
</pre>
  <p>Вот таким простым кодом мы можем получить всю информацию по балансу и транзакциях пользователя. Дальше все зависит от логики самого приложения.</p>
  <h2>Транзакции</h2>
  <p>На данном этапе мы дали каждому пользователю свой адрес кошелька и знаем все транзакции с данным адресом, но этого недостаточно. Нам нужно чтобы мы могли отправить его же деньги обратно. Для этого воспользуемся библотекой <strong>bit</strong>. Чтобы ее установить воспользуемся командой<strong> pip install bit</strong>.</p>
  <pre>from bit import PrivateKey

# Приватный ключ из wif
my_key = PrivateKey(wif=&#x27;L46ixenNSu8Bqk899ZrH8Y96t8DHqJ1ZyxzQBGFTbh38rLHLaPoY&#x27;)

# Количество долларов перевода, можно поменять на btc
money=0.1

# Кошелек куда будут переведены деньги
wallet=&#x27;17ya3bCpPioyPH8kAyFkEDBUqdjF6wwPxo&#x27;

# Коммисия перевода, если поставить слишком маленькую, то транзакцию не примут
# И чем больше коммисия, тем быстрее пройдет перевод
fee=2000

# Генерация транзакции
tx_hash = my_key.create_transaction([(wallet, money, &#x27;usd&#x27;)],fee=fee,absolute_fee=True)

print(tx_hash)</pre>
  <p>В итоге мы получили вот такую транзакцию:</p>
  <p><code>0100000001fe64490fce5e85d5eb00865663a3d44f4108549fdb2840b086cfc781390d4a2d010000006a47304402202dc1496d28bb10d50d94d70870e2a79ea472c5960de8f7418bb30f9b96643efc02204691547c98edad3181a056bf6404601efe289200ba8e3073a2f5b7c0c7f4fec10121026516c551584b484ce3ca7bb71bbf24cce133bf40bdf4e2ce5a3936bc7e66a2abffffffff02e3020000000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac08f40200000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac00000000</code></p>
  <p>Выглядит красиво, но что с этим делать?</p>
  <p>Можно зайти на сайт https://www.blockchain.com/btc/pushtx</p>
  <p>и вручную отправить эту транзакцию.</p>
  <figure class="m_retina">
    <img src="https://habrastorage.org/getpro/habr/upload_files/2ea/d99/8e0/2ead998e0715eb38b242518fd833fda7.JPG" width="503" />
  </figure>
  <p>Также можем декодировать эту транзакцию и проверить все ли верно мы указали <a href="https://www.blockchain.com/btc/decode-tx" target="_blank">https://www.blockchain.com/btc/decode-tx</a></p>
  <figure class="m_retina">
    <img src="https://habrastorage.org/getpro/habr/upload_files/25f/469/d8c/25f469d8c0ec42084eacee93b34b5758.JPG" width="626.5" />
  </figure>
  <p>Но нам нужно это автоматизировать, поэтому напишем несколько строк:</p>
  <pre>import requests

url = &#x27;https://blockchain.info/pushtx&#x27;
tx=&#x27;0100000001fe64490fce5e85d5eb00865663a3d44f4108549fdb2840b086cfc781390d4a2d010000006a47304402202dc1496d28bb10d50d94d70870e2a79ea472c5960de8f7418bb30f9b96643efc02204691547c98edad3181a056bf6404601efe289200ba8e3073a2f5b7c0c7f4fec10121026516c551584b484ce3ca7bb71bbf24cce133bf40bdf4e2ce5a3936bc7e66a2abffffffff02e3020000000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac08f40200000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac00000000&#x27;
x = requests.post(url, data = {&#x27;tx&#x27;:tx})
result = x.text

print(result)</pre>
  <p>Выполним пост запрос, если получаем ответ: <strong>Transaction Submitted</strong>. Это значит, что через несколько секунд транзакция появится в сети и деньги спишутся с пользователя.</p>
  <h2>Применение</h2>
  <p>Ну чтож, написав всего несколько десятков строк, мы можем генерировать для каждого пользователя свой адрес кошелка, проверять его баланс, переводить биткойны с одного кошелька на любой другой.</p>
  <p>Для демонстрации работы BTC оплаты, я напишу простенького телеграм бота, который будет выполнять роль клиента Blockchain.com, то есть вы сможете хранить в нем свои биткойны и от туда же переводить другим людям. Ссылка на исходники бота будут в конце.</p>
  <p>Проверить работу бота можно тут: <a href="https://t.me/Blockchain_client_bot" target="_blank"><strong>https://t.me/Blockchain_client_bot</strong></a></p>
  <p>Задеплоил на heroku, так что надеюсь не будет падать)</p>
  <h2>Функционал бота</h2>
  <h3>Регистрация пользователя</h3>
  <figure class="m_custom">
    <img src="https://habrastorage.org/getpro/habr/upload_files/588/8ff/c94/5888ffc94776105b8803c1ec0e2d2b27.JPG" width="485" />
  </figure>
  <p>В качестве БД я использовал sqlite3 и создал одну таблицу пользователей:</p>
  <pre>import sqlite3

conn = sqlite3.connect(&quot;my.db&quot;)  # или :memory: чтобы сохранить в RAM
cursor = conn.cursor()
cursor.execute(&quot;CREATE TABLE users (chatid INTEGER , name TEXT, balance INTEGER, btc_wallet TEXT, wif TEXT, btc_sent TEXT, state INTEGER)&quot;)
conn.commit()</pre>
  <p>При нажатии start мы регистрируем пользователя, генерируем для него адрес биткойн кошелька, wif и добавляем данные в БД:</p>
  <pre>sql = &quot;SELECT COUNT(*) FROM users &quot;
cursor.execute(sql)
user = cursor.fetchone()  
address, wif= gen_address(user[0]+1)
sql_insert = &quot;INSERT INTO users VALUES ({}, &#x27;{}&#x27;, 0,&#x27;{}&#x27;,&#x27;{}&#x27;,&#x27;no&#x27;,0)&quot;.format(message.chat.id,
                                                                           message.chat.first_name,address,wif)

cursor.execute(sql_insert)
conn.commit()</pre>
  <h3>Проверка баланса</h3>
  <figure class="m_custom">
    <img src="https://habrastorage.org/getpro/habr/upload_files/407/943/72b/40794372bb70bc16968071bf4dca8fcf.JPG" width="477" />
  </figure>
  <pre>if message.text == &#x27;? Ваш баланс&#x27;:
  url = f&#x27;https://blockchain.info/rawaddr/{data[3]}&#x27;
  x = requests.get(url)
  wallet = x.json()

  await bot.send_message(message.chat.id, f&#x27;&#x27;&#x27;? *Итоговый баланс:* {format(wallet[&#x27;final_balance&#x27;] / 100000000, &#x27;.9f&#x27;)} BTC

*Всего получено:* {format(wallet[&#x27;total_received&#x27;] / 100000000, &#x27;.9f&#x27;)} BTC
*Всего отправлено:* {format(wallet[&#x27;total_sent&#x27;] / 100000000, &#x27;.9f&#x27;)} BTC

https://www.blockchain.com/ru/btc/address/{data[3]}&#x27;&#x27;&#x27;, parse_mode= &quot;Markdown&quot;)</pre>
  <h2>Получить BTC</h2>
  <figure class="m_custom">
    <img src="https://habrastorage.org/getpro/habr/upload_files/ea0/0b6/dcf/ea00b6dcf448e661912c3936f15f5b0e.JPG" width="451" />
  </figure>
  <p>Для создания qr-кода я использовал библиотеку qrcode и на вход передал ранее сгенерированный адрес биткойн кошелька из БД.</p>
  <pre> if message.text == &#x27;? Получить BTC&#x27;:
    img = qrcode.make(data[3])
    img.save(&#x27;qr.jpg&#x27;)

    await bot.send_message(message.chat.id, f&#x27;&#x27;&#x27;? Ваш адрес биткойн кошелька:
*{data[3]}*&#x27;&#x27;&#x27;, parse_mode= &quot;Markdown&quot;)
    
    await bot.send_photo(message.chat.id,photo=open(&#x27;qr.jpg&#x27;, &#x27;rb&#x27;))</pre>
  <h3>Отправить BTC</h3>
  <figure class="m_custom">
    <img src="https://habrastorage.org/getpro/habr/upload_files/ccd/9a8/4b0/ccd9a84b0d6c832d64f2b2302d2d2f63.JPG" width="461" />
  </figure>
  <pre>try:
    sum = float(message.text)
    url = f&#x27;https://blockchain.info/rawaddr/{data[3]}&#x27;
    x = requests.get(url)
    wallet = x.json()
    if sum + 10000 &amp;lt;= wallet[&#x27;final_balance&#x27;] / 100000000:
        try:
            my_key = PrivateKey(wif=data[4])
            # Коммисия перевода, если поставить слишком маленькую, то транзакцию не примут
            # И чем больше коммисия, тем быстрее пройдет перевод
            fee = 10000
            # Генерация транзакции
            tx_hash = my_key.create_transaction([(data[5], sum, &#x27;btc&#x27;)], fee=fee, absolute_fee=True)
            print(tx_hash)
            url = &#x27;https://blockchain.info/pushtx&#x27;
            x = requests.post(url, data={&#x27;tx&#x27;: tx_hash})
            result = x.text
            sql = &quot;UPDATE users SET state = {} WHERE chatid = {}&quot;.format(0, message.chat.id)
            cursor.execute(sql)
            conn.commit()
            await bot.send_message(message.chat.id, result)
        except Exception:
            await bot.send_message(message.chat.id, &quot;⚠ Ошибка при выолнении транзакции&quot;)
    else:
        await bot.send_message(message.chat.id, &#x27;⚠️  На вашем балансе недостаточно средств.&#x27;)
except ValueError:
    await bot.send_message(message.chat.id, &#x27;⚠️Неправильно введена сумма отправления, попробуйте еще раз&#x27;)
</pre>
  <p>Проверим через сайт, что транзакция отправилась:</p>
  <figure class="m_custom">
    <img src="https://habrastorage.org/getpro/habr/upload_files/e72/826/b2c/e72826b2c00aca7f2d2fad2e63951bda.JPG" width="917" />
  </figure>
  <h2>Исходники и как запустить</h2>
  <p>Скачать исходники бота можно тут github.com/Lil-hack/blockchain-client</p>
  <p>Склонировав репозиторий, устанавливаем необходимые пакеты:</p>
  <p><strong>pip install -r requirements.txt</strong></p>
  <p>Некоторые библиотеки у меня не заработали на windows, так что лучше сразу запускать на linux.</p>
  <p>В файле <strong>main.py</strong> заменяем ваш <strong>токен телеграм</strong> бота:</p>
  <pre># Ваш токен от BotFather
TOKEN = &#x27;YOUR TOKEN&#x27;</pre>
  <p>В файле <strong>btc_core.py</strong> заменяем на вашу <strong>seed </strong>фразу:</p>
  <pre># Ваша seed фраза
seed = &#x27;YOUR SEED&#x27;</pre>
  <p>И запускаем бота командой: <strong>python main.py</strong></p>
  <p>Работает на python 3.7.0 и выше. Бот написан за один вечер, так что просьба строго не судить ^^</p>
  <h2>Итого</h2>
  <p>Как оказалось, все довольно не сложно, и в несколько десятков строк можно добавить оплату BTC в любой python проект. Я не профи в криптографии, так что скорее всего многие моменты упустил, но надеюсь кому-то эта статья будет полезна.</p>
  <blockquote>📍 Source 👉  <a href="https://habr.com/ru/post/525638/" target="_blank">https://habr.com/ru/post/525638/</a></blockquote>

]]></content:encoded></item></channel></rss>