Forums

I am unable to run the file on PythonAnywhere, but it runs without errors on my local PC.

This Python file manages a Telegram bot and allows the bot to respond to questions as a chatbot using the OpenAI library. If I run this file with my Python 3.9, it runs correctly, however, if I run it on PythonAnywhere, it gives me this error: Traceback (most recent call last): File "/home/Giovico/chatbot/cahtbot_telegram_censurato.py", line 239, in <module> main() File "/home/Giovico/chatbot/cahtbot_telegram_censurato.py", line 168, in main if len(updates) > 0: TypeError: object of type 'coroutine' has no len().

The code I have written is this, how do I solve it?

import openai import os import sqlite3 import telegram from PIL import Image, ImageDraw, ImageFont import datetime

allowed_user_id = 946157255

Enter your OpenAI API key here

openai.api_key = " "

Set the model

model_engine = "text-davinci-002"

Initialize the Telegram bot

bot = telegram.Bot(token=' ')

Empty list for questions

questions_list = []

Generate the response

def generate_answer(question): prompt = f"Genera una risposta alla domanda: '{question}'\nRisposta:" response = openai.Completion.create( engine=model_engine, prompt=prompt, max_tokens=1024, n=1, stop=None, temperature=0.5, ) return response.choices[0].text.strip()

Function to handle new users

def add_user_to_database(user_id): conn = sqlite3.connect('user_database.db') cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS users (user_id INTEGER PRIMARY KEY)") cursor.execute("INSERT OR IGNORE INTO users (user_id) VALUES (?)", (user_id,)) conn.commit() conn.close()

Function to retrieve the number of unique users and their Telegram usernames or IDs.

def get_unique_users(bot): conn = sqlite3.connect('user_database.db') cursor = conn.cursor() cursor.execute("SELECT COUNT(DISTINCT user_id) FROM users") num_users = cursor.fetchone()[0] cursor.execute("SELECT user_id FROM users") user_ids = [user_id for user_id, in cursor.fetchall()] users = [] for user_id in user_ids: try: chat = bot.get_chat(user_id) if chat.username: users.append(chat.username) else: users.append(str(user_id)) except telegram.error.BadRequest: print(f"User {user_id} not found") conn.close() return num_users, users

Main loop to handle questions sent to the bot.

def main(): global questions_list # dichiarazione globale last_update_id = None while True: updates = bot.get_updates(offset=last_update_id, timeout=30) if len(updates) > 0: last_update_id = updates[-1].update_id + 1 for update in updates: if update.message: # Controlla se il messaggio è il comando /stats if update.message.text == '/stats' and update.message.chat_id == allowed_user_id: num_users, users = get_unique_users(bot) user_list = '\n'.join(users) bot.send_message(chat_id=update.message.chat_id, text=f"Il numero di utenti unici è: {num_users}\nUsername degli utenti:\n{user_list}") elif update.message.text == '/domande' and update.message.chat_id == allowed_user_id: questions = '\n'.join([f"{question['username']}: {question['text']}" for question in questions_list]) bot.send_message(chat_id=update.message.chat_id, text=f"Domande fatte al bot:\n{questions}") else: # Altrimenti, genera una risposta alla domanda question = update.message.text answer = generate_answer(question) bot.send_message(chat_id=update.message.chat_id, text=answer) add_user_to_database(update.message.chat_id) # Aggiungi la domanda alla lista con l'username o l'id telegram di chi l'ha fatta questions_list.append({'text': question, 'username': update.message.chat.username or str(update.message.chat_id)})

if name == 'main': main()

It could be problem of package version. Make sure that you have the same set of dependencies on both sides.