0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

転機となった一年の出来事を振り返るAdvent Calendar 2024

Day 16

SlackからアップロードしたPDFをChromaDBに登録したい

Posted at

こちらの記事の続きです!

結果

スクリーンショット 2024-12-22 18.47.49.png

やりたいこと

  • 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を読み込み、各ページからテキストを抽出

おわりに

次は画像のテキスト化や、登録した内容に関連する回答が返ってくるか検証したいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?