January 18, 2021

[Telegram] Граббер постов из чужих каналов в свой

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

Подобная тема уже имеется
Но оформление и вообще объяснение происходящего, что да как, просто нет.
Моя же тема подойдет и для тех кто только начал вникать в кодинг.

В этой теме мы разберем:

  1. Установка библиотеки Telethon.
  2. Код скрипта.
  3. Получение / Регистрация API Telegram.
  4. Получение id каналов.
  5. Функция граббера.
  6. Запуск скрипта.

Здесь мы не будем создавать бота, а используем для этого обычный аккаунт telegram.
Желательно использовать купленный аккаунт, т.к не следуя советам приведенным в этой теме, ваш личный акк отлетит в бан

1. Установка библиотеки Telethon.

  • Нажать сочетание клавиш win+R
  • В появившемся окне прописываем: cmd жмем Enter
  • В следующем окне вводим pip install telethon
  • Дожидаемся завершения установки.

Создаем файл с любым удобным названием формата " .py " и редактируем любом текстовым редактором поддерживающем подсветку синтаксиса.

2. Код скрипта.
Копируем код ниже и редактируем следуя теме

from telethon import TelegramClient, events
import asyncio

api_id = 2281337
api_hash = '2d4zalupa737aa228e62a1f1337fd6a13'

my_channel_id = -1001345345836
channels = [-10012345353430, -100327473252340]

client = TelegramClient('myGrab', api_id, api_hash)
print("GRAB - Started")


@client.on(events.NewMessage(chats=channels))
async def my_event_handler(event):
    if event.message:
        await client.send_message(my_channel_id, event.message)
 
client.start()
client.run_until_disconnected()

Самое первое и важное в коде после импорта библиотек вы должны заметить api_id и api_hash, а так-же id каналовВ коде выше они вымышленны. заменить на своё!

Важно! api_id и api_hash это данные вашего аккаунта, они не должны попасть к третьим лицам, иначе вы потеряете аккаунт.

3.Получение / Регистрация API Telegram.
Где взять api_id и api_hash?: на оф.сайте > https://my.telegram.org/

На приложение придет код который вы должны ввести далее.

Напомню еще раз:
api_id и api_hash это данные вашего аккаунта, они не должны попасть к третьим лицам, иначе вы потеряете аккаунт.

Полученные api_id и hash заменяем в коде на свои.
Важно: api_hash в коде обязательно должен быть за кавычками, 'одинарными' или "двойными" - разницы нет.

Далее ID каналов.
id своего канала и id канала откуда будем брать посты:

my_channel_id = -1001345345836  #id нашего канала
channels = [-10012345353430, -100327473252340] #id каналов, откуда будем брать материал.

Если ваш канал публичный т.е имеется ссылка в виде @MoykAnal228, Вместо ID просто вставляем его туда за кавычки

my_channel_id = '@MoykAnal228'

тоже самое и с переменной "channels" но давайте рассмотрим ее поближе

channels = [-10012345353430, -100327473252340]

как видите здесь указано id двух каналов, т.е. посты будут браться одновременно с двух каналов

Если вы просто ленитесь и у одного из каналов есть @ссылка можно сделать так:

channels = ['@tut_user', -100327473252340]

Туда-же можно вставлять неограниченное число id каналов через запятую.
если каналы активные, добавляйте не более 8 каналов, т.к из-за флуда в свой канал телеграм выдаст ограничение на отправку сообщений на 480 ± секунд, дальше больше и бан.

На время теста чтобы не создавать два канала для проверки скрипта
можете сделать так:

my_channel_id = 'me'

в этом случае с нужного канала сообщения будут отправляться к вам в сохраненки.

4. Получение id каналов.
Открываем диалог с ботом в телеграм: @getIDs_bot
пересылаем любой пост с нужного канала боту, после чего он выдаст:

И следующее то, что нас больше всего интересует, что мы нашим кодом будем пересылать, и как пересылать.

5. Функция граббера.
За это отвечает часть кода:

    if event.message:
        await client.send_message(my_channel_id, event.message)

В этом случае копируется любой пост (фото, видео, аудио, текст) целиком, вместе с описанием и отправляется в ваш канал.
Не пересылается а именно отправляется в канал как полноценный новый пост.
Пример работы

Но что если нам нужно только фото, и мы хотим своё описание к фото?
заменяем эту часть кода на следующий:

    if event.message.photo:
        await client.send_file(my_channel_id, file=event.message, caption="тут ваш текст")

Скрин работы

Здесь всё просто рассмотрим аргумент event.message

event.message #-берет все посты
event.message.media #-только медиа контент исключая текст
event.message.photo #-только фото
event.message.video #-только видео
event.message.audio #-только музыка

заменяем на нужный нам вариант
Если вам нужен только текст, для отправки самого 'сообщения 'используйте

await client.send_message(my_channel_id, event.message)

Если медиа контент:

await client.send_file(my_channel_id, file=event.message, caption="свой текст")

Если же вам нужно и то и другое просто вставьте еще одну проверку ниже

    if event.message.text:
        await client.send_message(my_channel_id, event.message)
    if event.message.video:
        await client.send_file(my_channel_id, file=event.message)

======
Отправка Альбомов (сгруппированных фото)
И так, разобравшись со всем что написано до этого момента, и протестировав скрипт вы наверняка обнаружите что
сгруппированные сообщения разбиваются и отправляются по одному, тут же всё элементарно просто
добавим следующий кусок кода к тому что выше

@client.on(events.Album(chats=channels))
async def handler(event):
    await client.send_message(
        chat,
        file=event.messages,
        message=event.original_update.message.message,
    )

Должно получиться так:

from telethon import TelegramClient, events

api_id = 2281337
api_hash = '2d4zalupa737aa228e62a1f1337fd6a13'

my_channel_id = -1001345345836
channels = [-10012345353430, -100327473252340]

client = TelegramClient('myGrab', api_id, api_hash)
print("GRAB - Started")


@client.on(events.NewMessage(chats=channels))
async def my_event_handler(event):
    if event.message:
        await client.send_message(my_channel_id, event.message)
     
@client.on(events.Album(chats=channels))
async def handler(event):
    await client.send_message(
        my_channel_id,
        file=event.messages,
        message=event.original_update.message.message,
    )
 
client.start()
client.run_until_disconnected()

Если хотите поменять текст у альбома

message=event.original_update.message.message

редактируем следующим образом

message='Ваш текст для альбома'

Можно сказать на этом всё!
Сохраняем скрипт и запускаем, наслаждаемся.

6.Запуск скрипта.Важно!
Если вы впервые регаете api телеграма, запустите скрипт
у вас спросит номер телефона от аккаунта, введите его и затем код отправленный вам в приложение, эта процедура делается всего один раз.

Здесь же создается еще один файл в данном случае myGrab.session
название файла берется из

client = TelegramClient('myGrab', api_id, api_hash)

этот файл всегда должен находится в одной директории со скриптом

и как только появится "GRAB - Started" - Закройте скрипт и запустите его только через пару часов.
иначе ваш аккаунт может отлететь в бан.
После этого запускайте и держите скрипт рабочим хоть 24/7

На этом всё, код самый элементарный, его можно сделать еще более функциональным.. но здесь этого не будет.