@Maruf1777

Как постоянно обновлять данные запрашиваемы с google spreadsheet для телеграм бота?

Здраствуйте у меня проблема со стримингом данных с гугл спредшита на телеграм бот
import pandas as pd
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import telebot
import threading
import multiprocessing

PORT = int(os.environ.get('PORT', '8443'))
TOKEN = "TOKEN"

bot = telebot.TeleBot("TOKEN")

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('delivery-302112-f683f6060657.json', scope)
client = gspread.authorize(creds)

# GET Spread SHEET Values
sh = client.open('FLEET')

coordinates = []
arrive = []
unit = []
def infi():
    # threading.Timer(20, infi).start()
    # time.sleep(15)
    sheet2 = sh.worksheet("LOCATION")
    coordinates_1 = sheet2.col_values(5)
    arrive_1 = sheet2.col_values(6)
    unit_1 = sheet2.col_values(1)
    coordinates.append(coordinates_1)
    for i, n, z in zip(coordinates_1, arrive_1, unit_1):
        coordinates.append(i)
        arrive.append(n)
        unit.append(z)
infi()
# CREATING DICTIONARY
data_dict = {"COORDINATES": pd.Series(coordinates),
             'UNIT': pd.Series(unit),
             "ARRIVE" : pd.Series(arrive)
             }

# print(data_dict)
df = pd.DataFrame(data_dict, columns=["UNIT", "COORDINATES", "ARRIVE"])
# print(df['ARRIVE'])
# print(f'DF INFO: {df.info()}, \nUNIT COLUMNS{df["column_new"]}')
unit1 = df['UNIT']
coordinates1 = df["COORDINATES"]
num1 = unit1[:16]
num2 = unit1[16:]
# # print(unit)
#
def value(type):
    unique_index = pd.Index(unit1)
    m = unique_index.get_loc(type)
    number = unit1[m]
    info1 = coordinates1[m]
    final = info1
    return final
# #
markup = telebot.types.ReplyKeyboardMarkup(row_width=3)
for i,n in zip(num1,num2):
    txt = str(i)
    mxt = str(n)
    markup.row(txt,mxt)

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Hello U Wrote Me /start', reply_markup=markup)

@bot.message_handler(content_types=['text'])
def send_text(message):

    response = message.text.lower()
    text = value(response)

    if message.text.lower() == str(response):
        bot.send_message(message.chat.id, str(text))
    elif message.text.lower() != '':
        bot.send_message(message.chat.id, 'NaN')

if __name__ == "__main__":
    bot.polling(none_stop=True)

Суть бота, на выбор даються идинтефикационные номера сотрудников, при выборе ИД бот должен давать данные их координаты и их статус( со спредшита гугла которые постоянно обновляються) Проблема в том что программа берет один раз статичные данные как дф и не обновляет, я попыталя использовать мультитрединг но все всего стало намного запутанее
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Например, сделать загрузку данных отдельной функцией и запоминать время последнего скачивания. Если в момент вызова send_text текущее время превышает время последнего скачивания больше чем на определённую величину (5 минут, 1 час - насколько часто надо обновлять данные?), то вызвать функцию скачивания ещё раз и обновить переменную с временем последнего скачивания.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы