проблема в работе telebot и telethon
есть скрипт, который по ссылке на чат в тг записывает в бд данные участников, а также в другом файле есть тг бот написанный на telebot, и нужно вставить этот скрипт в бота, но т.к. telethon ассинхронная вылазят ошибки, я понимаю, что совмещать ассинхронный и многопоточный код неправильно, поэтому пытался импортировать фунцию из скрипта в бота, не получилось, решил всё таки просто вставить скрипт в хендлер в боте, но вылазит такая ошибка RuntimeError: There is no current event loop in thread 'WorkerThread2'. не знаю что ещё можно сделать, вот сам скрипт
import configparser
import sqlite3
from telethon.sync import TelegramClient
# классы для работы с каналами
from telethon.tl.functions.channels import GetParticipantsRequest
from telethon.tl.types import ChannelParticipantsSearch
# Считываем учетные данные
config = configparser.ConfigParser()
config.read("config.ini")
# Присваиваем значения внутренним переменным
api_id = config['Telegram']['api_id']
api_hash = config['Telegram']['api_hash']
username = config['Telegram']['username']
client = TelegramClient(username, api_id, api_hash)
client.start()
url = input("Введите ссылку на канал или чат: ")
channel = client.get_entity(url)
comn = sqlite3.connect('users.sql')
cur = comn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS "%s"(id int, first_name varchar(50), username varchar(50))' % (channel.title))
comn.commit()
cur.close()
comn.close()
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({"id": participant.id,
"first_name": participant.first_name,
"user": participant.username})
conn = sqlite3.connect('users.sql')
cur = conn.cursor()
cur.execute('SELECT id FROM "%s"' % (channel.title))
cor_users_id = cur.fetchall()
users_id = []
for i in cor_users_id:
for j in i:
users_id.append(j)
for i in all_users_details:
try:
if i.get('id') in users_id:
continue
else:
cur.execute('INSERT INTO "%s"(id, first_name, username) VALUES ("%s","%s", "%s")' % (channel.title, i.get('id'), i.get('first_name'), i.get('user')))
except:
continue
conn.commit()
cur.close()
conn.close()
async def main():
global channel
await dump_all_participants(channel)
with client:
client.loop.run_until_complete(main())
а вот этот скрипт в хендлере
@bot.message_handler(commands=['search'])
def get_url_channel(message):
bot.send_message(message.chat.id, "Введите ссылку на канал или чат: ")
bot.register_next_step_handler(message, url_channel)
def url_channel(message):
url = message.text
channel = client.get_entity(url)
comn = sqlite3.connect('users.sql')
cur = comn.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS "%s"(id int, first_name varchar(50), username varchar(50))' % (channel.title))
comn.commit()
cur.close()
comn.close()
bot.register_next_step_handler(message, main)
async def dump_all_participants(channel):
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({"id": participant.id,
"first_name": participant.first_name,
"user": participant.username})
conn = sqlite3.connect('users.sql')
cur = conn.cursor()
cur.execute('SELECT id FROM "%s"' % (channel.title))
cor_users_id = cur.fetchall()
users_id = []
for i in cor_users_id:
for j in i:
users_id.append(j)
for i in all_users_details:
try:
if i.get('id') in users_id:
continue
else:
cur.execute('INSERT INTO "%s"(id, first_name, username) VALUES ("%s","%s", "%s")' % (
channel.title, i.get('id'), i.get('first_name'), i.get('user')))
except:
continue
conn.commit()
cur.close()
conn.close()
async def main():
global channel
await dump_all_participants(channel)
очень прошу помощи