第二次通过 Telegram 机器人输入数据时出错

问题描述 投票:0回答:1

创建电报机器人时出错,输入姓名/电子邮件/电话时,我要求他再次执行此操作,然后他给我以下错误消息:

<HttpError 400 when requesting https://sheets.googleapis.com/v4 /spreadsheets/1saG-
dfVZEUmu_dLoOjm85XEc0xyMIQMLUWslXTVjrQc/values/DadosTelegram%21A5%3AD5?valueInputOption=USER_ENTERED&alt=json returned "Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]". Details: "Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]">

我在通过Python运行电报机器人时尝试第二次插入数据,它插入了第一个数据,但是在第二次尝试插入数据时,它给出了错误。

import os.path
import datetime
import telebot
import requests
import io
from PIL import Image

from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery, InputMediaPhoto
from functools import partial
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

CHAVE_API = "secret"

bot = telebot.TeleBot("secret")

#mensagem de continuidade do bot
message_continius = "Você está no controle! Se quiser experimentar outras opções ou precisar de mais informações, estou à disposição:"

SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

SAMPLE_SPREADSHEET_ID = 'secret'
SAMPLE_RANGE_NAME = 'DadosTelegram!A1:D10'



def main():
    global user_data
    user_data = {}
    bot.polling()

def save_to_google_sheets(user_data):
    creds = None

    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)

    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'client_secret.json', SCOPES
            )
            creds = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('sheets', 'v4', credentials=creds)

        # Determine the next empty row in the first column
        result = service.spreadsheets().values().get(
            spreadsheetId=SAMPLE_SPREADSHEET_ID,
            range="DadosTelegram!A:A"  # Check the entire column A
        ).execute()
        values = result.get('values', [])
        next_empty_row = len(values) + 1

        range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}" # Assume you have 4 columns of data
        user_data_values = user_data + [datetime.date.today().strftime('%d/%m/%Y')]
        values_update = [
            user_data_values,
        ]

        # Update the range name based on the next empty row
        range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"

        result = service.spreadsheets().values().update(
            spreadsheetId=SAMPLE_SPREADSHEET_ID,
            range=range_name,
            valueInputOption="USER_ENTERED",
            body={'values': values_update}
        ).execute()

    except HttpError as err:
        print(err)

@bot.message_handler(func=lambda message: True)
def send_welcome(message):
    user_data[message.chat.id] = []
    response = requests.get("https://media.discordapp.net/attachments/1046247245303001109/1228049740508168284/ConsisteLogo.png?ex=662aa172&is=66182c72&hm=bc9562674b28a5a3255d6290507b60cda73976a9d478f4d194b73cb86914ed50&=&format=webp&quality=lossless")
    img = Image.open(io.BytesIO(response.content))
    img.save("temp.webp", "webp")
    with open("temp.webp", "rb") as f:
        bot.send_sticker(message.chat.id, f)
    os.remove("temp.webp")
    send_keyboard(message, "Olá, Seja bem vindo a Consiste! Escolha uma opção para continuar:")

def send_keyboard(message, message_text):
    keyboard = InlineKeyboardMarkup()
    button1 = InlineKeyboardButton("Saber Mais Sobre a Consiste", callback_data="opcao1")
    button2 = InlineKeyboardButton("Quero Entrar em Contato com a Consiste", callback_data="opcao2")
    button3 = InlineKeyboardButton("Quero que a Consiste entre em contato comigo", callback_data="opcao3")
    button4 = InlineKeyboardButton("Finalizar Atendimento", callback_data="finalizar")
    keyboard.row(button1)
    keyboard.row(button2)
    keyboard.row(button3)
    keyboard.row(button4)
    bot.send_message(message.chat.id, message_text, reply_markup=keyboard)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.data == "opcao1":
        bot.send_photo(call.message.chat.id,"https://media.licdn.com/dms/image/C4E03AQG7G7Gl7htZbQ/profile-displayphoto-shrink_200_200/0/1517610064166?e=1718236800&v=beta&t=DFmyD5O8UI4KusfYf9jxx-ZfjZ51rnFQ3tnQaqZrvdg")
        bot.send_message(call.message.chat.id, "Esté é Marcos Vinicius Fonseca, nosso Presidente")
        bot.send_message(call.message.chat.id,"""CONSISTE: Servindo ao Sucesso
    
    Na CONSISTE, nossa missão é clara: impulsionar o sucesso dos nossos clientes. Combinamos paixão por tecnologia e comprometimento com resultados para oferecer soluções inovadoras.
    
    Nossa equipe, composta por profissionais íntegros e criativos, trabalha em um ambiente de confiança e colaboração, onde o cliente é prioridade absoluta.
    
    O XTR, nossa solução, é flexível e adaptável a diversas áreas. Desde a coleta de dados até o relacionamento com clientes, promove uma gestão eficiente e focada em resultados tangíveis.
    
    Venha conhecer a CONSISTE e descubra como podemos ajudar a impulsionar o seu sucesso empresarial, na CONSISTE, servir é nossa paixão e seu sucesso, nossa prioridade. para saber mais acesse: https://www.consiste.com.br/portal.nsf/index.xsp""")
        send_keyboard(call.message, message_continius)
    elif call.data == "opcao2":
        bot.send_message(call.message.chat.id, """
                            Você pode entrar em contato com a Consiste das seguintes formas: 
            Fone: (71) 2102-6969
            E-mail: [email protected]
Para saber mais você também pode entrar em nosso Site: https://www.consiste.com.br/portal.nsf/index.xsp""")
        send_keyboard(call.message, message_continius)
#Pedindo Nome
    elif call.data == "opcao3":
        bot.send_message(call.message.chat.id, "Você Escolheu: Quero que a Consiste entre em contato comigo")
        bot.send_message(call.message.chat.id, "Por favor, digite seu Nome:")
        bot.register_next_step_handler(call.message, partial(get_email, user_id=call.message.chat.id))
#Finalizando Conversa
    elif call.data == "finalizar":
        bot.send_message(call.message.chat.id, "Atendimento finalizado, a Consiste agradeçe!")
        bot.clear_step_handler(call.message)
        
def get_email(message, user_id):
    user_data[user_id].append(message.text)
    bot.send_message(message.chat.id, "Por favor, nos informe seu E-mail:")
    bot.register_next_step_handler(message, partial(get_telefone, user_id=user_id))

def get_telefone(message, user_id):
    user_data[user_id].append(message.text)
    bot.send_message(message.chat.id, "Por favor, nos informe seu Telefone:")
    bot.register_next_step_handler(message, partial(get_phone, user_id=user_id))

def get_phone(message, user_id):
    phone = message.text
    if len(phone) < 12 and not phone.startswith('+'):
        phone = "+55" + phone
    user_data[user_id].append(phone)
    bot.send_message(message.chat.id, "Obrigado pela colaboração, entraremos em contato em breve!")
    send_keyboard(message, message_continius)
    save_to_google_sheets(user_data[user_id])

if __name__ == "__main__":
    main()
python google-sheets-api telegram-bot python-telegram-bot py-telegram-bot-api
1个回答
0
投票

从您显示的

Requested writing within range [DadosTelegram!A5:D5], but tried writing to column [E]
错误消息来看,我猜测在这种情况下,
values_update
的值的长度可能是5。在您的脚本中,从
range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"
开始,使用了“A”到“D”列。在这种情况下,当值的长度超过5时,就会出现这样的错误。如果你想把两个值都放进去而不报错,下面的修改怎么样?

来自:

range_name = f"DadosTelegram!A{next_empty_row}:D{next_empty_row}"

致:

range_name = f"DadosTelegram!A{next_empty_row}"
  • 通过此修改,值将被放入使用第一个单元格范围“A”的单元格中。
  • 例如,当
    values_update
    ["a", "b", "c", "d"]
    时,这些值将被放入“A”至“D”列中。并且,当
    values_update
    ["a", "b", "c", "d", "e"]
    时,这些值将放入“A”至“E”列中。
© www.soinside.com 2019 - 2024. All rights reserved.