Бот который может собрать данные из чата в Телеграмме

В Телеграм есть возможность экспорта одного чата (а также группы, канала или бота) из своего профиля, включая текстовые сообщения, голосовые сообщения, видеосообщения, фотографии, видео, стикеры, анимированные GIF, викарты контактов, местоположения и прикрепленные файлы с ограничением в 1,5 ГБ в общей сложности. Давайте рассмотрим способы экспорта чатов с их преимуществами, ограничениями и возможностями.

Как осуществить эскпорт сообщений участников в Телеграм

Экспорт чатов, групп и каналов Телеграм на самом деле не является чем-то новым: еще в середине июля, через официальный канал GDPR Bot, Telegram уже включил возможность экспорта всего содержимого своего профиля, используя функцию, аналогичную той, которую уже предоставляют Facebook, Twitter, Linkedin и Whatsapp, именно в результате корректировок конфиденциальности и защиты данных, связанных с внедрением GDPR от 25 мая 2018 года. Отличие от функции «Экспорт данных Телеграм » заключается в том, что с помощью объявленной сегодня функции экспорта можно экспортировать отдельные чаты, группы, ботов или каналы без необходимости экспортировать весь профиль.

Создание чат-бота в Телеграм для сбора данных пользователей

Как и в случае экспорта полного профиля для целей GDPR, остается — только для новых установок Telegram Desktop — 24-часовой лимит ожидания перед началом загрузки, который Телеграм требует выждать, чтобы уведомить подключенные устройства о запросе на экспорт и дать пользователю возможность отреагировать в случае несанкционированного запроса. Какие существуют способы продвижения и https://doctorsmm.com/ раскрутки в социальных сетях и мессенджерах можно изучить на сайте докторсмм.

Как указано в журнале изменений Телеграм, где говорится о «Экспорте данных из отдельных чатов с помощью меню ‘. ‘», чтобы иметь возможность сохранить отдельный чат, группу, канал или бота Телеграм, просто загрузите версию 1.3.13 или более позднюю версию Telegram Desktop, выберите интересующий вас чат, группу, канал или бота и нажмите на кнопку с тремя точками ‘. ‘ в правом верхнем углу.

Затем появится новый пункт меню «Экспорт истории чатов» для чатов, групп и ботов и «Экспорт истории каналов» для каналов, позволяя нам выбрать, что именно мы хотим сохранить в чате (фотографии, видеофайлы, голосовые сообщения, круглые видеосообщения, стикеры, анимированные GIF или файлы) и в какую папку на компьютере.

Нажатие на кнопку «Экспорт» запустит полную процедуру экспорта выбранных элементов из чата, которая также будет проходить в фоновом режиме, пока мы продолжаем использовать интерфейс Telegram Desktop. Если процедура затянется, ее всегда можно прервать и начать заново (с нуля) в другое время.

По окончании экспорта сообщений, видео, фотографий и вложений одного чата Telegram локально на ПК вы получите папку с именем «ChatExport_dd_mm_yyy», состоящую, как вы видите, из термина «ChatExport» и даты, когда был произведен дамп данных (например, «ChatExport_29_11_2022» для резервной копии, сделанной во время написания этой статьи).

Внутри папки «ChatExport» у нас будет один или несколько пронумерованных файлов «messages.html» (каждый около 500 КБ), содержащих ссылки на различные вложения и папки «photos», «stickers», «video_files», «voice_messages», «contacts», «files», «js», «images», «round_video_messages» и «css». Чтобы просмотреть чат, просто откройте файл ‘messages.html’ и прокрутите вниз; последующие файлы могут быть открыты автоматически в случае очень длинных чатов.

Зачем экспортировать сообщения подписчиков в Телеграм

Перейдем к интересному моменту: какой смысл в возможности экспортировать сообщения одного чата Телеграм? Напомним, что в Whatsapp экспорт чатов был возможен уже некоторое время, либо по электронной почте, либо при загрузке в облако (Dropbox и т.д.), либо при загрузке через Bluetooth. Для Телеграм существовали скрипты и инструменты резервного копирования, но они часто были неполными или не сразу использовались. Привлечь живых подписчиков в Телеграм https://doctorsmm.com/kupit-podpischikov-v-telegram/ можно с помощью покупки, стоит это недорого и при этом полностью отсутствуют риски получить бан за спам.

Прежде всего, в качестве резервной копии своих чатов, что трудно или неудобно сделать иначе. Правда, Telegram — в отличие от Whatspapp — хранит чаты и цифровые вложения на своих серверах, поэтому даже если вы потеряете свой смартфон, вы всегда сможете войти в систему через учетную запись телефона и снова получить доступ к своим сообщениям, видео, фотографиям и вложениям. Возможно, все же имеет смысл хранить копии важных потоков на компьютере.

С точки зрения мобильной криминалистики или в области компьютерной криминалистики на смартфонах, может иметь стратегическое значение (во время изъятия и обыска судебной полицией, судебно-технических консультаций по противоречиям или ex Art. 360, доказательственных инцидентов, превентивных технических расследований и т.д.) возможность экспорта всего содержимого одиночного или группового чата, бота или канала. Часто в ходе обыска и выемки или судебного описания операторы вынуждены получать фотографии экрана, которые, не обращая внимания на «криминалистический» вопрос, ограничены по содержанию.

Стоит напомнить, что для приобретения не обязательно иметь в руках смартфон: достаточно иметь любой ПК с ОС Windows, Mac OS или Linux, программу Telegram Desktop версии 1.3.13 или более поздней (скачать можно с официального сайта Telegram Desktop) и возможность получения SMS с аутентификационным PIN-кодом на пользователя, на которого зарегистрирован профиль Telegram. Очевидно, что для выполнения последнего требования придется вставить SIM-карту в другой телефон, и если пользователь также использовал «облачный пароль», необходимо будет знать его или иметь возможность сбросить. Конечно, остается 24-часовой период ожидания для новых установок клиента Telegram Desktop, который, безусловно, может быть ограничивающим при изъятии и обыске.

Экспорт чата Telegram включает все элементы (фотографии, видео, голосовые или видеосообщения, вложения файлов, местоположения, ссылки и т.д.), так что если технически и не является результатом криминалистического получения, то, по крайней мере, является максимально полным. Чтобы сделать извлечение более похожим на судебную экспертизу, можно, например, предусмотреть запись видео и потока данных сетевой карты, затем заключить все в архив ZIP, RAR, TGZ или 7ZIP для вычисления хэша MD5 и/или SHA256, возможно, проставить дату через цифровую временную метку или вербализовать все в документах или официальных актах, чтобы если не воспроизвести, то хотя бы оценить задним числом целостность того, что было сделано консультантом или PG.

Еще по теме:  Как удалить чат в Телеграмме на телефоне навсегда на Айфоне

Более того, на некоторых устройствах, несмотря на поддержку передовых инструментов для сбора криминалистических данных, таких как UFED4PC или Cellebrite’s Physical Analyzer, Oxygen Forensics, MSAB XRY, Compelson’s MOBILedit, иногда невозможно получить доступ к чатам Telegram, поэтому приходится ограничиваться фотографированием экрана или рисковать rooting/jailbreaking, применяемыми только в определенных ситуациях.

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

Жертвы преследования, угроз, оскорблений, клеветы часто задаются вопросом, как экспортировать доказательства преступления, жертвой которого они стали, содержащиеся в чатах Telegram, чтобы иметь возможность использовать их в качестве доказательств для приложения к жалобе, которую они или их адвокаты подадут в прокуратуру, суд или полицию. Безусловно – хотя, как было сказано, что это предвзятое приобретение, не осуществляемое с помощью криминалистической аппаратуры, — если жертва преступления сможет самостоятельно экспортировать чат, доказывающий клевету или преследование, расследование может быть облегчено. Примите во внимание и тот факт, что в ряде случаев в Telegram пользователи могут навсегда удалить сообщения, вложения, видео или фотографии из чатов или групп, что делает бесполезной позднюю криминалистическую деятельность по получению информации.

Чтобы удалить сообщения Telegram, а также видео, фотографии или вложения из чатов или групп, достаточно выбрать «Удалить сообщение для пользователя», и наш собеседник также увидит исчезновение сообщений, что делает бесполезным любое посмертное приобретение, за исключением редких случаев, когда возможно восстановление удаленных сообщений Telegram, которые, однако, зависят от таких элементов, как количество времени, прошедшего с момента удаления, и интенсивность использования платформы Telegram. Если жертве удается немедленно и самостоятельно загрузить копию чата на свой компьютер, то появляется возможность укрыться и получить данные, которые в противном случае рискуют быть удаленными.

Facebook — запрещенная в РФ организация, признанная экстремистской

Источник: gorodkirov.ru

Бот который может собрать данные из чата в телеграмме

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

doPost(e)

// основная функция, которая обрабатывает входящие данные от телеграма function doPost(e)< const main = JSON.parse(e.postData.contents); // получаем данные из телеграм бота // вытаскиваем все данные из contents const chatId = main.message.chat.id; const firstName = main.message.chat.first_name; const lastName = main.message.chat.last_name; const messageText = main.message.text; const arrayText = messageText.split(» «); // массив для последующей обработки команд const detailsArray = [chatId, firstName, lastName, messageText, arrayText]; //собираем все что выше массив const objToTransfer = Object.assign(<>, detailsArray); // делаем из массива объект для передачи analyseDetails(objToTransfer); //вызываем функцию для дальнейшей обработки того, что пришло >

Первую часть с JSON я описывал ранее.

Далее я беру по ключу объекта его значение и самое важное тут chatId = main.message.chat.id;

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

Далее я собираю все это в массив, на основе которого создаю объект при помощи Object.assign(<>, detailsArray)

В чем прелесть Object.assign так это то, что созданный объект имеет вид: .

Далее созданный объект я передаю в функцию analyseDetails

analyseDetails(obj)

function analyseDetails(objReceived) < // анализ того, что пришло со стороны телеграма const receivedCommand = objReceived[4][0].toLowerCase(); // «4»: [«/list», «», «» и тд] switch(receivedCommand)< //если пришла команда case ‘/start’: sendStartMessage(objReceived); break; case ‘/help’: sendStartMessage(objReceived); break; case ‘/join’: setNewUser(objReceived); break; case ‘/list’: sendList(objReceived); break; default: // если пришло что-то отличное от команды onModer(objReceived); break; >>

Case /start и /help

function sendStartMessage(obj) < const userId = obj[0]; //Юзер id const startMessage = ` Привет! nn В своей базе я храню данные по срокам предоставления налоговых и бухгалтерских отчетов и деклараций. За $дней до окончания срока я высылаю уведомление об этом.nn Чтобы я смог присылать такие уведомления Вам, отправьте команду /joinnn Чтобы получить список деклараций и сроков их подачи в ближайший квартал, отправьте команду /listnn Если Вам необходимо добавить в базу недостающие сроки подачи деклараций, отправьте мне сообщение в виде «Дата: Декларация» и я передам его на модерацию` sendMessage(userId, startMessage); >

Obj — это тот объект, что приходит из doPost в analyseDetails и далее из него идет на все команды

sendMessage — основная функция, передающая что-либо в телеграм

sendMessage( chatid, chatText)

Вся информация по методу детально описана здесь — https://core.telegram.org/bots/api#sendmessage и повторять ее нет никакого смысла

