如何利用AWS監聽存儲桶并上傳到tg bot

業務描述:

?? 需要監聽aws的存儲中的最新消息,發送新的消息推送到指定tg的頻道。

主要流程:

1.上傳消息到s3存儲桶(不做具體描述)
2.通過aws的lambda監聽s3存儲桶的最新消息(txt文件)
3.將txt文件內容處理后推送到tg頻道中

具體流程:

一、準備工作
1.創建bot
2.在頻道中添加bot作為管理員
3.獲取bot的token和頻道的channel id

二、監聽s3消息并推送到指定的tg頻道中
1.創建函數
在這里插入圖片描述
2.上傳代碼到lambda中
注:建議使用zip上傳
在這里插入圖片描述代碼源中必須包含package和node_modules,需要項目的完整環境
注: 代碼如下,可以根據自己的業務調整。我的業務tg頻道的channel id是從txt中解析獲取。
注: 需要注意parse_mode的選擇
注: 在lambda中發送完消息之后是無法獲取狀態的,也就是代碼中response是沒法獲取狀態的,不管成功失敗。這也就導致了會存在消息丟失的情況

const TelegramBot = require('node-telegram-bot-api');
const AWS = require('aws-sdk');const s3 = new AWS.S3();
const TELEGRAM_BOT_TOKEN = '你的tg bot token'; // Telegram Bot Token
const TARGET_BUCKET_NAME = '你需要監聽的存儲桶的名稱'; // 監聽的目標存儲桶名稱// Initialize the Telegram bot
const bot = new TelegramBot(TELEGRAM_BOT_TOKEN);// AWS Lambda Handler
exports.handler = async (event, context) => {const functionName = context.functionName; // 獲取 Lambda 函數的名稱// tg-bot-test:測試環境   tg-bot:生產const [TEXT_NAME, MEDIA_NAME] = functionName === 'tg-bot-test' ? ['text-output-test', 'media-test'] : ['text-output', 'media'];try {const currentTime = new Date();for (const record of event.Records) {const bucket = record.s3.bucket.name; // 存儲桶名稱const key = decodeURIComponent(record.s3.object.key.replace(/\+/g, ' ')); // 對象鍵const eventName = record.eventName;// 僅處理指定存儲桶的事件(新增)if (bucket === TARGET_BUCKET_NAME && eventName.startsWith('ObjectCreated:Put')) {console.log(`New file uploaded: ${key} to bucket: ${bucket}`);// 獲取對象的元數據const metadata = await getObjectMetadata(bucket, key);const creationTime = metadata.LastModified; // 獲取創建時間const timeDiffInSeconds = (currentTime - creationTime) / 1000; // 計算時間差(秒)console.log(`File creation time: ${creationTime}, Time difference: ${timeDiffInSeconds} seconds`);// 若創建時間超過 60 秒,則不再繼續執行if (timeDiffInSeconds > 60) {console.log(`File ${key} creation time exceeds 60 seconds, stopping execution...`);return; // 結束 Lambda 函數的執行}// 檢查文件是否在指定的文件夾中if (key.startsWith(`${TEXT_NAME}/`)) {// 從 S3 獲取文本文件內容const textContent = await getFileContentFromS3(bucket, key);console.log(`Updated file: ${key}`); // 打印更新文件的名稱console.log(`textContent: ${textContent}`);// 獲取第三行內容并轉換為數字let numberValue = 0;const lines = textContent.split('\n');let captionContent = "";let channelId = "";if (lines.length >= 3) {channelId = lines[0].trim();  // 獲取發送到的頻道的idconsole.log("channelId:", channelId);const thirdLine = lines[2].trim(); // 獲取第三行并去除多余空格numberValue = parseFloat(thirdLine); // 轉換為數字console.log(`Third line as number: ${numberValue}`); // 打印數字值captionContent = lines.slice(3).join('\n').trim(); // 從第三行之后的所有內容} else {console.error('The file does not contain enough lines.');return;}// 提取文件名(去除文件夾和后綴)const fileName = key.split('/').pop().split('.').slice(0, -1).join('.');console.log(`File name without folder and extension: ${fileName}`); // 打印文件名// 生成所有圖片的名稱let allImage = [];for (let index = 0; index < numberValue; index++) {allImage.push(`${fileName}.img${index}.jpg`);}console.log(`All images: ${allImage}`);// 收集圖片的 URLconst imageUrls = allImage.map(image => `https://${bucket}.s3.us-east-1.amazonaws.com/${MEDIA_NAME}/${image}`);// 發送所有圖片作為一條消息await sendPhotosToTelegram(imageUrls, captionContent, channelId);}}}} catch (error) {console.error("error message:", error);}
};const getObjectMetadata = async (bucket, key) => {const params = {Bucket: bucket,Key: key};const metadata = await s3.headObject(params).promise();return metadata; // 返回對象的元數據
};const getFileContentFromS3 = async (bucket, key) => {const params = {Bucket: bucket,Key: key};const data = await s3.getObject(params).promise();return data.Body.toString('utf-8'); // 返回文件內容,假設是文本文件
};const sendPhotosToTelegram = async (imageUrls, captionContent, channelId) => {const media = imageUrls.map((url) => ({type: 'photo',media: url,}));// 如果有需要,可以為第一張圖片添加 captionif (captionContent) {media[0].caption = captionContent;media[0].parse_mode = 'Markdown'; 	//注意此處的選擇,Markdown是支持多圖和超鏈接文本的,但是MarkdownV2是不支持超鏈接文本的,而且也不支持特殊字符}try {console.log("request==================start");const response = await bot.sendMediaGroup(`@${channelId}`, media);console.log("request==================end");console.log('Response from Telegram:', response); // 打印 Telegram 的響應(lambda沒有效果)return response;} catch (error) {console.error('Error sending photos to Telegram:', error.response ? error.response.data : error.message);throw error;}
};

