Группа Журналыч Журналыч Kotik 2 месяца назад

бот для тгк максфорд блог | проект за 3 часа #2

150 просмотров
бот для тгк максфорд блог | проект за 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 # noqaimport timeimport jsonrss_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… Страшно. 

Файл:
maksford-blog-bot.py 2 Кбскачан 9 раз
Kotik
Правила необходимо знать, но лучше создавать их самому. И действовать нужно сейчас!
Kotik
Kotik
2 месяца назад
+2

Но пока что я продолжу публиковать вручную… Пока не найду самое интересное и красивое решение… Или не устану...

#
brian999
brian999
2 месяца назад
+1

не забывайте про отдых, удачи! 

Максим Стрельцов
Максим Стрельцов
2 месяца назад
+1

В RSS добавил возможность получать краткое содержимое поста.

brian999
brian999
2 месяца назад
+1

Очень классно, буду ждать от вас новых публикаций!!!

#