// базовая функция для отправки сообщения в телеграм с «сервера» function sendMessage(chatid, chatText) < const chatId = chatid; const text = chatText; const payload = < «method»: «sendMessage», «chat_id»: String(chatId), «text»: text, «parse_mode»: ‘HTML’, «disable_web_page_preview»: true >; const data = < «method»: «post», «payload»: payload >; UrlFetchApp.fetch(telegramUrl, data); >

UrlFetchApp.fetch(telegramUrl, data); — передает данные со стороны гугл таблиц на телеграм

Case /join — setNewUser(obj)

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

function setNewUser(obj) < const userId = obj[0]; //Юзер id const userArr = wsUsers.getDataRange().getValues() // получаю массив массивов c пользовательскими id const flatUserArr = userArr.flat() // делаю его обычным массивом для последующего indexOf const userIsHere = flatUserArr.indexOf(userId) // делаю проверку наличия записи пользовательского ID if(userIsHere !== -1)< // если такой пользователь уже есть sendMessage(userId, «Пользователь уже есть в моей базе «) >else < // добавляю нового пользователя wsUsers.appendRow([userId]) // appendRow — каждая ячейка это массив sendMessage(userId, «Пользователь был успешно добавлен.nВ ближайшее время ждите рассылку!») >>

Функция setNewUser() проверяет наличие записанного пользовательского id на листе «Users» и если такого айди там нет — записывает его через wsUsers.appendRow([userId])

Case /list — отправка списка деклараций к подаче в ближайшие 90 дней

// для выполнения /list — список подаваемых деклараций на ближайшие QUARTER дней function getQuarterList() < const today = new Date() // сегодня const quarter = new Date() quarter.setDate(today.getDate() + QUARTER) // сегодня + QUARTER дней const allArr = wsDb.getDataRange().getValues() // массив со всеми датами и декларациями const filteredArr = allArr.filter(row =>(new Date(row[0])) > today (new Date(row[0])) < quarter) // выбираем записи которые больше чем сегодня и меньше чем через QUARTER дней const beautyArr = filteredArr.map(row =>[(row[0].toLocaleString().split(‘,’)[0]) + » : » + row[1]]) // причесываем для последующей конвертации в текст const arrToText = beautyArr.join(‘n’) return arrToText > // послать список подаваемых деклараций на ближайшие QUARTER дней function sendList(obj)< const userId = obj[0]; //Юзер id const text = getQuarterList() // данные к подаче на ближайшие QUARTER дней sendMessage(userId, text); >

getQuarterList — выбирает весь список данных и фильтрует их между датами сегодня и сегодня + 90 дней

sendList — посылает список пользователю

Case default — когда приходит что угодно

// если пришло что-то отличное от команды — отправить администратору бота function onModer(obj) < const userId = obj[0] const userName = obj[1] const userSurname = obj[2] const userMessage = obj[3] const text = `Пользователь $$ с ID $ послал на модерацию сообщение: $` sendMessage(ADMIN_ID, text) >

Еще по теме:  Как в Телеграмме удалить контакт которого нет в телефонной книге Андроид

Функция отправляет «что угодно, отличное от пришедших команд» администратору ADMIN_ID на модерацию

И последняя часть — «серверная»:

Отправка боту «списка приближающихся сроков» по триггеру

// Фильтрованный массив с датами в текст function filteredArrToText()< const filteredArr = filteredDaysArr(); // фильтрованный массив const beautyArr = filteredArr.map(row =>[row[0]+» : » +row[1]]) // «причесанный» фильтрованный массив const textFromArr = beautyArr.join(‘n’) // массив в текст с разделителем новой строки для отправки в телеграм return textFromArr > // Для ежедневного триггера — проверка на наличие отправки function checkerToSend() < const text = filteredArrToText() // что сегодня рассылать — текст из фильтрованного массива if(text.length !== 0)< // если длина текста не равна 0 — т.е. там есть что отправлять const userArr = wsUsers.getDataRange().getValues() // получаю массив с пользовательскими id — кому идет рассылка for(let elem of userArr)< // для каждого элемента массива с пользовательскими id let messageText = ` Через $дней срок подачи:n` sendMessage(elem, (messageText + text)) // отправка сообшения > > >