其他

1.在沒有解決消息丟失的情況下建議不要使用lambda推送重要消息
2.可以使用mq來完成消息的監聽和發送,這樣response也可以監聽到狀態,也不會存在消息丟失情況,即使丟失也可以通過狀態控制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64038.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64038.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS NEXT 實戰之元服務:靜態案例效果---查看國內航班服務

背景&#xff1a; 前幾篇學習了元服務&#xff0c;后面幾期就讓我們開發簡單的元服務吧&#xff0c;里面豐富的內容大家自己加&#xff0c;本期案例 僅供參考 先上本期效果圖 &#xff0c;里面圖片自行替換 效果圖1完整代碼案例如下&#xff1a; Index代碼 import { authen…

Windows11家庭版啟動Hyper-V

Hyper-V 是微軟的硬件虛擬化產品&#xff0c;允許在 Windows 上以虛擬機形式運行多個操作系統。每個虛擬機都在虛擬硬件上運行&#xff0c;可以創建虛擬硬盤驅動器、虛擬交換機等虛擬設備。使用虛擬化可以運行需要較舊版本的 Windows 或非 Windows 操作系統的軟件&#xff0c;以…

為什么深度學習和神經網絡要使用 GPU?

為什么深度學習和神經網絡要使用 GPU&#xff1f; 本篇文章的目標是幫助初學者了解 CUDA 是什么&#xff0c;以及它如何與 PyTorch 配合使用&#xff0c;更重要的是&#xff0c;我們為何在神經網絡編程中使用 GPU。 圖形處理單元 (GPU) 要了解 CUDA&#xff0c;我們需要對圖…

每天五分鐘機器學習:核函數

本文重點 在學習支持向量機算法之前,我們要繼續學習一些數學基礎,本文我們將學習核函數的概念。當數據線性不可分的時候,此時就需要核函數出場了,它可以將低維不可分的數據映射到高維可分數據,此時就可以完成數據分類了。 核函數的定義 核函數K(x, y)定義為兩個數據點x…

MaaS(Model as a Service)

1.MasS是什么&#xff1f; Model as a Service&#xff08;MaaS&#xff09;是一種云計算服務模式&#xff0c;它允許用戶通過互聯網訪問和使用機器學習模型&#xff0c;而不需要自行構建和維護這些模型。MaaS提供了模型的托管、管理和監控&#xff0c;使用戶能夠專注于應用程…

圖像處理-Ch7-快速小波變換和小波包

個人博客&#xff01;無廣告觀看&#xff0c;因為這節內容太多了&#xff0c;有點放不下&#xff0c;分了三節 文章目錄 快速小波變換(The Fast Wavelet Transform)與兩頻段子帶編譯碼系統的關系例&#xff1a;計算一維小波變換 一維快速小波反變換例&#xff1a;計算一維小波…

KAFKA 權威指南筆記(一)究竟應該配置多少個BROKER?

一個KAFKA集群需要多少個BROKER&#xff1f; 一個單獨的Kafka服務器被叫做BROKER&#xff0c;BROKER可以處理數千個分區以及每秒百萬級別的消息量。由BROKER組成了“集群”&#xff08;其中由集群控制器角色的BROKER是從成員中選舉出來的&#xff0c;負責控制管理工作&#xf…

【ES6復習筆記】函數參數的默認值(6)

