Почему я не могу подключить своего telegram-бота к Mongodb Atlas с помощью Python?

#python #heroku #pymongo #python-telegram-bot

#python #heroku #pymongo #python-telegram-bot

Вопрос:

Это мой код

 from telegram.ext import Updater, CommandHandler
import os
from pymongo import MongoClient

TOKEN = 'TOKEN'

def get_db(update, context):
    cluster = MongoClient("mongodb srv://testing:12345678@cluster0.gs9k5.mongodb.net/test?retryWrites=trueamp;w=majority")
    result = list(cluster.get_database('DBNAME')['COLLECTIONNAME'].find({}))
    update.message.reply_text(str(result))

def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher

    dp.add_handler(CommandHandler("getdb", get_db))

    updater.start_webhook(listen="#.#.#.#",
                          port=int(PORT),
                          url_path=TOKEN)
    updater.bot.setWebhook('https://MYHEROKUAPP.herokuapp.com/'   TOKEN)

    updater.idle()


if __name__ == '__main__':
    main()
  

Каждый раз, когда я печатаю /getdb , бот не дает мне никакого ответа. Когда я попробовал несколько экспериментов, кажется, что в переменной кластера есть какая-то ошибка. Я использовал синтаксис try except, но бот ничего не показывал, даже из except, и я также не смог найти имя ошибки. И я использую сервер heroku для бота telegram. Как это исправить?

Ответ №1:

Вы можете подключиться к базе данных по умолчанию (которая определена в строке подключения) и запросить коллекции следующим образом

 client = MongoClient('connect-string')
db = client.get_default_database()
# 'collection_name' is the name of the Mongo collection
list = db.collection_name.find()
  

Комментарии:

1. Я ценю ваш ответ, но между вашим кодом и моим кодом нет различий (особенно переменная кластера и переменная клиента одинаковы)

2. Код очень похож, разница заключается в использовании get_default_database и использовании ключа dict вместо get() , что улучшает читаемость и снижает вероятность ошибок (нет необходимости жестко кодировать имя БД). Вы получаете какую-то информацию в stacktrace? Вы пробовали client .server_info ?

3. Также рекомендуется избегать строки подключения и учетных данных в ваших вопросах

4. Я попробовал ваш код, но ответа от него по-прежнему нет.

5. Ошибок нет? просто нет ответа? Вы внесли в белый список IP-адрес, с которого вы подключаетесь? Я разрешил все ( 0.0.0.0/0 )

Ответ №2:

Я не уверен, что у вас все еще есть эта проблема, но пока, похоже, с кодом все в порядке. Попробуйте записать информацию о приложении в терминал, чтобы лучше понять, в чем ошибка.

 import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                        level=logging.INFO)
logger = logging.getLogger(__name__)
  
  1. Возможно, ваш MongoDB Atlas не разрешает подключение с сервера, с которого вы запускаете свой код. Вы можете проверить свой кластер, чтобы узнать, разрешает ли он доступ к БД с вашего сервера. Вы можете добавить IP-адрес своего сервера в кластер, чтобы он мог успешно получать доступ к данным.
  2. Если коллекция, из которой вы пытаетесь отобразить все элементы, большая, Telegram выдаст ошибку, потому что последующее сообщение будет слишком длинным. Убедитесь, что вы запускаете свой тест только с несколькими элементами в вашей тестовой базе данных.
  3. Вы должны иметь возможность проверять свои журналы heroku или в своем терминале, чтобы узнать, какие другие ошибки могут возникать

Комментарии:

1. Спасибо за ответ, я решил проблему, из-за которой забыл установить dnspython