溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python做一個Telegram的新聞Bot

發(fā)布時間:2021-11-25 11:22:43 來源:億速云 閱讀:387 作者:iii 欄目:大數據

本篇內容介紹了“怎么用Python做一個Telegram的新聞Bot”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

介紹

Telegram 現在是一個全球流行的實時消息應用,它的特點是安全性和高效性,除了可以互相發(fā)送消息以外,還可以在它上面創(chuàng)建bot用來自動執(zhí)行一些任務。

在這個教程中,我們將用Python和Telegram's bot API 創(chuàng)建一個基于Datanews的新聞bot。

Telegram API 簡單介紹

我們將使用官方的python-telegram-botApi,這個庫大大簡化了開發(fā)Bot的工作,而且通過一些官方給出的例子,很容易學習和掌握它,下面是一個例子:

from telegram.ext import Updater, CommandHandler


USAGE = '/greet <name> - Greet me!'


def start(update, context):
  update.message.reply_text(USAGE)


def greet_command(update, context):
  update.message.reply_text(f'Hello {context.args[0]}!')


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

  # on different commands - answer in Telegram 
  dp.add_handler(CommandHandler("start", start)) 
  dp.add_handler(CommandHandler("greet", greet_command)) 

  # Start the Bot 
  updater.start_polling() 
  updater.idle() 


if __name__ == '__main__': 
  main()

這個小代碼片段創(chuàng)建了一個bot用來識別兩個命令:

  1. /start - Bot會根據這個命令響應出幫助頁面

  2. /greet- 這個命令會接受一個參數,例如Datanews,然后返回Hello Datanews!

來看看每一行代碼的含義:

main方法

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

  dp.add_handler(CommandHandler("start", start))
  dp.add_handler(CommandHandler("greet", greet_command))

  updater.start_polling()
  updater.idle()

這個方法配置了一些Bot工作必要的參數,特別是Update類的實例,需要注意的是,你需要一個Telegram的token才能使用Telegram Bot 的API,你可以查看這個創(chuàng)建Bot的官方指南點這里。

回到代碼,Updater的目的是為了將更新傳遞給Dispatcher,當后者收到一個更新,它將處理用戶指定的一些回調請求,每一個回調都由一個程序管理。

當收到的消息滿足某些條件時,雖然這些條件取決于程序,也可以由開發(fā)者自己定義,就我們而言我們有兩個任務處理實例。

dp.add_handler(CommandHandler("start", start))
dp.add_handler(CommandHandler("greet", greet_command))

上面的每一條處理一個命令,用來支持我們Bot的/start/greet

然后我們調用start_polling命令。

updater.start_polling()

這個命令會讓我們的bot周期性的處理更新,這個參數會在內部創(chuàng)建兩個進程,一個用來從Telegram服務器輪詢更新,另一個將由調度程序處理這些更新。

下面這一行確保我們的bot可以正確的處理各種中斷信號

updater.idle

現在我們討論兩個處理bot命令的回調函數:

def start(update, context):
  update.message.reply_text(USAGE)


def greet_command(update, context):
  update.message.reply_text(f'Hello {context.args[0]}!')

上面每一個方法都需要兩個參數:

  1. update 從Telegram服務器收到一個更新

  2. context包含一些有用的參數和信息,舉個例子,它有一個用來儲存用戶相關信息的user_data字典

除此以外,每一個參數都會給用戶返回一條消息。

Datanews API 介紹

Datanews 是一個用來從成千上萬個新聞源中取回和監(jiān)控新聞的API,新聞聚合器和其他網站,每天收集并處理了數十萬的新聞數據,當然,它也提供了靈活和簡單可用的API用來檢索這些新聞文章。

對于我們這個小項目,我們只需要API中的一小部分,特別是我們想讓bot能做什么:

  1. 根據用戶輸入的關鍵字返回新聞內容

  2. 根據特定的新聞源返回新聞內容

這些用例需求可以用一個入口處理- /headlines, 你可以在后面鏈接中了解到更多相關的APIofficial documentation.

程序實施

首先,我們要定義一個處理/start命令的回調函數

def get_usage():
  return '''This bot allows you to query news articles from Datanews API.

Available commands:
/help, /start - show this help message.
/search <query> - retrieve news articles containing <query>.
  Example: "/search covid"
/publisher <domain> - retrieve newest articles by publisher.
  Example: "/publisher techcrunch.com"'''

def help_command(update, context):
  update.message.reply_markdown(get_usage())

就像你看到的,這個實現方式與我們上面演示的很相似,我們簡單的返回了一個help信息給用戶,你可以注意到我們的bot支持四個命令,下面我們討論其他兩個:

def search_command(update, context):
  def fetcher(query):
    return datanews.headlines(query, size=10, sortBy='date', page=0, language='en')
  _fetch_data(update, context, fetcher)


def publisher_command(update, context):
  def fetcher(query):
    return datanews.headlines(source=query, size=10, sortBy='date', page=0, language='en')
  _fetch_data(update, context, fetcher)

這些方法看起來都非常簡單,它們都用了我們前面討論過的/headlinesAPI,唯一的區(qū)別是我們傳遞給Datanews API的參數:search_command檢索與特定查詢匹配的文章,而Publisher_command提取所有由特定來源發(fā)布的文章,這兩個方法中我們都只活去10條最近的文章。

def _fetch_data(update, context, fetcher):
  if not context.args:
    help_command(update, context)
    return

  query = '"' + ' '.join(context.args) + '"'
  result = fetcher(query)

  if not result['hits']:
    update.message.reply_text('No news is good news')
    return

  last_message = update.message
  for article in reversed(result['hits']):
    text = article['title'] + ': ' + article['url']
    last_message = last_message.reply_text(text)

這個方法簡單的檢查了用戶輸入的特定的參數,從Datanews API中取出數據并排序返回給用戶,

  1. 我們確保用“包圍查詢”,以便Datanews返回所有包含完整查詢的文章,而不僅僅是其中的一個單詞。

  2. 我們還要確保處理無法查詢到文章的情況,如果這種情況下bot無反應是扯淡的。

  3. 我們發(fā)送給用戶的內容必須確保排序后的內容最后一條是最新的內容。

有了這些功能,我們看一下主程序:

def main():
  updater = Updater(token='TOKEN')

  updater.dispatcher.add_handler(CommandHandler('start', help_command))
  updater.dispatcher.add_handler(CommandHandler('help', help_command))
  updater.dispatcher.add_handler(CommandHandler('search', search_command))
  updater.dispatcher.add_handler(CommandHandler('publisher', publisher_command))

  updater.dispatcher.add_handler(
    MessageHandler(
      Filters.text & Filters.regex(pattern=re.compile('help', re.IGNORECASE)),
      help_command
    )
  )

  updater.start_polling()
  updater.idle()

這個程序看起來和前面的例子非常相似,只有一個主要區(qū)別是下面:

updater.dispatcher.add_handler(
  MessageHandler(
    Filters.text & Filters.regex(pattern=re.compile('help', re.IGNORECASE)),
    help_command
  )
)

MessageHandler用來獲得用戶的輸入,你可以認為它是CommandHandler的類似功能,它可以處理任何滿足指定過濾器的消息,在我們的六種,我們想在用戶輸入信息中包含help的時候將幫助信息返回給用戶。

因此,我們有了一個完全程序化的新聞機器人。

“怎么用Python做一個Telegram的新聞Bot”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI