您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用Python做一個Telegram的新聞Bot”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Telegram 現在是一個全球流行的實時消息應用,它的特點是安全性和高效性,除了可以互相發送消息以外,還可以在它上面創建bot用來自動執行一些任務。
在這個教程中,我們將用Python和Telegram's bot API 創建一個基于Datanews的新聞bot。
我們將使用官方的python-telegram-bot
Api,這個庫大大簡化了開發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用來識別兩個命令:
/start
- Bot會根據這個命令響應出幫助頁面
/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]}!')
上面每一個方法都需要兩個參數:
update
從Telegram服務器收到一個更新
context
包含一些有用的參數和信息,舉個例子,它有一個用來儲存用戶相關信息的user_data
字典
除此以外,每一個參數都會給用戶返回一條消息。
Datanews 是一個用來從成千上萬個新聞源中取回和監控新聞的API,新聞聚合器和其他網站,每天收集并處理了數十萬的新聞數據,當然,它也提供了靈活和簡單可用的API用來檢索這些新聞文章。
對于我們這個小項目,我們只需要API中的一小部分,特別是我們想讓bot能做什么:
根據用戶輸入的關鍵字返回新聞內容
根據特定的新聞源返回新聞內容
這些用例需求可以用一個入口處理- /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)
這些方法看起來都非常簡單,它們都用了我們前面討論過的/headlines
API,唯一的區別是我們傳遞給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中取出數據并排序返回給用戶,
我們確保用“包圍查詢”,以便Datanews返回所有包含完整查詢的文章,而不僅僅是其中的一個單詞。
我們還要確保處理無法查詢到文章的情況,如果這種情況下bot無反應是扯淡的。
我們發送給用戶的內容必須確保排序后的內容最后一條是最新的內容。
有了這些功能,我們看一下主程序:
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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。