@AnanasMaks

Телеграмм Бот неверно сохраняет курс криптовалюты. Почему так происходит?

Я пишу телеграмм бота и у меня вроде бы все работает, но увы не так как нужно. Вкратце скажу, что это за бот. Я сделал телеграмм бота, который с помощью парсера заходит на сайт, считывает какой курс биткоина в долларах и присылает человеку, через определенное время и сравнивает изменился ли курс биткоина. Если да, то он присылает новое значение курса человеку. Но я видимо не правильно сделал сохранение курс биткоина для того, чтобы бот сравнивал и отправлял, так как он отправляет чередующиеся значения (скрин прикрепил ниже).
import telebot
import requests
import time

from bs4 import BeautifulSoup

token = ""
channel_id = ""
bot = telebot.TeleBot(token)

@bot.message_handler(content_types=['text'])
def commands(message):
    #bot.send_message(channel_id, message.text)
    if message.text == "Курс":
        #bot.send_message(channel_id, "Hello")
        back_post_id = None
        while True:
            post_text = parser(back_post_id)
            back_post_id = post_text[1]

            if post_text[0] != None:
                bot.send_message(channel_id, post_text[0])
                time.sleep(1)
    else:
        bot.send_message(message.from_user.id, "Я тебя не понимаю. Напиши Курс")

def parser(back_post_id):
    URL = "https://currency.com/ru/btc-to-usd?utm_course=rbc&utm_campaign=quote"

    page = requests.get(URL)
    soup = BeautifulSoup(page.content, "lxml")

    post = soup.find("b", class_='i-price-buy').text
    post_id = post
    
    if post_id != back_post_id:
        post = soup.find("b", class_='i-price-buy').text
        
        return f"{post}", post_id
    else:
        return None, post_id

bot.polling(none_stop=True, interval=0)

61819e80e15e8359409203.png
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Смысла сравнивать раз в секунду нет - рынок живой и курс меняется очень часто, это вам не доллар/евро на цбр.ру.

По сабжу - на сайте лежит какое нибудь кэшированное значение, которое и получает парсер. (можно легко проверить просто глянув исходник https://currency.com/ru/btc-to-usd?utm_course=rbc&...)
На сайте курс обновляется через вебсокет, так что его и нужно парсить. Подписываемся на нужную криптовалюту и радуемся

import websocket
import _thread
import json

def on_message(ws, message):
    data = json.loads(json.loads(message)['data'])
    print(data['bid'], data['ask'])

def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    def run(*args):
        ws.send(json.dumps({"event":"pusher:subscribe","data":{"channel":"45076691096786116"}}))
    _thread.start_new_thread(run, ())

if __name__ == "__main__":
    websocket.enableTrace(False)
    ws = websocket.WebSocketApp("wss://prod-pusher.backend-capital.com/app/MvtsstCbm?protocol=7&client=js&version=4.2.2&flash=false",
                              on_open=on_open,
                              on_message=on_message,
                              on_error=on_error,
                              on_close=on_close)

    ws.run_forever()
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы