【问题标题】:How to stop telethon?如何停止电视节目?
【发布时间】:2020-05-31 01:23:24
【问题描述】:

我正在尝试停止机器人执行。但我做不到。当我在电报机器人命令/stop 中写下,他必须停下来。代码:

# -*- coding: utf-8 -*-
import telebot
import asyncio
from telethon import TelegramClient,sync,events,utils
from telethon.events import StopPropagation

api_id = ***
api_hash = '******'
username = '*****'
id_channel = -*** 
token = '*****'

bot = telebot.TeleBot(token)
client = TelegramClient(username, api_id, api_hash)

@bot.message_handler(commands=['start','stop'])
def start(message):
    if '/start' in message.text:
        handler_state(True)
        string = f'<b>Привет {message.from_user.first_name}!</b>\nВведите канал для парсинга и свой канал.\n<i>Пример: <pre>channel_pars,your_channel</pre></i>'
        bot.send_message(message.chat.id, string, parse_mode='html')
    elif '/stop' in message.text:
        string = '<b>Парсер остановлен!</b>'
        bot.send_message(message.chat.id, string, parse_mode='html')
        handler_state(False)

def handler_channel(my_channel,parse_channel,stop_script='start'):
    @client.on(events.NewMessage(chats=(parse_channel)))
    async def normal_handler(event):
        if 'stop' in stop_script:
            await client.disconnect()
        #print(event.message.file.media)  # картинка
        message = event.message.to_dict()['message']
        send_data(message)

    client.start()
    client.run_until_disconnected()


def send_data(message):
    bot = telebot.TeleBot(token)
    bot.send_message(id_channel,message)

def handler_state(state):
    if not state:
        handler_channel('default','default','stop')

    my_channel = None
    parse_channel = None
    @bot.message_handler(content_types=['text'])
    def send_message(message):
        if state:
            if ',' not in message.text:
                return bot.send_message(message.chat.id,'<b>Проверьте правильность ввода!</b>',parse_mode='html')
            channels = message.text.split(',')
            my_channel = channels[-1]
            parse_channel = channels[0]
            if not my_channel or not parse_channel:
                return bot.send_message(message.chat.id,'<b>Проверьте правильность ввода!</b>',parse_mode='html')

            bot.send_message(message.chat.id,f'Введенные данные: <pre>{parse_channel},{my_channel}</pre> \n <b>Парсим</b>',parse_mode='html')


        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        if state:
            handler_channel(my_channel,parse_channel)


bot.polling(none_stop=True)

这是发生的错误:

p1.py:36: RuntimeWarning: coroutine 'AuthMethods._start' was never awaited
  client.start()
p1.py:37: RuntimeWarning: coroutine 'UpdateMethods._run_until_disconnected' was never awaited
  client.run_until_disconnected()

【问题讨论】:

    标签: python telegram telethon


    【解决方案1】:

    类似于使用 client.connect()(或变体,如 start 或使用 with 块)启动 Telethon,您可以使用 client.disconnect() 停止它。

    但您的问题似乎有所不同。

    您似乎在使用telebot,这是一个线程库。一起使用 threading 和 asyncio 需要特别注意并更深入地了解这两个库的工作方式。虽然 How to combine python asyncio with threads? 可能会有所帮助,但我建议将 telebot 替换为异步机器人库(例如 Telethon 本身,然后您只需要担心一个库)。

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 2014-10-17
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多