checkerToSend вешается на триггер по дням и если длина text собранного из filteredArrToText не равна 0, т.е. когда там есть текст — отправляется на всех пользователей из wsUsers.getDataRange().getValues()

Вам также может понравиться

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

1C и гугл таблицы: переношу многоуровневый текст из журнала операций в отдельный столбец

Трюк с пользовательским форматом

У этой записи 9 комментариев

Егор Караваев 08.12.2021 Ответить

Тоже делаю что-то подобное с ботом. Передачу любого текста из таблицы боту и обратно освоил, но никак не могу настроить передачу картинок через sendPhoto.
Допустим, хочу отправлять боту pie chart в виде картинки. Приходится сохранять сначала на google drive, а оттуда уже по URL отправлять в телегу. Но проблема в том, что URL меняется и в итоге отправляется один и тот же файл. При этом с отправкой картинки на gmail все работает как надо. Были похожие задачи? function createPieChart() < var parents = DriveApp.getFileById(«1tQzMwEtPeFLx….6SfJ_BMcbb4-Y7FQY»).getParents();
var folder = parents.hasNext() ? parents.next() : DriveApp.getRootFolder(); var sheet = SpreadsheetApp.openById(«1tQzMwEtPeFLxMx….bH6SfJ_BMcbb4-Y7FQY»).getSheetByName(«Settings»);
var totalChartLabels = sheet.getRange(«A2:A28»);
var totalChartValues = sheet.getRange(«D2:D28»); var totalsChart = sheet.newChart()
.setChartType(Charts.ChartType.PIE)
.addRange(totalChartLabels)
.addRange(totalChartValues)
.setMergeStrategy(Charts.ChartMergeStrategy.MERGE_COLUMNS)
.setPosition(6,7,0,0)
.setOption(‘legend.position’, ‘bottom’)
.setOption(‘pieSliceText’, ‘value-and-percentage’)
.setOption(‘width’, 300)
.setOption(‘height’, 300)
.setNumHeaders(1) var blob = totalsChart.build().getBlob(); //Email
//sendMail(blob); //Google Drive
folder.createFile(blob); //Telegram
sendChart(adminID);
> function sendChart(id) var url = telegramUrl + «/sendPhoto?chat_id=» + id + «
var response = UrlFetchApp.fetch(url);
>

Добрый день!
Вам в коде нужно дать доступ к файлу другим системам (а не только вам) и еще получить урл:
const resultURL = resultFile.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW).getUrl()

function getPicture() < const chart = ws.newChart()
.asColumnChart()
.addRange(ws.getRange(‘A1:B7’))
.setMergeStrategy(Charts.ChartMergeStrategy.MERGE_COLUMNS)
.setTransposeRowsAndColumns(false)
.setNumHeaders(-1)
.setHiddenDimensionStrategy(Charts.ChartHiddenDimensionStrategy.IGNORE_BOTH)
.setPosition(9, 1, 448, 1)
.build(); const chartBlob = chart.getBlob()
const resultFile = DriveApp.createFile(chartBlob)
const resultURL = resultFile.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW).getUrl() console.log(resultURL)
>

Григорий 04.04.2022 Ответить
Евгений 10.08.2023 Ответить

Дмитрий, полезная статья, благодарю!
Подскажи, плиз, а при рассылке сообщений не нужно учитывать лимиты телеграм на отправку 30 сообщений в 1 сек? Если, например, пользователей в массиве на отправку будет 300 человек.
В коде только цикл.
for(let elem of userArr) < // для каждого элемента массива с пользовательскими id
let messageText = ` Через $ дней срок подачи:n`
sendMessage(elem, (messageText + text)) // отправка сообшения
> Или тут как-то по-другому работает? Если не сложно, поясни плиз ;)))

