O
O
osgeller2019-09-10 23:47:42
Python
osgeller, 2019-09-10 23:47:42

How to bind a variable to a chat?

I am writing a python bot for telegram using the pytelegrambotapi library. There are several variables that are used in many routines, so they have to be made global, but for each chat these variables must be different. How to create a global variable that will be attached to the chat?

The code
from bs4 import BeautifulSoup
import requests
import telebot


bot = telebot.TeleBot('qwerty123')


tracks_title = []
tracks_url = []
page_number = 0
tracks_on_page = 3


keyboard = telebot.types.ReplyKeyboardMarkup()
keyboard.row('Топ за месяц', 'Топ за неделю', 'Топ за день')
keyboard.row('Как пользоваться?', 'Канал Автора')


@bot.message_handler(commands = ['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Привет, я бот для поиска музыки. Для того чтобы '
    'найти музыку, просто напиши мне название трека, либо имя исполнителя, а я постараю'
    'сь найти нужную тебе песню.', reply_markup = keyboard)


@bot.message_handler(content_types = ['text'])
def send_text(message):
    if message.text == 'Как пользоваться?':
        bot.send_message(message.chat.id, 'Для того чтобы найти музыку, просто напи'
        'ши мне либо название трека, либо имя исполнителя, а я постараюсь найти нуж'
        'ную тебе песню.')
    elif message.text == 'Канал Автора':
        chanal = telebot.types.InlineKeyboardMarkup()
        chanal_button = telebot.types.InlineKeyboardButton(text='qwerty123', \
        url='https://t.me/qwerty123')
        chanal.row(chanal_button)
        bot.send_message(message.chat.id, 'Подписывайся', reply_markup = chanal)
    else:
        search(message)


@bot.callback_query_handler(func=lambda c:True)
def inlin(c):
    bot.delete_message(chat_id=c.message.chat.id, message_id=c.message.message_id)
    if   c.data == 'next_page': search_results_page('next_page', c.message)
    elif c.data == 'back_page': search_results_page('back_page', c.message)
    else:
        download_track(c)
        search_results_page('', c.message)


def search(message):
    global tracks_title
    webpage = site_search(message.text)
    parsing(webpage)
    if len(tracks_title) == 0:
        bot.send_message(message.chat.id, 'По данному запросу ничего не найдено')
    else: search_results_page('new_page', message)


def site_search(search_query):
    if search_query == 'Топ за месяц': webpage = requests.get('https://z1.fm/?sort=month')
    elif search_query == 'Топ за неделю': webpage = requests.get('https://z1.fm/?sort=week')
    elif search_query == 'Топ за день': webpage = requests.get('https://z1.fm/?sort=views')
    else:
        data = requests.Session()
        webpage = data.post('https://z1.fm/')
        param = {'keywords': search_query}
        webpage = requests.get('https://z1.fm/mp3/search', params=param, cookies=data.cookies)
    return webpage.text


def parsing(webpage):
    global tracks_url
    global tracks_title
    tracks_url.clear()
    tracks_title.clear()
    soup = BeautifulSoup(webpage, 'html.parser')
    tracks = soup.find_all('span', class_='song-plus btn4 plus')
    for span in tracks:
        track_title = span.get('data-title')
        track_id = span.get('data-sid')
        track_url = 'https://z1.fm/download/' + track_id
        tracks_title.append(track_title)
        tracks_url.append(track_url)
        if len(tracks_title) == 30: break


def search_results_page(request, message):
    global tracks_title
    global tracks_url
    global page_number
    global tracks_on_page
    total_pages = int((len(tracks_title) + tracks_on_page - 1) / tracks_on_page)
    search_results = telebot.types.InlineKeyboardMarkup()
    if request == 'new_page': page_number = 1
    elif request == 'next_page': page_number += 1
    elif request == 'back_page': page_number -= 1
    i = (page_number - 1) * tracks_on_page
    b = 0
    while i < tracks_on_page * page_number:
        button = telebot.types.InlineKeyboardButton(text=tracks_title[i], callback_data=str(b))
        search_results.add(button)
        i += 1
        b += 1
        if i == len(tracks_title): break
    back_page = telebot.types.InlineKeyboardButton(text = '<<Назад', callback_data='back_page')
    next_page = telebot.types.InlineKeyboardButton(text = 'Далее>>', callback_data='next_page')
    if   page_number == 1 and total_pages >  1: search_results.row(next_page)
    elif page_number == total_pages: search_results.row(back_page)
    elif total_pages == 1: search_results.row()
    else: search_results.row(back_page, next_page)
    text = 'Страница ' + str(page_number) + ' из ' + str(total_pages) + '.\nВыберите нужную песню:'
    bot.send_message(message.chat.id, text, reply_markup = search_results)


def download_track(c):
    global tracks_url
    global page_number
    global tracks_on_page
    track_id = int(c.data) + (page_number - 1) * tracks_on_page
    bot.send_message(c.message.chat.id, tracks_url[track_id])


bot.polling()

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Andrey Barbolin, 2019-09-11
@osgeller

Use a dictionary. Where the key will be the chat id.

globalVar= {
  'chatid':{
  'track_title':'rep',
  'track_url': 'https://coolmusic.com/rep.wav',
  }
}

musicType = globalVar[chatid][track_title]
musicUrl = globalVar[chatid][track_url]

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question