こちらの記事の続きです!
結果
やりたいこと
- Slackからファイルアップロード(今回はPDF)
- PDFの中身を取得
- 中身をChromaDBに登録
コード
import os
import requests
from slack_bolt import App
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
import PyPDF2
from io import BytesIO
from docx import Document
from dotenv import load_dotenv
load_dotenv()
SLACK_BOT_TOKEN = os.getenv('SLACK_BOT_TOKEN')
client = WebClient(token=SLACK_BOT_TOKEN)
app = App(token=SLACK_BOT_TOKEN)
@app.event("file_shared")
def handle_file_shared(event, say):
try:
file_id = event['file_id']
response = client.files_info(file=file_id)
file_info = response['file']
file_url = file_info['url_private']
file_content = download_file_from_slack(file_url)
if not file_content:
say("ファイルのダウンロードに失敗しました。")
return
file_type = file_info['mimetype']
text_content = ""
if 'pdf' in file_type:
text_content = extract_text_from_pdf(file_content)
else:
say(f"サポートされていないファイル形式です: {file_type}")
return
print(f"ファイル内容:\n{text_content}")
say(f"ファイルの内容が抽出されました。内容を確認してください。")
except SlackApiError as e:
print(f"Slack API Error: {e.response['error']}")
def download_file_from_slack(file_url):
headers = {'Authorization': f'Bearer {SLACK_BOT_TOKEN}'}
response = requests.get(file_url, headers=headers)
return response.content if response.status_code == 200 else None
def extract_text_from_pdf(file_content):
try:
pdf_reader = PyPDF2.PdfReader(BytesIO(file_content))
text = ""
for page in pdf_reader.pages:
text += page.extract_text()
return text
except Exception as e:
print(f"Error extracting PDF text: {e}")
return ""
@app.event("message")
def handle_message_events(event, logger):
subtype = event.get('subtype')
if subtype == 'file_share':
logger.info("ファイル共有メッセージはスキップされました。")
return
else:
user_message = event.get('text', '')
logger.info(f"受信したメッセージ: {user_message}")
if __name__ == "__main__":
from slack_bolt.adapter.socket_mode import SocketModeHandler
SocketModeHandler(app, os.getenv('SLACK_APP_TOKEN')).start()
なんちゃって解説
@app.event("file_shared")
Slackにファイルをアップロードしたときのイベント
response = client.files_info(file=file_id)
Slack APIのfiles_infoメソッドでファイルの詳細情報を取得
requests.get
ファイルのプライベートURLを取得し、ファイルの内容をダウンロード
def download_file_from_slack(file_url):
headers = {'Authorization': f'Bearer {SLACK_BOT_TOKEN}'}
response = requests.get(file_url, headers=headers)
return response.content if response.status_code == 200 else None
PyPDF2.PdfReader
PDFを読み込み、各ページからテキストを抽出
おわりに
次は画像のテキスト化や、登録した内容に関連する回答が返ってくるか検証したいです。