Привет.
Спасибо за очень хороший вопрос.
Учитывать конечно нужно. Равно как и учитывать квоты самого гугла (я об этом тоже уже много раз писал) — 300, кстати, гугл пропустит.
Тут 2 пути:
1) Гугловый — использовать Utilities.sleep() — когда скрипт засыпает на указанное количество миллисекунд. Немедленно переводит скрипт в спящий режим на указанное количество миллисекунд. Максимально допустимое значение — 300 000 (или 5 минут). То есть можно принудительно ограничить количество отправок за определенный интервал времени
Можно сделать массив рассылки сообщений пользователей и через каждые 30 сообщений — засыпать.
2) Телеграмовый — просто создать группу в которой находятся хоть 300 хоть 3000 пользователей и туда завесить бота. Бот будет слать всего лишь одно сообщение в группу (id которой начинается со знака «-«) и оно будет видно всем пользователям. В целом гугл скрипт в связке с таблицами (или firebase) по работе с телегой — далеко не самое лучшее решение, когда количество пользователей начинает расти по экспоненте. Но он бесплатный, остальные же варианты — стоят денег. Именно поэтому я использую второй путь, через группы телеграма.

Евгений 11.08.2023 Ответить

Дмитрий, спасибо за такое подробное пояснение!
Да, про второй вариант тоже думал, что можно так делать. Именно интересовал вариант «Гугловый » :)))
А так да, гугл скрипт + телеграм бот — есть понимание, что для очень большого количества пользователей не гууд. Но для себя и небольшой базы, думаю самое то:) Еще такой вопрос возник: вот например я использую 1 вариант и ставлю выполнение скрипта на паузу, всё это зацикливаю. Отправилась порция, пауза, отправилась порция, пауза и т.д. Как по лимитам гугла это будет? Пока скрипт «спит» — не идет серверное время? Время исполнения считается? Или как?
Вопрос к тому, что, например, есть база в 3 000 чел. настроил на отправка 30 / пауза. Это 100 пауз. Не будет такого, что на 25 или 45 цикле выполнение остановится и все, дальше не пойдет?

Источник: dmitriizhuk.ru

Как написать парсер для телеграмм

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

Для указанных задач будет использоваться Python не ниже версии 3.5, а также высокоуровневая библиотека для работы с Telegram API – Telethon. Установить библиотеку можно с помощью менеджера пакетов pip :

pip3 install telethon

Для подключения к Telegram API необходимы api_id и api_hash . Эти параметры выдаются при регистрации приложения в инструментах разработчика (при отсутствии доступа используйте VPN). Для авторизации указываем номер телефона, к которому привязан аккаунт Telegram.

Пишем простой граббер для Telegram чатов на Python

Вводим пришедший в Telegram численно-буквенный код и попадаем на страницу регистрации нового приложения. Заполняем форму, достаточно первых двух граф:

Пишем простой граббер для Telegram чатов на Python

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

Избегая проблем с безопасностью, сохраняем учетные данные в отдельном файле config.ini следующей структуры:

[Telegram] api_id = Telegram-API-ID api_hash = Telegram-API-Hash username = Your-Telegram-Username

Поле username далее будет использоваться лишь для автоматического сохранения сессии под именем username.session . Одному клиенту соответствует одна сессия, учтите это в случае запуска нескольких клиентов.

Еще по теме:  Инструмент для скачивания сообщений из Телеграмм на ПК

Создаем клиент Telegram

Начнем с импорта библиотек.

import configparser import json from telethon.sync import TelegramClient from telethon import connection # для корректного переноса времени сообщений в json from datetime import date, datetime # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest

Встроенные модули configparser и json применяем соответственно для чтения параметров и вывода данных. Из библиотеки Telethon импортируем класс клиента Telegram и класс исключений. Внутренний модуль connection необходим при использовании прокси-сервера. Остальные элементы модуля telethon.tl используются для запросов необходимых нам списков (участников канала/чата и их сообщений).

Теперь считаем учетные данные из config.ini :

# Считываем учетные данные config = configparser.ConfigParser() config.read(«config.ini») # Присваиваем значения внутренним переменным api_id = config[‘Telegram’][‘api_id’] api_hash = config[‘Telegram’][‘api_hash’] username = config[‘Telegram’][‘username’]

Создадим объект клиента Telegram API:

client = TelegramClient(username, api_id, api_hash)

При необходимости прописываем прокси. При использовании протокола MTProxy прокси задается в виде кортежа (сервер, порт, ключ) .

proxy = (proxy_server, proxy_port, proxy_key) client = TelegramClient(username, api_id, api_hash, connection=connection.ConnectionTcpMTProxyRandomizedIntermediate, proxy=proxy)
client.start()

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

Для сбора, обработки и сохранения информации мы создадим две функции:

  1. dump_all_participants(сhannel) заберет данные о пользователях администрируемого нами сообщества channel ;
  2. dump_all_messages(сhannel) соберет все сообщения. Для этой функции достаточно, чтобы у вас был доступ к сообществу (необязательно быть администратором).

Обе функции будут вызываться в теле функции main , в которой пользователь передаст ссылку на интересующий источник:

url = input(«Введите ссылку на канал или чат: «) channel = await client.get_entity(url)

Касательно написания вызова функций стоит оговориться, что Telethon является асинхронной библиотекой. Поэтому в коде используются операторы async и await. В связи с этим функция main полностью будет выглядеть так:

async def main(): url = input(«Введите ссылку на канал или чат: «) channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel)

Заметим, что из-за асинхронности Telethon может некорректно работать в средах, использующих те же подходы (Anaconda, Spyder, Jupyter).

Рекомендуемым способом управления клиентом является менеджер контекстов with . Его мы запустим в конце скрипта после описания вложенных в main функций.

with client: client.loop.run_until_complete(main())

Собираем данные об участниках

Telegram не выводит все запрашиваемые данные за один раз, а выдает их в пакетном режиме, по 100 записей за каждый запрос.

async def dump_all_participants(channel): «»»Записывает json-файл с информацией о всех участниках канала/чата»»» offset_user = 0 # номер участника, с которого начинается считывание limit_user = 100 # максимальное число записей, передаваемых за один раз all_participants = [] # список всех участников канала filter_user = ChannelParticipantsSearch(») while True: participants = await client(GetParticipantsRequest(channel, filter_user, offset_user, limit_user, hash=0)) if not participants.users: break all_participants.extend(participants.users) offset_user += len(participants.users)

Устанавливаем ограничение в 100, начинаем со смещения 0, создаем список всех участников канала all_participants . Внутри бесконечного цикла передаем запрос GetParticipantsRequest .

Проверяем, есть ли у объекта participants свойство users . Если нет, выходим из цикла. В обратном случае добавляем новых членов в список all_participants , а длину полученного списка добавляем к смещению offset_user . Следующий запрос забирает пользователей, начиная с этого смещения. Цикл продолжается до тех пор, пока не соберет всех фолловеров канала.

Самый простой способ сохранить собранные данные в структурированном виде – воспользоваться форматом JSON. Базы данных, такие как MySQL, MongoDB и т. д., стоит рассматривать лишь для очень популярных каналов и большого количества сохраняемой информации. Либо если вы планируете такое расширение в будущем.

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

all_users_details = [] # список словарей с интересующими параметрами участников канала for participant in all_participants: all_users_details.append() with open(‘channel_users.json’, ‘w’, encoding=’utf8′) as outfile: json.dump(all_users_details, outfile, ensure_ascii=False)

Итак, для каждого пользователя создается свой словарь данных и добавляется в общий список all_user_details , который записывается в JSON-файл.

Собираем сообщения

