Апи Телеграмм читать сообщения групп

Итак, мне удалось через 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;

Автоведение Telegram паблика. Пишем граббер за 5 минут

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

Далее я собираю все это в массив, на основе которого создаю объект при помощи 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 и повторять ее нет никакого смысла

Пишем Telegram бота, который говорит с ChatGPT API


// базовая функция для отправки сообщения в телеграм с «сервера» 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()

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

Пишем телеграм-бота. Часть 1: Серверная часть или данные в Google таблицах.

Получаем информацию из web app на сторону скриптов

Разбираемся с doGet() дальше. Часть 2 — добавляем (e)

У этой записи 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 с API Telegram Bot

Любой, кто дает стартер, как я могу получить информацию о пользователях из моего телеграммы bot.Imagine мой бот в пользователе администратора на моем канале, и я хочу получить список моих каналов или быть замеченным, когда новый пользователь присоединяется. Как мне это сделать. Документы телеграммы настолько неорганизованны. до сих пор я смотрел на них:

Но ничто из этого действительно не помогает.

ОТВЕТЫ

Ответ 1

Чтобы получить список пользователей, вам необходимо использовать API телеграмм.

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

Для python существует Telethon, а способ получения пользователей канала:

Ответ 2

Telegram Bot не хранит ничего о ваших пользователях. Вы должны сохранить самостоятельно всех пользователей, которые общаются с вашим ботом. Например, сохраните их идентификаторы в базе данных.

В случае канала — вы можете получить эту информацию из списка участников канала.

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

Ответ 3

Чтобы получить список пользователей, вам необходимо использовать API телеграмм.

API Telegram довольно сложный. Есть несколько клиентов, которые могут выполнить работу намного быстрее.

Для python существует Telethon, а код для получения пользователей канала:

from telethon import TelegramClient from telethon.tl.functions.contacts import ResolveUsernameRequest from telethon.tl.functions.channels import GetAdminLogRequest from telethon.tl.types import InputChannel from telethon.tl.types import ChannelAdminLogEventsFilter from telethon.tl.types import InputUserSelf from telethon.tl.types import InputUser # These example values won’t work. You must get your own api_id and # api_hash from https://my.telegram.org, under API Development. api_id = ****** # Your api_id api_hash = ‘********************************’ # Your api_hash phone_number = ‘+989122594574’ # Your phone number client = TelegramClient(phone_number, api_id, api_hash) client.session.report_errors = False client.connect() if not client.is_user_authorized(): client.send_code_request(phone_number) client.sign_in(phone_number, input(‘Enter the code: ‘)) channel = client(ResolveUsernameRequest(‘tabe_eshgh’)) # Your channel username user = client(ResolveUsernameRequest(‘amir2b’)) # Your channel admin username admins = [InputUserSelf(), InputUser(user.users[0].id, user.users[0].access_hash)] # admins admins = [] # No need admins for join and leave and invite filters filter = None # All events # param: (join, leave, invite, ban, unban, kick, unkick, promote, demote, info, settings, pinned, edit, delete) filter = ChannelAdminLogEventsFilter(True, True, True, False, False, False, False, False, False, False, False, False, False, False) result = client(GetAdminLogRequest(InputChannel(channel.chats[0].id, channel.chats[0].access_hash), », 0, 0, 10, filter, admins)) ##print(result) for _user in result.users: ##print(_user.id) with open(».join([‘users/’, str(_user.id)]), ‘w’) as f: f.write(str(_user.id))

Ответ 4

Бот не может получить доступ к списку пользователей каналов через api. Для этого есть две возможности:

  • поймать все сообщения канала и фильтр «XXX присоединился к каналу» один — это теоретически, я не пытался
  • использовать https://github.com/vysheng/tgl
Еще по теме:  Как в Телеграмме создать чат и добавить людей

Ответ 5

Нет никакого api для бота Telegram для доступа к пользователям каналов или групп. Если доступ к пользователям группы важен для вас, я предлагаю вам использовать Telegram-CLI. Вы можете получить доступ ко всем пользовательским API учетной записи Telegran, чтобы у вас был доступ ко всем данным ваших пользователей группы.

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

Бот Телеграм на PHP

Примеры как зарегистрировать бота в Telegram, описание и взаимодействие с основными методами API. Документация на core.telegram.org и tlgrm.ru (неофициальный, на русском).

Все запросы к API должны осуществляться по HTTPS, подойдет бесплатный сертификат «Let’s Encrypt».

Регистрация бота

Регистрация бота в Telegram

Следующим сообщением отправляем название для бота, обязательно на конце имени должно быть слово «bot» или «_bot». Ответным сообщением получим токен:

Получение токена к bot API Telegram

Тут же можно настроить описание и аватарку:

/setname Имя
/setdescription Краткое описание
/setabouttext Описание бота
/setuserpic Юзерпик

