Telegram 聊天機器人中獲取照片

華科雲商小雪發表於2024-01-23

建立圖片爬蟲時,只從那些允許爬取的網站或平臺獲取圖片。控制爬蟲的請求頻率,避免給目標網站伺服器造成過大壓力。使用延時和重試機制,以應對伺服器響應限制或故障。合理安排資料儲存,確保圖片檔案的組織和索引方式便於管理和檢索。設計爬蟲時考慮到網站結構的變化,使其能夠適應這些變化。所以說想要做好爬蟲並不是太簡單,但是隻要了解了其規則,爬蟲也是很方便。

問題背景

為了開發一個可以從使用者中檢索照片並對媒體檔案執行多種操作的簡單機器人,開發者使用 pyTelegramBotAPI 進行設計。 在檢視 Wiki 時發現,可以使用特殊處理程式按內容型別劃分接收到的訊息。

根據 Wiki,開發者用 @bot.message_handler(content_types= ["photo"]) 方法來驗證使用者。 然而,在執行該方法時,開發者遇到了一個錯誤:“No JSON object could be decoded”。 開發者不確定是自己的程式碼錯誤還是 API 問題,因此尋求幫助。

解決方案

答案 1:下載照片

第一位回覆者提供了一個下載照片的程式碼示例。 該方法使用 bot.download_file() 函式,該函式需要檔案的 file_id 來下載檔案。 此方法會將照片下載到指令碼所在的目錄,並將其命名為 “image.jpg”。

答案 2:獲取照片 URL

第二位回覆者提供了一個更全面的解決方案。 該方法使用 processPhotoMessage() 函式來處理照片訊息。這個函式首先獲取照片的 file_id ,然後使用 bot.get_file() 函式來獲取檔案資訊。 此方法會將檔案資訊儲存在 file 變數中,以便以後使用。

然後,該方法使用另一個函式 photo() 來處理照片訊息。這個函式呼叫 processPhotoMessage() 函式來獲取檔案資訊,然後使用 file.file_path 來獲取檔案的相對路徑。 相對路徑可以透過在 Telegram API 中使用 模板來獲得完整照片 URL。

程式碼示例

以下是在 Python 中用 pyTelegramBotAPI 獲取照片的完整程式碼示例:


import 
telebot

import flask
import decorator
from subprocess import Popen, PIPE

# Telegram bot token
TELEBOT_TOKEN = '<token>'

# Flask app
app = flask. Flask( __name__)

# Telebot
bot = telebot. TeleBot( TELEBOT_TOKEN)

# Decorator for error logging
@decorator. decorator
def errLog( func, * args, ** kwargs):
    result = None
    try:
        result = func( * args, ** kwargs)
    except Exception as e:
        print( e. __repr__())
    return result


# Handle text messages
@bot. message_handler( content_types =[ 'text'])
def echo( message):
    bot. send_message( message. chat. id, message. text)


# Handle photo messages
@errLog
def processPhotoMessage( message):
    print( 'message.photo =', message. photo)
    fileID = message. photo[ - 1]. file_id
    print( 'fileID =', fileID)
    file = bot. get_file( fileID)
    print( 'file.file_path =', file. file_path)


@bot. message_handler( content_types =[ 'photo'])
def photo( message):
    processPhotoMessage( message)


# Main function
def main():
    global data
    bot. remove_webhook()
    bot. set_webhook( url = WEBHOOK_URL_BASE + WEBHOOK_URL_PATH,
                    certificate = open( WEBHOOK_SSL_CERT, 'r'))
   
    # Run Flask app
    app. run( host = WEBHOOK_LISTEN,
            port = 8443,
            ssl_context =( WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV),
            debug = False)


if __name__ == '__main__':
    main()

這個更全面的解決方案可以幫助開發者從使用者的 Telegram 聊天機器人中正確獲取照片。

如果要獲取照片的完整 URL,可以使用 Telegram API 中提供的模板。

因為現在得圖片版權很多,因此不要爬取受版權保護的圖片,除非有明確的授權。遵守相關的版權法和智慧財產權規定。上面就是今天得全部內容,如果有不懂得,可以評論區留言討論。



來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3004744/,如需轉載,請註明出處,否則將追究法律責任。

相關文章