writernotes

writernotes

https://t.me/orionstarss_bot
На Пикабу
Дата рождения: 1 июня
99 рейтинг 1 подписчик 9 подписок 17 постов 0 в горячем

Я создал бота с Гороскопам и Астрологией 0_0

Бот - https://t.me/orionstarss_bot

Я давно увлекаюсь астрологией (нет, конечно), и мне всегда казалось, что в интернете не хватает удобного сервиса, который бы не просто выдавал шаблонные гороскопы, а давал действительно интересные и полезные прогнозы. Поэтому я решил сделать своего бота, который каждый день присылает актуальные гороскопы и отвечает на вопросы с помощью реального астролога.

Как я это сделал?
Проект писал на Node.js, использовал API для получения астрологических данных и реализовал систему обработки пользовательских запросов. Это было непросто: сначала я разбирался с архитектурой, потом долго настраивал работу с базой данных и интеграцию с мессенджерами. Но оно того стоило!

Что умеет бот?
— Присылает ежедневные гороскопы
— Поддерживает связь с реальным астрологом, который может помочь в сложных вопросах

Что дальше?
Я планирую добавить больше интерактивных функций, например, анализ совместимости знаков или прогнозы на месяц.

Если интересно — пишите, поделюсь ссылкой, буду рад отзывам и советам! 🚀

Показать полностью

Я создал Telegram-бота (FYTT), который ищет Telegram-каналы всех ваших подписок на YouTube

Идея создания бота пришла после замедления YouTube в России. Многие блогеры стали активно призывать подписчиков переходить в Telegram, чтобы не потерять связь с аудиторией. Я решил сделать удобный инструмент для быстрого поиска Telegram-каналов любимых авторов.

Что я использовал?

Поскольку опыта в разработке у меня было мало, я выбрал следующий стек технологий:

  • Node.js с библиотекой telegraf.js для работы с Telegram API

  • MongoDB и mongoose для работы с базой данных

  • Express.js для создания веб-сервера

  • Google API для работы с YouTube

  • Lemnos API для получения дополнительной информации о каналах

Реализация

1. Основные команды бота

Начнем с главной команды /start, которая инициализирует работу с ботом:

bot.start(async (ctx) => {

const chatId = ctx.chat.id;

let chat = await Analytics.findOne({ chatId: chatId })

// Создаем новую запись пользователя, если его нет в базе

if (chat === null) {

try {

let username = ctx.message.chat.username

let newChat = new Analytics({

chatId: ctx.message.chat.id,

username: username,

awatingChannels: true,

status: "member",

count: 0

})

await newChat.save()

} catch {

// Если username недоступен, используем first_name

let newChat = new Analytics({

chatId: ctx.message.chat.id,

username: ctx.message.chat.first_name,

awatingChannels: true,

status: "member",

count: 0

})

await newChat.save()

}

} else {

chat.awatingChannels = true

await chat.save()

}

// Отправляем приветственное сообщение с кнопками

await setBotCommands()

ctx.replyWithHTML(

'<b>Приветствуем вас в нашем сервисе поиска Telegram-каналов ютуберов!</b>\n' +

'Бот безопасен, так как представляет собой открытый исходный код, ' +

'который может посмотреть каждый желающий. (/faq или пишите @vitosperansky)\n\n' +

'Поддержать проект: https://www.donationalerts.com/r/vitosperansky\n\n' +

'Выберите опцию:',

Markup.inlineKeyboard([

[Markup.button.callback('Найти YouTube-каналы в Telegram', 'find_channels')],

[Markup.button.callback('Связать YouTube-канал с Telegram-каналом', 'link_channel')]

]), {

disable_web_page_preview: true

}

);

});

2. Авторизация через Google

Для работы с YouTube API необходима авторизация через Google. Вот как реализована генерация URL для авторизации:

async function generateAuthUrl(chatId) {

const credentials = JSON.parse(fs.readFileSync(CREDENTIALS_PATH));

const { client_id, client_secret } = credentials.web;

const oAuth2Client = new OAuth2Client(

client_id,

client_secret,

REDIRECT_URL

);

const authUrl = oAuth2Client.generateAuthUrl({

access_type: 'online',

scope: SCOPES,

state: chatId.toString()

});

return authUrl;

}

Когда пользователь нажимает на кнопку поиска каналов, запускается следующий обработчик:

const find_channels = async (ctx) =&gt; {

const chatId = ctx.chat.id;

const authUrl = await generateAuthUrl(chatId, ctx);

ctx.replyWithMarkdown(

'*Нажмите кнопку ниже для авторизации на Youtube и получения списка ваших подписок:*\n\n' +

'❗Авторизация нужна только для получения списка ваших подписок ' +

'(запрашиваются права youtube.readonly - только чтения, подробнее /faq)❗\n\n' +

'_Процесс займет время: ~50 секунд. (в зависимости от количества ваших подписок)_',

{

reply_markup: {

inline_keyboard: [

[{ text: 'Авторизоваться и найти подписки', url: authUrl }]

]

}

}

);

};

// Обработчики команды поиска каналов

bot.action('find_channels', async (ctx) =&gt; {

ctx.answerCbQuery();

await find_channels(ctx)

})

bot.command('find_channels', async (ctx) =&gt; {

await find_channels(ctx)

})

3. Дополнительные команды

Бот также имеет несколько дополнительных команд для удобства использования:

// Команда FAQ

bot.command('faq', async (ctx) =&gt; {

ctx.replyWithMarkdown(`

**Ответы на вопросы о проекте:**

Какова цель проекта?

— Максимально упростить поиск Телеграмм каналов ваших любимых авторов.

У меня не украдут Google Аккаунт?

— Нет, бот имеет открытый исходный код, который может посмотреть каждый желающий на Github - https://github.com/VitoSperansky/FromYoutubeToTelegram.

Как работает бот?

— Бот просит вас авторизоваться в свой Google аккаунт, чтобы получить список ваших подписок на YouTube.

Затем система обращается к своей базе данных, где хранятся соответствия YouTube-каналов и их Телеграмм-каналов.

Если бот находит соответствия в базе данных, он записывает их в список найденных каналов.

Если YouTube-каналы, на которые вы подписаны, отсутствуют в нашей базе данных, бот отправляет запрос

в YouTube на получение ссылок социальных сетей, привязанных к каналу. Среди этих ссылок бот ищет

ссылку на Телеграмм. Найдя новую ссылку на Телеграмм-канал, бот добавляет её в базу данных.

В итоге, пользователь получает список YouTube-каналов с их Телеграмм-каналами.

Остались вопросы? - Пишите @vitosperansky

`);

});

// Команда для рассылки сообщений (только для администратора)

bot.command('send', async (ctx) =&gt; {

if (ctx.message.chat.id == MODERATOR_CHAT_ID) {

let chatId = ctx.message.text.replace('/send ', '').replace(/ [\s\S]+/, '');

let text = ctx.message.text.replace('/send ', '').replace(`${chatId} `, '').toString();

if(chatId === 'all') {

let Users = await Analytics.find()

let goodSend = [];

let badSend = [];

ctx.reply("Рассылка началась.")

for (let i = 0; i &lt; Users.length; i++) {

try {

await bot.telegram.sendMessage(Users[i].chatId, text, { parse_mode: "HTML" });

goodSend.push(Users[i]);

} catch (error) {

badSend.push(Users[i]);

}

}

ctx.reply(`Рассылка завершена\n\nУспешно отправлено: ${goodSend.length} сообщений.\n` +

`Не получилось отправить: ${badSend.length} сообщений.`)

} else {

try {

await bot.telegram.sendMessage(chatId, text, { parse_mode: "HTML" });

ctx.reply(`Сообщение успешно отправлено пользователю. \n\nChatId: ${chatId}\nТекст: ${text}`)

} catch {

ctx.reply("Ошибка при отправке сообщения.")

}

}

} else {

ctx.reply("Вы не админ!")

}

});

Проблемы и их решения

1. Проблема дублирования запросов

При авторизации в Google-аккаунте возникла проблема с дублированием запросов, если у пользователя несколько аккаунтов. Для решения этой проблемы я использовал флаг awaitingChannels в базе данных, который позволяет отслеживать состояние запроса и избегать дублирования.

2. Ограничение длины сообщений

В первых версиях бот пытался отправить все найденные каналы одним сообщением, но столкнулся с ограничением Telegram на длину сообщения. Решение было простым - разбить информацию на несколько сообщений. (присылать txt файлом к примеру не совсем верно, ведь тогда теряется легкость в переходе на телеграм канал).

