бот для тгк максфорд блог | проект за 3 часа #2
1 0 1 жители максфорда!
Это новый выпуск «проект за 3 часа» и сегодня вас ждёт невероятное. Давным-давно, как только зародился Максфорд блог и iKotMax (закрытая группа и проект в целом) появился в Telegram, мне пришла идея: «сделать telegram bot, который будет постить контент из максфорда в telegram канал.» (не так давно эта идея пришла и Poylaky). Теперь у максфорд блога появился тгк и автоматически заполнять и добавлять посты достаточно затратно. И я принял решение, что нужно сделать бота. И решил, а что если попытаться сделать его за 3 часа? Как раз и контент будет и самому интересно, а то я всё растягиваю, а тут быстро будет…
Но перед тем, как мы начнём я вам хочу напомнить, что я готов вам подарить 500 рублей за самый лучший пост, который мне появиться.
Пост про розыгрыш тут.
Не так давно я уже подарил 50 рублей жителю максфорда, который первым опубликовал свой пост в журналыче. Это был Poylak.
Но у вас есть ещё шанс получить 500 рублей до середины августа, так-то спешите!
С чего надо начать?
Идея у меня есть, представление о том, как будет выглядеть бот тоже. Ну и какие там будут функции.
Во-первых, бот не должен быть перегружен, во-вторых, он должен быть с красивым дизайном, в-третьих, он должен работать.
Маленький комментарий: я не представлял, что я хочу и что предстоит сделать.
После того, как я разобрался с этим я перехожу в BotFather (мать всех ботов), создаю бота и получаю токен. С этим токеном я уже могу работать.
Теперь поехали!
Я написал в 19:37 «начало» в свой тгк.
Этап первый: команда star
Так как никто не будет пользоваться ботом, то команда start не очень и нужна. Но я её сделал для удобства, вдруг захочу усовершенствовать. И ещё с помощью команды удобно проверить, что бот работает.
@bot.message_handler(commands=['start'])def start(message):
bot.send_message(message.from_user.id,'Привет, я бот для максфорд блога. Ссылка на максфорд блог: https://blog.maxford.ru/')
Этап второй: зайти в интернет и разобраться, что за rss такой и как с ним работать
Я его нашёл в максфорде, просто надо перейти в любой раздел и над "лента постов" появиться значок, нажав на него, вы перейдёте в rss максфорда.
Теперь я загуглил, как работать с rss. Сначала мне попадались сайты с рекламой таких ботов, которые из различных сетей вам в канал будут заливать ваши посты в telegram channel.
Но чуть более поэкспериментировав с поисковым запросом, я так и нашёл нужные мне статьи. Во всех этих статьях были разные библиотеки, в итоге чуть более поэкспериментировал с кодом, прочитал про библиотеки, я понял, что для меня, вроде как, подходит rss_parser. Понял я это за час до конца проекта и сразу стал разбираться как работать с этой библиотекой, так как время осталось мало пришлось залезать и спрашивать вещи у gigachata (а он/она тупой/тупая) и я долго мучился с ним, но у него что-то торкнуло, и он мне начал писать и объяснять. Я быстро разобравшись, что и как. Вот такой код у меня получился после всех махинаций:
from rss_parser import RSSParserfrom requests import get # noqa
import time
import json
rss_url ="https://blog.maxford.ru/rss/feed/posts"
response =get(rss_url)
rss = RSSParser.parse(response.text)
sp1 =[i.title.content for i in rss.channel.items][0]
print(sp1)
sp2 =[i.guid.content for i in rss.channel.items][0]
print(sp2)
try:
sp3 =[i.enclosure for i in rss.channel.items][0].attributes['url']
print(sp3)
exceptAttributeError:
print('gjabu')
update_sp1 =[i.title.content for i in rss.channel.items][0]
while sp1 == update_sp1:
rss_url ="https://blog.maxford.ru/rss/feed/posts"
response =get(rss_url)
rss = RSSParser.parse(response.text)
update_sp1 =[i.title.content for i in rss.channel.items][0]
print(update_sp1)
time.sleep(20)
else:
print(update_sp1)
sp1 – заголовок
sp2 – ссылка
sp3 – фото
Если у поста нет фотки, то это приводит к ошибки, для этого я написал try-expect. Так-как на этом этапе мне не совсем нужна картинка, то в expect написан бред.
Этап третий: перенос этого кода в телеграм бота
Пока я разбирался с rss и всеми возможностями (так и не разобрался до конца), у меня осталось 10 минут. За это время мне надо было, как можно быстрее сделать телеграм бота.
Я узнал, только как достать заголовок, ссылку и фото. И быстро сделал так, чтобы каждые 30 сек бот обновлял информацию и если она отличается от того, что было, то бот постить это в канал.
Вот код:
try: sp1 =[i.title.content for i in rss.channel.items][0]
sp2 =[i.guid.content for i in rss.channel.items][0]
sp3 =[i.enclosure for i in rss.channel.items][0].attributes['url']
whileTrue:
response = requests.get(rss_url)
rss = rss_parser.RSSParser.parse(response.text)
up_sp1 =[i.title.content for i in rss.channel.items][0]
up_sp2 =[i.guid.content for i in rss.channel.items][0]
up_sp3 =[i.enclosure for i in rss.channel.items][0].attributes['url']
if up_sp1 != sp1:
sp1 = up_sp1
sp2 = up_sp2
sp3 = up_sp3
bot.send_photo(-1002164346808, sp3,caption=f'*[{sp1}]({sp2})*',parse_mode='Markdownv2')
time.sleep(30)
time.sleep(30)
exceptAttributeError:
sp1 =[i.title.content for i in rss.channel.items][0]
sp2 =[i.guid.content for i in rss.channel.items][0]
whileTrue:
response = requests.get(rss_url)
rss = rss_parser.RSSParser.parse(response.text)
up_sp1 =[i.title.content for i in rss.channel.items][0]
up_sp2 =[i.guid.content for i in rss.channel.items][0]
if up_sp1 != sp1:
sp1 = up_sp1
sp2 = up_sp2
bot.send_message(-1002164346808,f'*[{sp1}]({sp2})*',parse_mode='Markdownv2')
time.sleep(30)
time.sleep(30)
Он работает. Доказательство:
Я написал в 22:33 «конец» в свой тгк.
Итог:
Да проект не совсем готовый, но я не успел ничего больше за 3 часа, как долго разбирался что и как.
Есть к чему стремиться. Я не до конца разобрался с библиотекой rss_parser. Я не смог найти краткое описание… Проблема в том, что в rss у максфорда есть полный текст поста, но нет краткого. А мне надо, для красоты и интереса, краткое описание.
То есть мне предстоит разобраться с тем, как их достать и откуда. В общем планы на развития есть.
Я сделал маленькую часть, в которой из-за спешки я не успел подумать и наделал костылей, которые надо заменить и переделать. Ко всему этому надо всё сделать по красоте.
Ближе к 5 августу я попробую закончить, работы не так и много!
А на этом всё!
Предлагайте свои идеи, что сделать мне за 3 часа ещё.
Не забывайте ставить стрелочки вверх и писать комментарии.
И ещё предлагайте идеи, как улучшить существующий проект.
И напишите, как бы вы хотели улучшить эту рубрику.
Спойлер: следующий проект будет игра «крестики-нолики» на python с помощью библиотеки openGL… Страшно.
Но пока что я продолжу публиковать вручную… Пока не найду самое интересное и красивое решение… Или не устану...
не забывайте про отдых, удачи!
В RSS добавил возможность получать краткое содержимое поста.
Очень классно, буду ждать от вас новых публикаций!!!