在 Telegram 机器人上运行调度程序后未保存数据

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

我的 Telegram 机器人充当我最喜欢的球队比赛的日历。它应该从发布比赛日历的网站上抓取,将此日历放入本地 SQLite 数据库中,并通过 Telegram 上的命令访问它(

/prossime
/prossime10
/calendario
)。我还希望如果它在今天的日期找到匹配项,则可以在 Telegram 频道上发送消息。我设法得到提醒以作为命令工作,但我不知道如何使其自动执行。

  1. 我无法使用

    send_match_reminder()
    私下、在频道上或在群组中发送消息。

  2. 即使在群组中,我也可以获得三个基本命令来响应我,但是我也希望能够在频道上实现这种可能性(如果可能的话)。

  3. 如果无法在频道上调用命令,我至少希望每天早上运行提醒功能,如果它找到匹配项,它会向频道发送包含匹配信息的帖子。

import asyncio
import requests
import telegram
import os
import string
import locale
import random
import logging
import schedule
import time
import sqlite3
from lxml import html
from datetime import datetime
from dotenv import load_dotenv
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackContext, CallbackQueryHandler

load_dotenv()

CONNESSIONE_DB = sqlite3.connect('JUVENTUS_MATCHES.db')
CONNESSIONE = CONNESSIONE_DB.cursor()

locale.setlocale(locale.LC_TIME, 'it_IT.UTF-8')

async def start_bot(update: Update, context: CallbackContext):
    await update.message.reply_text("HI!")

              .
              .
              .
              .
              .

async def get_next_match():
    global CONNESSIONE_DB, CONNESSIONE
    CONNESSIONE.execute("SELECT * FROM MATCHES ORDER BY DATA")
    MATCHES = CONNESSIONE.fetchall()
    TODAY = datetime.today().strftime("%Y-%m-%d")

    for MATCH in MATCHES:
        if MATCH[2] >= TODAY:
            return MATCH

    return None

async def get_next_10_matches():
    global CONNESSIONE_DB, CONNESSIONE
    CONNESSIONE.execute("SELECT * FROM MATCHES ORDER BY DATA")
    MATCHES = CONNESSIONE.fetchall()
    TODAY = datetime.today().strftime("%Y-%m-%d")

    NEXT_10_MATCHES = []
    for MATCH in MATCHES:
        if MATCH[2] >= TODAY:
            NEXT_10_MATCHES.append(MATCH)
            if len(NEXT_10_MATCHES) == 10:
                break

    return NEXT_10_MATCHES

async def get_all_match():
    global CONNESSIONE_DB, CONNESSIONE
    CONNESSIONE.execute("SELECT * FROM MATCHES ORDER BY DATA")
    MATCHES = CONNESSIONE.fetchall()
    TODAY = datetime.today().strftime("%Y-%m-%d")

    ALL_MATCHES = []
    for MATCH in MATCHES:
        ALL_MATCHES.append(MATCH)

    return ALL_MATCHES

async def get_today_match():
    global CONNESSIONE_DB, CONNESSIONE
    TODAY = datetime.today().strftime("%Y-%m-%d")
    CONNESSIONE.execute("SELECT * FROM MATCHES WHERE DATA =?", (TODAY,))
    MATCHES = CONNESSIONE.fetchall()  

    for MATCH in MATCHES:
        if MATCH[2] == TODAY:
            return MATCH

    return None 

              .
              .
              .
              .
              .

async def send_reminder(update: Update, context: CallbackContext):
    MATCH = await get_today_match()
    if MATCH:
        MESSAGE = f"⚠️ <b>OGGI GIOCHIAMO!</b> ⚠️\n\n"

        if MATCH[0] == "Serie A":
            MESSAGE += f"🏆 <b>{MATCH[0]} - {MATCH[4]}\n⚽️ {MATCH[1]}\n📅 {string.capwords(datetime.strptime(MATCH[2], '%Y-%m-%d').strftime('%A %d %B %Y'))}\n🕚 {MATCH[3]}</b>\n\n"

        else:
            MESSAGE += f"🏆 <b>{MATCH[0]}\n⚽️ {MATCH[1]}\n📅 {string.capwords(datetime.strptime(MATCH[2], '%Y-%m-%d').strftime('%A %d %B %Y'))}\n🕚 {MATCH[3]}</b>\n\n"

        await context.bot.send_message(chat_id=update.effective_chat.id, text=MESSAGE, parse_mode="HTML")

    else:
        MESSAGE = f"<b>❗️NON CI SONO PARTITE IN PROGRAMMA❗️</b>"
        await context.bot.send_message(chat_id=update.effective_chat.id, text=MESSAGE, parse_mode="HTML")

              .
              .
              .
              .
              .



def main():
    app = ApplicationBuilder() \
        .read_timeout(100) \
        .write_timeout(100) \
        .token(os.environ["BOT_TOKEN"]) \
        .build()

    app.add_handler(CommandHandler("start", start_bot))
    app.add_handler(CommandHandler("prossima", next_match_command))
    app.add_handler(CommandHandler("prossime10", next_10_matches_command))
    app.add_handler(CommandHandler("calendario", get_all_command))
    app.add_handler(CommandHandler("reminder", send_reminder))

    app.run_polling()

if __name__ == "__main__":
    main()

机器人通过命令工作,但我希望使其自动化,以便它可以向频道/群组/私人聊天发送提醒消息,并响应我想要实现的三种类型的基本命令。

python sqlite web-scraping telegram-bot python-telegram-bot
1个回答
0
投票

您可以使用 cron 作业。您可以在自己的计算机上本地创建它们(这是针对 Linux 和 MacOS 的教程),但这需要您的计算机已打开并准备好执行作业。

对于 Windows,您可以使用 Windows 任务计划程序 (Windows 教程)

这样,您可以设置脚本运行的时间并检查当天是否有匹配,如果匹配则可以向您发送提醒。

为了让你的机器人响应命令,你需要一种方法让它持续运行,等待你对它进行 ping 操作,你需要使用 AWS 之类的东西来支付费用,或者在计算机/服务器上本地运行。

或者,您可以使用 cron-job.org 等服务在线运行脚本。

© www.soinside.com 2019 - 2024. All rights reserved.