3. Сайт

Сайт работает на порту 3000 (fytt.tech:3000, что не совсем стандартно для веб-приложений. Это связано с тем, что порты ниже 1024 по умолчанию закрыты для установки серверов из соображений безопасности. В идеале следовало бы настроить переадресацию с порта 443 (стандартный HTTPS порт) с помощью инструмента вроде ngrok, но поскольку сайт служит в основном для верификации Google, эта задача была отложена.

Процесс верификации Google

Получение доступа к YouTube API потребовало пройти верификацию Google. Процесс включал несколько этапов:

  1. Создание логотипа: Первая версия логотипа была отклонена из-за слишком явного использования элементов YouTube и Telegram. Пришлось создать более оригинальный дизайн.

    1 версия - отклонена (кто-то увидел тут силуэт лица человека xD)2 версия — принято (на фоне текст fromyoutubetotelegram)
  2. Разработка сайта: Потребовалось создать сайт с политикой конфиденциальности и пользовательским соглашением. При этом возникли следующие требования:

    • Необходимость владения доменом

    • Настройка SSL-сертификатов через certbot

    • Корректная политика конфиденциальности

  3. Демонстрация работы: Создание демо-видео для показа функционала бота. (пришлось им видео записать под смешную музыку)

Продвижение проекта

Потом я решил продвинуть бота и записал два смешных shorts:

  • https://youtu.be/MlXEUIDBhE0 — Speech to speech моей записи на ии оригинального голоса Рика из Рика и Морти (сделал на этом сайте).

Полезные ссылки

Планы на будущее

  1. Улучшение алгоритма поиска каналов

  2. Оптимизация работы с базой данных

  3. Добавление новых функций по запросам пользователей

  4. Настройка правильной маршрутизации портов на сервере

Заключение

Проект показал, что даже с минимальным опытом разработки можно создать полезный инструмент, который решает реальную проблему пользователей. Открытый исходный код и прозрачность работы позволили завоевать доверие пользователей, а интеграция с популярными платформами обеспечила удобство использования.

Показать полностью 2
Вопрос из ленты «Эксперты»

Знает кто приложение для организации жизни, в частности для getting things done?

Хотелось бы вот что:

+- функционал notion под капотом

+- бесплатно (можно selfhost решения)

Удобное, быстрое, даже если там будет только функционал заметки приложение для телефона, чтобы в мгновение записывать мысли

+ базы данных notion стиля

Посмотрел anytype, anydo, week, obsidian, siuya, yonote, vse ot razrabov iz rf, AFFiNE и еще много всего. Буду рад, если предложите что-нибудь еще, также можно связки приложение на телефон + на пк разные, но связные

4

Я создал Телеграм бота (FYTT), который ищет Телеграм каналы всех ваших подписок на ютубе. DELUXE-версия статьи

бот - https://t.me/FYTTproject_bot

Идея пришла, конечно же, после замедления ютуба. Многие блогеры стали активно кричать, мол переходите в тг, не потеряйте и я решил сделать удобный инструмент для быстро поиска тг-каналов своих любимых авторов.

Опыта мало в разработке, поэтому стек особо не выбирал:

  • Node.js, библиотека telegraf.js

  • MongoDB, mongoose

  • Express.js

Алгоритм работы бота, такой:

Пользователь пишет /start, ему выдается приветственное с 2 кнопками: "Найти Youtube-каналы в Telegram" и "Связаться Youtube-канал с Telegram-каналом". Также, пользователь сразу же добавляется в базу данных с сохранение его chatId, для дальнейшей связи, в случае чего и awatingChannels, о котором рассказал ниже.

При нажатие на первую, пользователь получает кнопку с ссылкой на авторизацию в Google, после авторизации отправляется ответ на сервер на "/oauth2callback", запуская функцию поиска:

Далее функция возвращает ответ и запускается функция, которая проверяет есть ли данный канал в базе данных бота (чтобы в будущем, с увеличением базы, ускорить выдачу каналов).

Если канал не найдется в базе данных, то запустится функция для парса телеграм каналов из раздела "ссылки" на ютубе. Хотелось бы использовать для этого Youtube API аж 3 версии, но там нет функционала, для получения этих данных 🙃, поэтому я нашел стороннее API - YouTube operational API (lemnoslife.com), с которым приятно работать. Автору респект!

Далее новый канал добавляется в базу данных, а после бот выдает несколькими сообщениями все ютуб-каналы, на которые он подписан и через тире их телеграм каналы. В первых версиях, бот рассчитывал только на отправку одного сообщения, но оказалось, что у моего тестового аккаунта подписок сильно больше, чем ограничение на длину сообщения в телеграм. Недолго подумав, я просто решил отправлять всю информацию несколькими сообщениями. (Других вариантов, как будто нет)

Была одна надоедливая проблема, которую я костыльно решил: при авторизации в google аккаунт запрос на сервер отправляется дважды, если пользователь дважды нажимает на выбор аккаунта. Сложно объяснить, но думаю, те кто работал сталкивался с этим. Эта проблема появляется только, если у человека несколько аккаунтов. Поэтому, чтобы сообщения не отправлялись дважды, я стал записывать в документ пользователя в базе данных переменную awatingChannels. При нажатии на кнопку найти каналы ее значение становилось true, а при получение каналов меняло на false, что решило проблему. Думаю, нужно было реализовать это через сессии, что я и пробовал изначально, но что-то пошло не так и я решил по-быстрому все сделать так.

Кнопка: "Связать Youtube-канал с Telegram-каналом" позволяет пользователю вручную добавить связку ютуб-канал + тг-канал, если автор ютуб-канала не оставил ссылку на свой тг в описании. (Сначала запрос отправляется на модерацию мне, а потом, при принятии попадает в общую базу данных).

Для логирования ошибок, впоследствии, стал использовать pino.

Теперь бот работает и выполняет свою функцию. У него есть еще несколько команд, такие как:

  • /submit (text) - для связи со мной

  • /faq - ответы на вопросы

  • /send - чтобы я мог связаться с пользователем

Еще несколько системных и мой прикол - /jericho (иерихон)

bot.command('jericho', async (ctx) => { if (ctx.message.chat.id == MODERATOR_CHAT_ID) { ctx.replyWithVideo(`https://i.gifer.com/370.gif`) throw new Error() } else { %*%secret%*% } })

Которая вызывает ошибку, а вместе с ней прекрасную гифку для меня: https://i.gifer.com/370.gif

Теперь есть работающий бот, но Google не дает доступ к API тем, про кого не знает (только для тестов). Поэтому нужно пройти проверку. У тебя должен быть сайт, политика, terms и прочее.

Начал я с логотипа и отправил им это

Google сказал, что это лого не отражает вашу индивидуальность. (видимо, из-за слишком явного использования автарок телеграма и ютуба).

Тогда я решил показать всю свою индивидуальность:

Они это приняли, я пошел быстренько сделал сайт, попросил ChatGPT написать политику и отправил. Оказалось надо быть владельцем домена, на котором размещен сайт, поэтому пришлось купить. Подключил сертификаты через certbot. И отправил снова.

На этот раз им не понравилась политика, они жестко ответили, мол: Вы написали, что "Google продает данные пользователей.". Я перечитал все, что ChatGPT написал, не нашел там такого, попросил переделать, отправил снова и теперь уже все приняли :). Еще надо было сделать им демо-видое работы, ну ладно без проблем - FYTT — Найди Ютуб каналы в Телеграмм (Полезный бот в Telegram) | @FYTTproject_bot - YouTube

Потом я решил продвинуть бота и записал два смешных shorts:

  • https://youtu.be/MlXEUIDBhE0 - Speech to speech моей записи на ии оригинального голоса Рика из Рика и Морти (сделал на этом сайте).

Ну и написал первую версии статьи: Я создал Телеграм бота (FYTT), который ищет Телеграм каналы всех ваших подписок на ютубе / Хабр (habr.com)

Получил много положительной реакции, до статьи у меня было 37 человек, которые запустили бота, а теперь 235 из которых 93+ использовали его функционал.

Ссылки:

Бот - https://t.me/FYTTproject_bot

Исходный код - https://github.com/VitoSperansky/FromYoutubeToTelegram

Сайт - fytt.tech:3000 (порт 3000, потому что порты ниже 1024 по умолчанию закрыты для установки серверов, их можно открыть, но это угроза безопасности. По-хорошему мне надо было сделать переадресацию с 443 порта (он дефолтный для https сайтов, поэтому скрыт в поисковой строке и пользователи его не видят) с помощью ngrok например, но я не стал тратить силы, так это все равно заглушка для гугла).

Связаться со мной по вопросам или просто - https://t.me/vitosperansky

Показать полностью 6 2
7

Я создал телеграм бота (FYTT), который ищет телеграм каналы всех ваших подписок на ютубе

Бот - https://t.me/FYTTproject_bot

Проснулся, улыбнулся, прочитал о том, что YouTube замедляют, снова улыбнулся, зашел на YouTube — не работает. Перестал улыбаться, начал думать, что можно круто сделать по этому поводу. Увидел, что все байтят перейти в их Telegram (вот, кстати, мой), и появилась идея создать бота, который получает список подписок пользователя на YouTube, ищет Telegram-каналы всех подписок и выдает их пользователю списком, чтобы он не потерял любимых авторов. Думаю, идея нормальная — хитом, конечно, не станет, но в первую очередь делал для опыта.

До этого я, конечно, создавал ботов. По сути, я умел все, что нужно для проекта:

  • Работа с базой данных (использую MongoDB, в профессиональном сообществе её немного хейтят, но ладно).

  • Основной язык — Node.js + фреймворк telegraf.js.

  • Работа с Google API (YouTube API, в частности) — делал авторизацию для сайта с цитатами (недоделал, к сожалению, лежит уже год полумёртвым. Если есть гениальные идеи сделать лучший сайт с цитатами, пишите мне, покреативим).

Да, в принципе, это всё, что нужно по стеку.

Так как делал проект на полном вайбе, под музыку, конечно, никакой логики не прописал, но решил затестить, что сможет сделать ChatGPT — и не зря. Он написал основной код, логика которого мне понравилась. Разумеется, чтобы его запустить, нужно было сделать кучу правок, а чтобы он заработал — многое переписать. Но в целом я оказался доволен работой ChatGPT — это реально будущее. Причём я осознал, что он смог выдать нормальный код лишь потому, что я сам чётко понимал, как будет работать бот. А значит, программисты ещё долго будут мучиться на своих креслах, работая на корпорации.

Итак, в первой версии бота была авторизация, которая не работала.

Во второй версии появилась авторизация, которая заработала.

В третьей версии основной функционал заработал, но идея не была раскрыта, так как бот искал ссылки на Telegram-каналы ютуберов из моей базы данных, в которой было всего 3 канала — что, конечно, никуда не годилось. Тогда я быстро понял, что почти все YouTube-каналы оставляют в описании ссылки на свои Telegram-каналы, а значит, взять их — дело лёгкое, верно?

Ах да. YouTube API аж 3-й версии не способен получать ссылки каналов... Это же чуть ли не базовая функция API — получать всё, что написано на странице.

Благо нашёлся энтузиаст, который уже сделал своё API — yt.lemnoslife.com, где это хорошо реализовано. Респект автору огромный.

Ну и после этого последовал миллион фиксов багов и непоняток, потому что я неопытный и слабый разработчик. В итоге всё работает, но появилась другая проблема: бот запрашивает конфиденциальные данные пользователя — список его подписок, а значит, Google просто так не даст их получать тому, о ком ничего не знает. (Для тестов можно добавлять тестового пользователя).

Чтобы Google тебя одобрил, нужен сайт с главной страницей и политикой конфиденциальности.

«Кайф», — подумал я.

На самом деле заглушку сделать очень просто (домен, правда, пришлось покупать), вопрос был в содержании.

Первый раз Google не понравился логотип моего приложения, потому что он «не отражает индивидуальность» (или как-то так, короче, наверное, потому что слишком хорошо читается логотип YouTube и Telegram, с чем я согласен).

Смысл: Телеграм поглощает ютуб / Ютуб сгорает, а там телеграм

Смысл: Телеграм поглощает ютуб / Ютуб сгорает, а там телеграм

Тогда я решил показать всю свою харизму и индивидуальность:

FYTT - FromYoutubeToTelegram, что и написано на фоне

FYTT - FromYoutubeToTelegram, что и написано на фоне

Этот они приняли. 🥳

Далее Google не понравилась политика, которую написал ChatGPT. Они жёстко написали: мол, «в вашей политике сказано, что Google продаёт данные пользователей». Я перечитал и такого там не увидел. Закинул в ChatGPT, он всё пофиксил, и наконец меня одобрили.

Далее я всё релизнул, украсил, фиксил баги неделю-две и решил рассказать об этом людям, сделав два забавных Shorts.

На данный момент моим ботом воспользовались 37 человек, но многие просто тыкнули /start и больше не заходили — что обидно :(

Кому интересно:
Бот - https://t.me/FYTTproject_bot
Исходный код - VitoSperansky/FromYoutubeToTelegram: Бот для поиска телеграмм каналов всех ютуберов, на которые вы подписаны в "два клика". (github.com)
Сайт - fytt.tech:3000 (порт 3000, потому что порты ниже 1024 поумолчанию закрыты для установки серверов, их можно открыть, но это угроза безопасности. По-хорошему мне надо было сделать переадресацию с 443 порта (он дефолтный для https сайтов, поэтому скрыт в поисковой строке и пользователи его не видят) с помощью ngrok например, но я не стал тратить силы, так это все равно заглушка для гугла).
Связаться со мной по предложениям/вопросам или просто - https://t.me/vitosperansky

Показать полностью 2 2
4

Обзор сериала Star Wars: Tales of the Jedi

Недавно (нет) вселенная звездных войн расширилась еще больше. Дисней сделали анимационный сериал Сказания о джедаях. Показали несколько прикольных событий, о которых сейчас я расскажу.

Эпизод 1: Life and Death

В этой серии показали историю Асоки, которая недавно первый раз появилась на большом экране - в Мандалорце. Нам показали, как ее мать объясняла суть жизни и смерти, на примере охоты на животных, но в один момент Асоку похитил хищный зверь, однако Асока за счет сил джедая смогла приручить зверя и вернутся домой.

Эпизод 2: Justice

Эта серия моя любимая. В ней показывают появление первых сомнений Дуку, насчет справедливости в мире, а конкретнее в правильности решений джедаев. Дуку вместе с юным Квай-Гоном отправляются в деревню, в ней жители похитили сына канцлера, чтобы противостоять его правлению, при котором с каждым годом все живут только хуже. Дуку разыскивает где держат сына канцлера, однако в конце встает на сторону жителей и убивает войско канцлера. От убийства самого канцлера его остановил Квай-Гон.

Эпизод 3: Choices

Серия аналогичная второй, только тут Дуку уже с Винду расследует похожее дело с несправедливой властью канцлера, где у Дуку появляется еще больше желание предать совет джедаев.

Эпизод 4: The Sith Lord

Наступает время, когда Квай-Гон умер по сюжету Приквелов, в этот момент Дуку окончательно предает джедаев и выясняется, что он уже долгое время работал на Палпатина.

Эпизод 5: Practice Makes Perfect

Серия рассказывает о тренировка Асоки под руководством Энакина.

Эпизод 6: Resolve

Повествуется о приключениях Асоки после приказа 66.

Страница сериала на кинопоиске - https://www.kinopoisk.ru/series/4982930/

На этом все, да прибудет с вами сила.

Показать полностью 4
2

Строительные компании Lennar Group и Icon возведут район в городе Остин, все дома в котором будут напечатаны на 3D-принтере

Строительные компании Lennar Group и Icon возведут район в городе Остин, все дома в котором будут напечатаны на 3D-принтере. По мнению инженеров и строителей, технология позволит удешевить процесс строительства и при этом возвести качественные здания.

Для строительства домов будет использован материал под названием Lavacrete — это бетонная смесь, оптимизированная для облегчения печати. Также будет применяться роботизированная система, которая изготавливает предметы со скоростью 25,4 сантиметра в секунду, что позволит возвести дом в кратчайшие сроки.

Дома, напечатанные на 3D-принтере, выдержат экстремальные погодные условия и прослужат столько же, сколько и обычные дома, обещают инженеры строительных компаний. На зданиях также установят фотоэлектрические крыши, питающиеся от независимого источника энергии.

Постройка жилья с помощью 3D-печати обусловлена нехваткой жилья в США — дефицит домов составляет 5 млн по сравнению с покупательским спросом.

Строительные компании Lennar Group и Icon возведут район в городе Остин, все дома в котором будут напечатаны на 3D-принтере
Показать полностью 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества