DOCS/plan/250907_company_x_news_implementation.md
2025-09-07 20:00:14 +09:00

3.5 KiB
Raw History

Company-X t<> ܤ\ l D<>

<91>1|: 2025-09-07

<91>1<90>: Claude & happybell80

<A9>: Company-X t<> <20><> ܤ\ l <20><> 0]

1. l D<> <20>m

1.1 Slack Interactive ܤ\

  • news_posting_skill.py: Company-X t<> D <20><> 0<> l
    • Block Kit T<><54> <15> (<28><> <20>h)
    • "H<>t<98> <20><>" / "t<08>0" <20><>
    • skill-publish <20><> T<>
    • JSON 0 <20><> <20><> (/app/data/news_posting_state.json)

1.2 Interactive Endpoint

  • main.py: /api/slack/interactive <20><><D4>x<EC> <20><>
  • slack_handler.py: handle_interactive() h l
    • Slack <1C> <20><>
    • <84><BC> aX <20><> (publish_news_, skip_news_)
    • 3 <20> ACK Q<>

1.3 X<> $

  • D ID <20><>: X<><58> )<29> D<>
    COMPANY_X_NEWS_CHANNEL_ID=C09CP4MDX71  # \Y L<><4C> D
    # COMPANY_X_NEWS_CHANNEL_ID=C09C98KK2TT  # <20><01> <20><>
    
  • /home/heejae/rb8001/.env: X<><58> <20><>
  • /home/admin/ivada_project/rb8001/.env: <20>| $ <20>0T

1.4 <11> t<> )<29> ܤ\

  • sent_news_tracker.py: <04> t<> <20>
    • 30| <20><><88><A4> <20>
    • JSON | 0 <20><>
    • <AC><A9><90><C4> <11> D0<44>
  • Dockerfile : sent_news_tracker.py <20>h
    COPY ./sent_news_tracker.py /code/
    

2. t<>\ 8<1C>

2.1 sent_news_tracker <20><> <20><>

  • 8: No module named 'sent_news_tracker'
  • <D0>x: Docker t<><74><F8> | <20><>h
  • t<B0>:
    1. Dockerfile<D0> COPY <20>9 <20><>
    2. import <20>\ 
    3. docker compose down && up --build

2.2 D ID X<>T) t<>

  • 8: D ID<49> T<><54> X<>T)(
  • 0 $<24>: DB Lt (channel_configs) )<29>
  • \<5C> <20>: X<><58> )<29>
    • t : <20>l<CC><6C>t<98><74> \Y 1, $<24><><84>ȴ<C0> )<29>
    • <A5>: <04>\ $, `x X

2.3 DM $X T<><54>

  • <04>: Slack DM<44> "$X" T<><54> \<5C>
  • <D0>x: skill-email 500 <20><>, t<> D<> <20>(<28>
  • <C1><DC>: <15>x <20><> x<><78> T<><54>

3. ܤ\ D<>M<A4>

APScheduler (09:00 <20>|)
    <20>
news_posting_skill.py
    <20>
skill-news:8505 (t<> <18>)
    <20>
Slack D <04> (Block Kit)
    <20>
<0A><><AC> <20><> t<>
    <20>
/api/slack/interactive
    <20>
handle_interactive()
    <20>
skill-publish:8511 (H<>t<98> <20><>)

4. L<><4C> )<29>

4.1 <18> L<><4C>

# Company-X t<> <20><> <20><>
curl -X POST http://localhost:8001/api/test/companyx-news

# Daily Summary DM L<><4C>
curl -X POST http://localhost:8001/api/cron/daily-summary

# \<5C> Ux
docker logs rb8001 | grep -E "Company-X|news_posting"

4.2 D ID Ux

# get_channels.py <20>l<EFBFBD><6C> <20>1h
python3 /home/heejae/rb8001/get_channels.py

5. X<> $ <20>}

5.1 D X<><58>

# Slack 0<>
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=...

# Company-X t<>
COMPANY_X_NEWS_CHANNEL_ID=C09CP4MDX71
COMPANY_X_NEWS_KEYWORDS=<EFBFBD>|<EFBFBD>Ѥ,<2C>|<EFBFBD> Ѥ
COMPANY_X_NEWS_SCHEDULE=0 10 * * 1-5
COMPANY_X_NEWS_ENABLED=true

# <20><> D<>
SKILL_NEWS_URL=http://localhost:8505
SKILL_PUBLISH_URL=http://localhost:8511

5.2 Slack App $ D<>

  • Interactivity & Shortcuts \1T
  • Request URL: https://ro-being.com/rb8001/api/slack/interactive
  • OAuth Scopes: chat:write, chat:write.public

6. <20>X<FC>m

  1. Docker <20>ܑ<AC>: docker compose down && up <20><> (restart <20><>)
  2. X<BD><C0> <20><><C0>: P <20> <20>P 
    • /home/heejae/rb8001/.env
    • /home/admin/ivada_project/rb8001/.env
  3. <B4> X<>: COMPANY_X_NEWS_CHANNEL_ID<49> <20><>

7. <20><>  <20>m

  • Slack App Interactive URL <20> $
  • skill-email 500 <20><> t<>
  • <B4> D X L<><4C>
  • <8C><DC> D<> <20> T<><54> <20>pt<70> 0<>

8. | <20><> <20><>

<E0><DC> |

  • /home/heejae/rb8001/app/skills/news_posting_skill.py
  • /home/heejae/rb8001/sent_news_tracker.py

 |

  • /home/heejae/rb8001/main.py: Interactive <20><><D4>x<EC> <20><>
  • /home/heejae/rb8001/app/router/slack_handler.py: handle_interactive() <20><>
  • /home/heejae/rb8001/Dockerfile: sent_news_tracker.py <20><> <20><>
  • /home/heejae/rb8001/app/skills/dm_skill.py: <11> t<> D0<44> <01>
  • .env |<7C>: X<><58> <20><>

9. <20>( 8