Ситуация со сбором сообщений идентична сбору сведений о пользователях. Отличия сводятся к трем пунктам:

  1. Вместо клиентского запроса GetParticipantsRequest необходимо отправить GetHistoryRequest со своим набором параметров. Так же, как и в случае со списком участников запрос ограничен сотней записей за один раз.
  2. Для списка сообщений важна их последовательность. Чтобы получать последние сообщения, нужно правильно задать смещение в GetHistoryRequest (с конца).
  3. Чтобы корректно сохранить данные о времени публикации сообщений в JSON-файле, нужно преобразовать формат времени.

import configparser import json from telethon.sync import TelegramClient from telethon import connection # для корректного переноса времени сообщений в json from datetime import date, datetime # классы для работы с каналами from telethon.tl.functions.channels import GetParticipantsRequest from telethon.tl.types import ChannelParticipantsSearch # класс для работы с сообщениями from telethon.tl.functions.messages import GetHistoryRequest # Считываем учетные данные config = configparser.ConfigParser() config.read(«config.ini») # Присваиваем значения внутренним переменным api_id = config[‘Telegram’][‘api_id’] api_hash = config[‘Telegram’][‘api_hash’] username = config[‘Telegram’][‘username’] proxy = (proxy_server, proxy_port, proxy_key) client = TelegramClient(username, api_id, api_hash, connection=connection.ConnectionTcpMTProxyRandomizedIntermediate, proxy=proxy) client.start() async def dump_all_participants(channel): «»»Записывает json-файл с информацией о всех участниках канала/чата»»» offset_user = 0 # номер участника, с которого начинается считывание limit_user = 100 # максимальное число записей, передаваемых за один раз all_participants = [] # список всех участников канала filter_user = ChannelParticipantsSearch(») while True: participants = await client(GetParticipantsRequest(channel, filter_user, offset_user, limit_user, hash=0)) if not participants.users: break all_participants.extend(participants.users) offset_user += len(participants.users) all_users_details = [] # список словарей с интересующими параметрами участников канала for participant in all_participants: all_users_details.append() with open(‘channel_users.json’, ‘w’, encoding=’utf8′) as outfile: json.dump(all_users_details, outfile, ensure_ascii=False) async def dump_all_messages(channel): «»»Записывает json-файл с информацией о всех сообщениях канала/чата»»» offset_msg = 0 # номер записи, с которой начинается считывание limit_msg = 100 # максимальное число записей, передаваемых за один раз all_messages = [] # список всех сообщений total_messages = 0 total_count_limit = 0 # поменяйте это значение, если вам нужны не все сообщения class DateTimeEncoder(json.JSONEncoder): »’Класс для сериализации записи дат в JSON»’ def default(self, o): if isinstance(o, datetime): return o.isoformat() if isinstance(o, bytes): return list(o) return json.JSONEncoder.default(self, o) while True: history = await client(GetHistoryRequest( peer=channel, offset_id=offset_msg, offset_date=None, add_offset=0, limit=limit_msg, max_id=0, min_id=0, hash=0)) if not history.messages: break messages = history.messages for message in messages: all_messages.append(message.to_dict()) offset_msg = messages[len(messages) — 1].id total_messages = len(all_messages) if total_count_limit != 0 and total_messages >= total_count_limit: break with open(‘channel_messages.json’, ‘w’, encoding=’utf8′) as outfile: json.dump(all_messages, outfile, ensure_ascii=False, cls=DateTimeEncoder) async def main(): url = input(«Введите ссылку на канал или чат: «) channel = await client.get_entity(url) await dump_all_participants(channel) await dump_all_messages(channel) with client: client.loop.run_until_complete(main())

Если для анализа сообщений потребуются не все записи, задайте их число в переменной total_count_limit . Если нужна только сборка сообщений канала, достаточно закомментировать вызов await dump_all_participants(channel) .

Таким образом, с помощью Python и Telethon мы написали скрипт, собирающий и сохраняющий данные и реплики участников сообществ Telegram.

Источник: pishuverno.ru

Рейтинг
( Пока оценок нет )
Загрузка ...