Telegram Bot - как получить идентификатор группового чата?

170

Я использую telegram_bot и пытаюсь получить идентификатор groupChat для отправки уведомлений в групповой чат, но не знаю, какие методы я должен использовать для этого.

Для получения идентификатора чата я использую message.chat.id, когда бот участвует в чате, но я не могу найти его, чтобы получить идентификатор группового чата.

Роман Подпрятов
источник
1
Я управляю ботом для этого. Я надеюсь, что это поможет, проверьте это < stackoverflow.com/a/37396871/6223024 >
Фреди Кардиан

Ответы:

227

Чтобы получить идентификатор группового чата, сделайте следующее:

  1. Добавьте Telegram BOT в группу.

  2. Получить список обновлений для вашего BOT:

    https://api.telegram.org/bot<YourBOTToken>/getUpdates
    

    Пример:

    https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
    
  3. Ищите объект "чат":

{ "Update_id": 8393, "сообщение": { "message_id": 3, "с": { "ID": 7474, "first_name": "AAA"}, "чат": { "ID": "название ":" "}," дата ": 25497," new_chat_participant ": {" ID ": 71," first_name ":" NAME», "Имя пользователя": "YOUR_BOT_NAME"}}}

Это образец ответа при добавлении вашего BOT в группу.

  1. Используйте «id» объекта «chat» для отправки ваших сообщений.
Maverick_Java
источник
1
Можете ли вы привести пример?
Роман Подпрятов
2
@WannaBeCoder, вы можете добавить BOT в группу, как и любой другой участник: перейдите в свойства вашей группы, нажмите add member, а затем используйте значок поиска, чтобы найти имя BOT. НО, имейте в виду, что после недавних изменений в группах Telegrams вы должны быть администратором группы, чтобы добавить нового участника, независимо от того, являются ли они BOT или нет.
Maverick_Java
37
Для вновь созданных групп getUpdatesвозвращаются запрос , {"ok":true,"result":[]}даже если я пытаюсь отправить кучу сообщений в группе и упоминание бот через @и некоторые случайные «команды» /my_id, /start, /help. Есть идеи что делать? - ОБНОВЛЕНИЕ: ОК, удаление бота из группы и добавление бота обратно исправили эту проблему (также он печатал идентификатор чата в группе) - похоже, что бот не может быть добавлен во время создания группы.
Рутский
8
это возвращает: {"ok": true, "result": []}
Tom
3
Привет том. Вы уже пробовали решение rutsky: «удаление бота из группы и добавление бота обратно решило эту проблему (также он напечатал идентификатор чата в группе) - похоже, бот не может быть добавлен во время создания группы»? Я сталкивался с той же проблемой пару раз, и удаление бота из группы и добавление его снова всегда решало проблему. Дайте мне знать, если это вам не поможет.
Maverick_Java
136

Вот последовательность, которая работала для меня после нескольких часов борьбы:

Предположим, имя бота my_bot .

1- Добавить бота в группу.
Перейдите в группу, нажмите на имя группы, нажмите «Добавить участников», в окне поиска найдите своего бота, например: @my_bot, выберите своего бота и нажмите «Добавить».

2- Отправьте фиктивное сообщение боту.
Вы можете использовать этот пример: /my_id @my_bot
(Я пробовал несколько сообщений, не все сообщения работают. Пример выше работает нормально. Возможно, сообщение должно начинаться с /)

3- Перейдите на следующий URL: https://api.telegram.org/botXXX:YYYY/getUpdates
замените XXX: YYYY на свой токен бота.

4- Ищите "chat": {"id": - zzzzzzzzzz,
-zzzzzzzzzz - это идентификатор вашего чата (с отрицательным знаком).

5- Тестирование: вы можете проверить отправку сообщения группе с помощью локона:

curl -X POST "https://api.telegram.org/botXXX:YYYY/sendMessage" -d "chat_id=-zzzzzzzzzz&text=my sample text"

Если вы пропустите шаг 2, обновлений для группы, которую вы ищете, не будет. Также, если есть несколько групп, вы можете найти имя группы в ответе («title»: « group_name »).

Надеюсь это поможет.

Apadana
источник
2
Отличная разбивка о том, как настроить BOT.
fear_matrix
Я отправил одно сообщение боту, но оно не сработало мгновенно, подождав несколько секунд (или, возможно, минут) и снова попробовав curl.
LiveWireBT
4
Я не могу заставить своего бота работать в группе, я получаю {"ok": true, "result": []} в браузере. Надеюсь, что кто-нибудь может мне помочь
TheMrkt
1
Это сработало для меня. Во-первых, если у вас настроены веб-хуки, вы должны отключить их. Спасибо!
Эрих Гарсия
3
@TheMrkt Кажется, как сказал apadana, что sendind сообщение, начинающееся с /like, /test somethingделает счастливыми getUpdates.
e2-e4
100

По состоянию на март 2020 года просто:

  • Пригласите @RawDataBot в свою группу.

После присоединения он выведет JSON-файл, в котором ваш идентификатор чата будет расположен по адресу message.chat.id .

"message": {
    "chat": {
        "id": -210987654,
        "title": ...,
        "type": "group",
        ...
    }
    ...
}

Не забудьте выкинуть @RawDataBot из вашей группы после этого.

eivamu
источник
3
Где @RawDataBot выводит это? Я добавил бота в свою группу, но ничего не произошло. Обновление: вам нужно установить имя пользователя в Telegram, иначе ничего не произойдет.
Фрэнк Мейленаар
1
Безусловно, самый простой способ достичь этого. Спасибо!
Suchanoob
1
@Cherona: я только что проверил это. Но кажется, что веб-клиент изменился так, что пригласить бота немного сложнее, чем раньше. Вот как вы можете это сделать: Найдите RawDataBot в поле поиска. Нажмите на контакт, чтобы начать сеанс чата. Нажмите на заголовок чата, чтобы открыть «Контактную информацию». Нажмите «Добавить в группу» и выберите группу. Это немедленно выведет информацию как прежде. Надеюсь, это работает для вас.
Eivamu
42

После середины 2018 года:
1 :) Пригласите @getidsbo или @RawDataBotв свою группу и получите идентификатор своей группы в поле идентификатора отправленного чата.

Message
 ├ message_id: 338
 ├ from
 ┊  ├ id: *****
 ┊  ├ is_bot: false
 ┊  ├ first_name: 사이드
 ┊  ├ username: ******
 ┊  └ language_code: en
 ├ chat
 ┊  ├ id: -1001118554477    // This is Your Group id
 ┊  ├ title: Test Group
 ┊  └ type: supergroup
 ├ date: 1544948900
 └ text: A

2 :) используйте неофициальный мессенджер, такой как Plus Messenger, и посмотрите идентификатор вашей группы в информации о группе / канале.

До середины 2018 года: (не использовать)
1: Перейти ( https://web.telegram.org )
2: Перейти к вашему Gorup и найти ссылку на Gorup ( https://web.telegram.org/#/im ? p = g154513121 )
3: Скопируйте это число после g и поставьте перед ним (-) -154513121
4: Отправьте ваше сообщение в Gorup, который bot.sendMessage(-154513121, "Hi")
я протестировал сейчас, и работайте как заклинание

Седрик Хейдаризарей
источник
1
Очень просто. Спасибо! Проверено в Grafana Alert Notification. Все идет нормально.
Адриан Николаев
@Sedric Heidarizarei, что если это не число, как это ( web.telegram.org/#/im?p=@welcomeworld )
Маркс Бабу
2
«@welcomeworld» - это имя пользователя вашего канала, вы можете переслать сообщение на «@getidsbot» и получить свой идентификатор
Sedric Heidarizarei
сделал то же самое, но столкнулся с ошибкой OverflowError: Python int слишком велик для преобразования в SQLite INTEGER ... client.send_message (-1240933195_1386556410045688xx08.'Hi ')
vinod
Я обновил свой ответ, Этот метод больше не работает, временно используйте After mid-2018метод.
Седрик Хейдаризарей
9

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

В приватном чате с вашим ботом отправьте случайное сообщение. Вы будете искать это сообщение позже.

Получите ваш API-токен от bot_father: XXXXXXXXX:YYYYYYY-YYYYYYYYYYYYYYYYY_YY

Затем в вашем браузере сделайте запрос с этим URL:

https://api.telegram.org/botXXXXXXXXX:YYYYYYY-YYYYYYYYYYYYYYYYY_YY/getUpdates

Запрос возвращает ответ json, в тексте json найдите random messageи получите идентификатор чата в этом объекте.

Йигит Юксель
источник
8

Используя python и telethon очень легко получить идентификатор чата. Это решение лучше всего подходит для тех, кто работает с Telegram API.

Если у вас нет telethon, запустите это:

pip install telethon

Если у вас нет зарегистрированного приложения с телеграммой, зарегистрируйте его: введите описание изображения здесь Ссылка следующая: https://my.telegram.org/

Затем запустите следующий код:

from telethon import InteractiveTelegramClient
from telethon.utils.tl_utils import get_display_name

client = InteractiveTelegramClient('session_id', 'YOUR_PHONE_NUMBER', api_id=1234YOURAPI_ID, api_hash='YOUR_API_HASH')

dialog_count = 10
dialogs, entities = client.get_dialogs(dialog_count)
for i, entity in enumerate(entities):
                    i += 1  # 1-based index
                    print('{}. {}. id: {}'.format(i, get_display_name(entity), entity.id))

Возможно, вы захотите отправить сообщение в вашу группу, чтобы группа появилась вверху списка.

Apadana
источник
7

Вы можете получить идентификатор группы таким же образом. Он появляется в теле сообщения как message.chat.idи обычно является отрицательным числом, где обычные чаты являются положительными.

Идентификаторы групп и идентификаторы чата могут быть получены только из полученного сообщения, нет доступных вызовов для извлечения активных групп и т. Д. При получении сообщения необходимо запомнить идентификатор группы и сохранить его в кеше или чем-то подобном.

Крис Брэнд
источник
Кто-нибудь еще может подтвердить, что это правда? Я близок к тому, чтобы сказать «да» после прочтения документов. Я хотел бы получить chat_id из групповой ссылки, чтобы выполнить мои требования.
PrimeTimeTran
1

создать бота или, если он уже создан, установить следующим образом:

имеет доступ к сообщениям

по-видимому, независимо от того, сколько лет / новой группы Telegram:

  1. добавить бота в группу
  2. удалить бота из группы
  3. снова добавить бота в группу

  4. создайте файл скрипта и запустите getUpdatesпример метода:

    var vApiTokenTelegram = "1234567890:???>yg5GeL5PuItAOEhvdcPPELAOCCy3jBo"; // @?????Bot API token
    var vUrlTelegram = "https://api.telegram.org/bot" + vApiTokenTelegram;

    function getUpdates() {
        var response = UrlFetchApp.fetch(vUrlTelegram + "/getUpdates");
        console.log(response.getContentText());
    }
  1. Функция должна регистрировать на консоли следующее:
[20-04-21 00:46:11:130 PDT] {"ok":true,"result":[{"update_id":81329501,
"message":{"message_id":975,"from":{"id":962548471,"is_bot":false,"first_name":"Trajano","last_name":"Roberto","username":"TrajanoRoberto","language_code":"en"},"chat":{"id":-1001202656383,"title":"R\u00e1dioRN - A voz da na\u00e7\u00e3o!","type":"supergroup"},"date":1587454914,"left_chat_participant":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"left_chat_member":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"}}},{"update_id":81329502,
"message":{"message_id":976,"from":{"id":962548471,"is_bot":false,"first_name":"Trajano","last_name":"Roberto","username":"TrajanoRoberto","language_code":"en"},"chat":{"id":-1001202656383,"title":"R\u00e1dioRN - A voz da na\u00e7\u00e3o!","type":"supergroup"},"date":1587454932,"new_chat_participant":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"new_chat_member":{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"},"new_chat_members":[{"id":1215098445,"is_bot":true,"first_name":"MediaFlamengoRawBot","username":"MediaFlamengoRawBot"}]}}]}
  1. Группа телеграмм chat_id может быть извлечена из вышеуказанного сообщения "chat":{"id":-1001202656383,"title"

Надеюсь, что это помогает (HTH)

Траяно Роберто
источник
0

бот получает следующее сообщение от группы Telegram, в которой находится бот:

извлекать данные по мере необходимости

function doPost(e) {
    var contents = JSON.parse(e.postData.contents);
    //  GmailApp.sendEmail(Session.getEffectiveUser().getEmail(), "Telegram Bot Update", JSON.stringify(contents, null, 4));
    var chat_id = contents.message.chat.id;
    var text = contents.message.text;
    var name = contents.message.from.first_name + " " +  contents.message.from.last_name;
    var sResponse = telegramBotMachine( chat_id, text, name );
}  

/ * содержание

{
    "update_id": 20383255,
    "message": {
        "message_id": 147,
        "from": {
            "id": 999999999,
            "is_bot": false,
            "first_name": "Trajano",
            "last_name": "Roberto",
            "username": "TrajanoRoberto",
            "language_code": "en"
        },
        "chat": {
            "id": -666666666,
            "title": "Test Ataque Media Flamengo",
            "type": "group",
            "all_members_are_administrators": true
        },
        "date": 1585450075,
        "text": "Menu"
    }
}
Траяно Роберто
источник
0

ИМХО, лучший способ сделать это - использовать TeleThon, но, учитывая, что ответ от apadana устарел и не подлежит ремонту, я напишу рабочее решение здесь:

import os
import sys
from telethon import TelegramClient
from telethon.utils import get_display_name

import nest_asyncio
nest_asyncio.apply()

session_name = "<session_name>"
api_id = <api_id>
api_hash = "<api_hash>"
dialog_count = 10 # you may change this

if f"{session_name}.session" in os.listdir():
    os.remove(f"{session_name}.session")

client = TelegramClient(session_name, api_id, api_hash)

async def main():
    dialogs = await client.get_dialogs(dialog_count)
    for dialog in dialogs:
        print(get_display_name(dialog.entity), dialog.entity.id)

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

этот фрагмент даст вам первые 10чаты в вашей Telegram.

Предположения:

  • у вас есть telethonи nest_asyncioустановлены
  • у вас есть api_idи api_hashиз my.telegram.org
Foad
источник
0
function doPost(e) {
    var contents = JSON.parse(e.postData.contents);
    //  GmailApp.sendEmail(Session.getEffectiveUser().getEmail(), "Telegram Bot Update",     JSON.stringify(contents, null, 4));
    var chat_id = contents.message.chat.id;
    var text = contents.message.text;
    var name = contents.message.from.first_name + " " +  contents.message.from.last_name;
    var sResponse = telegramBotMachine( chat_id, text, name );
}
Траяно Роберто
источник
когда сообщение происходит из группы, через JSON-объект доступно несколько фрагментов информации. Вы можете извлечь соответствующую информацию для вашего использования. В приведенном выше примере показано, как получить содержимое chat_id для объекта
Траяно Роберто,
0

Если вы внедряете своего бота, сохраняйте таблицу имени группы -> id и спрашивайте ее с помощью команды. Затем вы также можете отправить по имени.

Анджело Дурегелло
источник