91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

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

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

介紹

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

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

Telegram API 簡單介紹

我們將使用官方的python-telegram-botApi,這個庫大大簡化了開發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()

這個小代碼片段創建了一個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,你可以查看這個創建Bot的官方指南點這里。

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

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

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

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

然后我們調用start_polling命令。

updater.start_polling()

這個命令會讓我們的bot周期性的處理更新,這個參數會在內部創建兩個進程,一個用來從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 是一個用來從成千上萬個新聞源中取回和監控新聞的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,唯一的區別是我們傳遞給Datanews API的參數:search_command檢索與特定查詢匹配的文章,而Publisher_command提取所有由特定來源發布的文章,這兩個方法中我們都只活去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. 我們發送給用戶的內容必須確保排序后的內容最后一條是最新的內容。

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

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()

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

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

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

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

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

向AI問一下細節

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

AI

鹿泉市| 九台市| 定州市| 桂平市| 勃利县| 交城县| 阿城市| 图木舒克市| 育儿| 海兴县| 南郑县| 盐源县| 清丰县| 英吉沙县| 余江县| 澎湖县| 泗阳县| 宜兰市| 维西| 沛县| 永宁县| 武清区| 兴安盟| 化德县| 青浦区| 北票市| 枝江市| 茌平县| 临朐县| 开江县| 齐河县| 祁门县| 台中市| 安阳县| 冷水江市| 大洼县| 合江县| 太仓市| 潼南县| 磴口县| 江山市|