Далее нужно поставить «Webhook» чтобы все сообщения из Telegram приходили на PHP скрипт ( https://example.com/bot.php ). Для этого нужно пройти по ссылке в которой подставлены полученный токен и адрес скрипта. https://api.telegram.org/bot /setWebhook?url= https://example.com/bot.php

В ответе будет

При смене токена, установку вебхука нужно повторить.

Входящие сообщения

Сообщения приходят POST-запросом, с типом application/json . Получить его в PHP можно следующим образом:

$data = file_get_contents(‘php://input’); $data = json_decode($data, true);
Чтобы посмотреть входящие данные, их придется дампить в файл:
file_put_contents(__DIR__ . ‘/message.txt’, print_r($data, true));

Текстовое сообщение

Запрос от Телеграм:

Array ( [update_id] => 17584194 [message] => Array ( [message_id] => 26 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541888068 [text] => Привет бот! ) )

Получим текст сообщения:

if (!empty($data[‘message’][‘text’]))

Фотографии

При отправки фото боту, на скрипт приходит массив превьюшек, последним элементом будет оригинальное фото.

Максимальный размер файла 20МБ.

Запрос от Телеграм:

Array ( [update_id] => 17584194 [message] => Array ( [message_id] => 38 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541924962 [photo] => Array ( [0] => Array ( [file_id] => AgADAgADUqexG7u8OEudBvlhgMzKC1agOQ8ABC6Bx26USA7Mw3gAAgI [file_size] => 1196 [width] => 51 [height] => 90 ) [1] => Array ( [file_id] => AgttAgADUqoxG7u8OEudBvlhgMzKC1agOQ8ABKwp_3jDPrIlxHgAAgI [file_size] => 21146 [width] => 180 [height] => 320 ) [2] => Array ( [file_id] => AgADAgADUqyxG7u8OEudBvlhgMzKC1agOQ8ABAN8gJWpUT1MxXgAAgI [file_size] => 90940 [width] => 449 [height] => 800 ) [3] => Array ( [file_id] => AgADAgADUqouu7u8OEudBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI [file_size] => 114363 [width] => 719 [height] => 1280 ) ) ) )

Чтобы скачать файл нужно отправить POST или GET запрос на получение c параметром file_id изображения по URL: https://api.telegram.org/bot /getFile В ответ придет информация о файле:

Array ( [ok] => 1 [result] => Array ( [file_id] => AgADAgADUqoxG5u88E0dBvlhgMzKC1agOQ8ABIqVC1nEpbLDwngAAgI [file_size] => 114363 [file_path] => photos/file_1.jpg ) )

Далее его можно скачать по ссылке: https://api.telegram.org/file/bot / В PHP сохранение файла на сервер можно реализовать следующим образом:

$token = ‘123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11’; if (!empty($data[‘message’][‘photo’])) < $photo = array_pop($data[‘message’][‘photo’]); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/getFile’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘file_id’ =>$photo[‘file_id’])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . $token . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . basename($src); copy($src, $dest); >>

Документ

Запрос от Телеграм:

Array ( [update_id] => 17474201 [message] => Array ( [message_id] => 44 [from] => Array ( [id] => 123456789 [is_bot] => [first_name] => UserName [language_code] => ru-US ) [chat] => Array ( [id] => 123456789 [first_name] => UserName [type] => private ) [date] => 1541925844 [document] => Array ( [file_name] => IMG_7947.JPG [mime_type] => image/jpeg [thumb] => Array ( [file_id] => AAQCABMNv_QOAATwQugveIZBldZ3AAIC [file_size] => 2644 [width] => 67 [height] => 90 ) [file_id] => BQADAgADtQEAAqu9OEhzn2cEz8LpkgI [file_size] => 1976218 ) ) )

Скачивание файлов происходит по такой же схеме как у фотографий.
if (!empty($data[‘message’][‘document’])) < $file_id = $data[‘message’][‘document’][‘file_id’]; $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/getFile’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘file_id’ =>$file_id)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, true); if ($res[‘ok’]) < $src = ‘https://api.telegram.org/file/bot’ . $token . ‘/’ . $res[‘result’][‘file_path’]; $dest = __DIR__ . ‘/’ . time() . ‘-‘ . basename($src); copy($src, $dest); >>

Ответы бота

Отправка текста

$response = array( ‘chat_id’ => $data[‘message’][‘chat’][‘id’], ‘text’ => ‘Хай!’ ); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/sendMessage’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);

Отправка картинки

$response = array( ‘chat_id’ => $data[‘message’][‘chat’][‘id’], ‘photo’ => curl_file_create(__DIR__ . ‘/image.png’) ); $ch = curl_init(‘https://api.telegram.org/bot’ . $token . ‘/sendPhoto’); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $response); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);

Отправка файла

Пример скрипта

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

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