在ES6中&#xff0c;函數參數默認值是一個非常有用的特性&#xff0c;它允許你在定義函數時為參數指定一個默認值。如果在調用函數時沒有提供相應的參數值&#xff0c;那么函數將使用默認值。 1. 形參初始值 具有默認值的參數&#xff0c;一般位置要靠后。這是一個潛規則&…

WebRtc webrtc-streamer部署

文章目錄 本文檔只是為了留檔方便以后工作運維&#xff0c;或者給同事分享文檔內容比較簡陋命令也不是特別全&#xff0c;不適合小白觀看&#xff0c;如有不懂可以私信&#xff0c;上班期間都是在得 WebRtc webrtc-streamer 部署 docker run -p 8000:8000 -it mpromonet/webrt…

Spring Boot中冪等性的應用

在 Spring Boot 中&#xff0c;冪等性是實現分布式系統設計和接口調用的一個重要概念&#xff0c;尤其在高并發、分布式環境下&#xff0c;確保接口重復調用不會引發系統數據異常至關重要。 冪等性概念 冪等性&#xff08;Idempotence&#xff09;是指一次請求和重復多次請求…

leetcode 7. 整數反轉

class Solution { public: int reverse(int x) { long long n0; if(x0) return 0; while(x%100) { xx/10; } while(x!0) { nn*10x%10; xx/10; } if(n<-2147483648||n>2147483647) return 0; return n; } };

[項目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 測試及總結

目錄 編寫http_server模塊 1. 引入cpp-httplib到項目中 2. cpp-httplib的使用介紹 3. 正式編寫http_server 九、添加日志到項目中 十、編寫前端模塊 十一. 詳解傳 gitee 十二、項目總結 項目的擴展 寫在前面 [項目詳解][boost搜索引擎#1] 概述 | 去標簽 | 數據清洗 |…

xxl-job 簡單的入門到實戰

本文是參考官方文檔自己實踐一次&#xff0c;純享版&#xff0c;大致也是作者邊寫博客邊去跟著官方文檔實現 一、前期準備 1、官網地址 GitHub地址&#xff1a; GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任務調度平臺XXL-JOB&…

Centos7, 使用yum工具,出現 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具時&#xff0c;如果出現 "Could not resolve host: mirrorlist.centos.org" 的錯誤&#xff0c;通常是因為默認的鏡像源無法訪問。以下是一些常用的解決方法&#xff1a; 檢查網絡連接&#xff1a;首先使用 ping 命令測試網絡連接是否正常…

【教程】通過Docker運行AnythingLLM

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 官方教程&#xff1a;Local Docker Installation ~ AnythingLLM 1、先創建一個目錄用于保存anythingllm的持久化文件&#xff1a; sudo mkdir /app su…

若依(RuoYi-Vue)+Flowable工作流前后端整合教程

此教程適合若依前后端分離項目&#xff0c;其他項目可以在擴展列表中進行查找。 近期公司里需要對很久以前的RuoYi-Vue前后端分離項目擴展出flowable的功能&#xff0c;當然這個重任也是落在了我的身上&#xff08;不然也不會有這篇文章&#xff09;&#xff0c;然后我在官網看…

ubuntu 網絡管理--NetworkManager

ubuntu 網絡管理--NetworkManager 1 介紹2 NetworkManager 命令2 nmcli 命令顯示可用的wifi AP連接wifi檢查網絡連接 ?? 如何刪除刪除網絡連接查看設備狀態添加一個新的以太網連接設置靜態 IP 地址啟用并測試連接添加新的wifi連接 3 其他命令參考 1 介紹 NetworkManager 是標…

計算機網絡習題(第5章 網絡層 第6章 傳輸層)

第5章 網絡層 一、單選題 1、下列關于 IPv4 地址的說法中&#xff0c;錯誤的是( )。 A、 IP 地址是邏輯地址 B、 IP 地址一般用點分十進制表示 C、 205.106.286.36 是一個合法的 IP 地址 D、 同一個網絡中不能有兩臺計算機的 IP 地址相同 正確答案&#xff1a; C 2、…

水庫大壩三維模型的開發和使用3Dmax篇

成果圖 開發過程 工具插件three.js先加載模型做水體銜接水位測量標尺水位標記斷面標記大壩監測點打點 上代碼&#xff0c;技術交流V: bloxed <template><div class"box w100 h100"><el-row :gutter"20" v-loading"loading"e…

【藍橋杯每日一題】分糖果——DFS

分糖果 藍橋杯每日一題 2024-12-24 分糖果 DFS 題目描述 兩種糖果分別有 9 個和 16 個&#xff0c;要全部分給 7 個小朋友&#xff0c;每個小朋友得到的糖果總數最少為 2 個最多為 5 個&#xff0c;問有多少種不同的分法。糖果必須全部分完。 只要有其中一個小朋友在兩種方案中…