Skip to content

Commit

Permalink
ファイル構造を更新し、領収書処理機能を強化
Browse files Browse the repository at this point in the history
- `.gitignore`を修正し、`image/`の代わりに`images/`を含めるように変更。
- `freee-receipt-upload.py`にJSONインポートを追加し、インボイスから会社名を抽出するメッセージ処理を改善。
- `main.py`を更新し、特定のファイルではなく、ソースディレクトリ内のすべてのJPGファイルを処理するように変更。
- `README.md`を改訂し、セットアップ手順とシステム概要をより分かりやすく説明。
  • Loading branch information
flll committed Dec 20, 2024
1 parent 3ce66ce commit fbf6417
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 31 deletions.
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ wheels/
Thumbs.db

# 画像ファイル
image/*
!image/.gitkeep
images/*
!images/.gitkeep
batched/*
!batched/.gitkeep

Expand Down
51 changes: 27 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,33 @@
# 順序
## はじめに
1. imageフォルダにレシートを入れる
1. config.iniを設定
- 90日ぶりに起動する場合、freeeのアクセストークンを再発行する
- アプリ例: https://app.secure.freee.co.jp/developers/applications/37072
- 認証コード例: `https://accounts.secure.freee.co.jp/public_api/authorize?client_id=586969164444930&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code`
- `&prompt=select_company`は消すこと
- 認証コードは10分で失効する。
1. `python main.py`を実行し、レシートをclaudeに送信
1. 24時間待つ[batches進捗詳細](https://console.anthropic.com/settings/workspaces/default/batches)
# レシート管理システム

## 24時間たったら...
1. `python get_freee_token.py`を実行し、Freeeリフレッシュトークンとアクセストークンを発行
1. `python freee-receipt-upload.py`を実行し、claudeからのレスポンスを元に、freeeにレシートをアップロード
## 概要
freeeとClaudeを使用してレシートを自動で処理・アップロードするシステムです。

## セットアップ手順

# メモ
- 久しぶりに使うときは`freee_tokens.json`を削除して、アプリの認証コードを再発行すること
- jpgのみ対応
- batcheの機能はbetaなので仕様が変わる可能性がある
- 同じくcacheの機能もbetaなので、仕様が変わる可能性がある
- view.pyは、batchの結果を表示します
### 1. 初期設定
1. `images`フォルダにレシートを配置
2. `config.ini`の設定
- freeeのアクセストークン設定(90日毎に再発行が必要)
- アプリケーション設定例:
- アプリURL: https://app.secure.freee.co.jp/developers/applications/37072
- 認証URL: `https://accounts.secure.freee.co.jp/public_api/authorize?client_id=586969164444930&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code`
- 注意: `&prompt=select_company`は削除してください
- 認証コードの有効期限は10分です
- リフレッシュトークンは90日で失効するので、90日ごとに再発行すること

## pipコマンド
```sh
pip install anthropic requests
```
### 2. レシート処理
1. `python main.py`を実行してレシートをClaudeに送信
2. [batches進捗確認](https://console.anthropic.com/settings/workspaces/default/batches)(処理に24時間程度必要)

### 3. freeeアップロード
1. `python get_freee_token.py`を実行(トークン発行)
2. `python freee-receipt-upload.py`を実行(レシートアップロード)

## 注意事項
- 久しぶりに使用する場合は`freee_tokens.json`を削除し、アプリ認証コードを再発行
- JPG形式のみ対応
- Anthropic Batchesおよびキャッシュ機能はベータ版のため、仕様変更の可能性あり
- `view.py`でバッチ処理結果の確認が可能

[![](https://mermaid.ink/img/pako:eNpVks9u00AQxl_F2nNLJcQpB6S0TlIHIVWCE3YPi72JjWI7MrYQSiJ1dwVNqFoi_rQqHKAhAtJSOLQIEaA8zGCXvAXr9TaiPqw8s79vdubTdJAdOgSVUKMVPrBdHMXabd0KNPGVTc_HTbIE_CWwCfAj4BtAP9fXajJzAGwskunT3fRsb11bXLyuLXeAvwD2BdiPHGdfc4RNz0fTv4fbvaLqck520_EHoNtA94HuANtK356mw35XWzGBH8516eb78-Hj9f91MzrJjt_Nia6mC8UQOAdODR3Ys0utDcULR-l4kL0-VVVWZJ9qQF0GFfMujm2XOJfnFO2f5NPwn0pakXTVLAexG4Vtz9bKa4bgZhv0z-8DBVUlVDOvXsv22Wz3eXr2KJu8UZfFWZPIqlmNCCHARsov9h14X7yWh_xEuVooVqXCuOhzCegWsIGhX7nXbmZPfqWbUwUaEqyr0vkII2nNHvDjvDQfKLAuwRvCu0_AvsmrPtCPwF9J5xQs7FTDoQXkk8jHniM2pZPXsFDsEp9YqCR-HdLASSu2kBX0BIqTOLz1MLBRKY4SsoCiMGm6qNTArfsiStoOjonu4WaE_Xm2jYM7YehfSAqo4nhxGM0ZIsObxb7Kte39A4WIRDU?type=png)](https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNpVks9u00AQxl_F2nNLJcQpB6S0TlIHIVWCE3YPi72JjWI7MrYQSiJ1dwVNqFoi_rQqHKAhAtJSOLQIEaA8zGCXvAXr9TaiPqw8s79vdubTdJAdOgSVUKMVPrBdHMXabd0KNPGVTc_HTbIE_CWwCfAj4BtAP9fXajJzAGwskunT3fRsb11bXLyuLXeAvwD2BdiPHGdfc4RNz0fTv4fbvaLqck520_EHoNtA94HuANtK356mw35XWzGBH8516eb78-Hj9f91MzrJjt_Nia6mC8UQOAdODR3Ys0utDcULR-l4kL0-VVVWZJ9qQF0GFfMujm2XOJfnFO2f5NPwn0pakXTVLAexG4Vtz9bKa4bgZhv0z-8DBVUlVDOvXsv22Wz3eXr2KJu8UZfFWZPIqlmNCCHARsov9h14X7yWh_xEuVooVqXCuOhzCegWsIGhX7nXbmZPfqWbUwUaEqyr0vkII2nNHvDjvDQfKLAuwRvCu0_AvsmrPtCPwF9J5xQs7FTDoQXkk8jHniM2pZPXsFDsEp9YqCR-HdLASSu2kBX0BIqTOLz1MLBRKY4SsoCiMGm6qNTArfsiStoOjonu4WaE_Xm2jYM7YehfSAqo4nhxGM0ZIsObxb7Kte39A4WIRDU)
33 changes: 30 additions & 3 deletions freee-receipt-upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import os
import glob
import configparser
import json
from get_freee_token import get_current_token, refresh_token


Expand Down Expand Up @@ -79,9 +80,31 @@
# message_batchからの内容更新は維持
for result in client.beta.messages.batches.results(batch_id):
if result.result.type == "succeeded":
import json
message_text = result.result.message.content[0].text

if message_text.startswith('<output>'):
message_text = message_text.replace('<output>', '').replace('</output>', '').strip()

message_content = json.loads(message_text)
message_content['description'] = message_content['description'][:255]

if 'qualified_invoice' in message_content:
invoice_num = message_content['qualified_invoice']
if invoice_num.startswith('T') and len(invoice_num) == 14:
try:
sel_reg_no = invoice_num[1:]
url = f"https://www.invoice-kohyo.nta.go.jp/regno-search/detail?selRegNo={sel_reg_no}"
response = requests.get(url)

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')

company_name = soup.select_one('p.itemdata.sp_nmTsuushou_data')
if company_name:
message_content['partner_name'] = company_name.text.strip()
except Exception as e:
print(f"Error fetching company name: {e}")

new_content = {k: v for k, v in message_content.items() if k not in payload}
payload.update(new_content)
break
Expand Down Expand Up @@ -115,10 +138,14 @@
files=files
)

if not 200 <= response.status_code < 300:
print("エラーが発生しました")
print("ステータスコード:", response.status_code)
print("レスポンスヘッダー:", response.headers)
print("レスポンスボディ:", response.text)
exit(1)

print("ステータスコード:", response.status_code)
print("レスポンスヘッダー:", response.headers)
print("レスポンスボディ:", response.text)
try:
json_response = response.json()
print("JSONレスポンス:")
Expand Down
3 changes: 1 addition & 2 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import anthropic
from anthropic.types.beta.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.beta.messages.batch_create_params import Request
from dotenv import load_dotenv
import os
import base64
import glob
Expand Down Expand Up @@ -92,7 +91,7 @@ def process_image(image_path, is_first=False):
message = client.beta.prompt_caching.messages.create(**message_params)
print(message.content)

jpg_files = glob.glob(os.path.join(source_dir, "b.jpg"))
jpg_files = glob.glob(os.path.join(source_dir, "*.jpg"))
for i, jpg_file in enumerate(jpg_files):
print(f"Processing {jpg_file}...")
process_image(jpg_file, is_first=(i==1))
Expand Down

0 comments on commit fbf6417

Please sign in to comment.