#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import time import requests from typing import List, Dict, Any # ===== 設定 ===== X_ACCOUNT = os.getenv("dmsendertoken") if not X_ACCOUNT: raise RuntimeError("環境変数 dmsendertoken が設定されていません") BASE = "https://desk-api.channel.io/desk/channels/200605" GROUP_ID = 463667 CHECK_PERSON_ID = "604730" HEADERS = { "accept": "application/json", "accept-language": "ja", "content-type": "application/json", "x-account": X_ACCOUNT, } GET_PARAMS = { "sortOrder": "desc", "limit": 34, "logFolded": "false", } WELCOME_TEMPLATE = """ こんにちは。ITRSAにようこそ。 自動でいくつかの部屋に招待しています。 使い方: 左側のメニューから、部屋(グループ)を開くことができます。 ・「あいてぃーあーるえすえい」は本部で、雑談などをする部屋です。 ・「Youtubeダウンローダー」は、URLを送ると自動でYoutubeをダウンロードしてくれる部屋です。 ・「チャッピーくん」は、ChatGPTと話せる部屋です。 ・「幹部と裁判所からの報告」はここを管理する幹部や裁判所から通知が来る部屋です。この部屋は基本的に抜けないでください。 """ INVITE_GROUPS = [ 519217, 536194, 534868, 521995, 530062 ] # ===== API ===== def get_messages() -> List[Dict[str, Any]]: url = f"{BASE}/groups/{GROUP_ID}/messages" r = requests.get(url, headers=HEADERS, params=GET_PARAMS, timeout=20) r.raise_for_status() return r.json().get("messages", []) def get_group_titles() -> dict[int, str]: url = "https://desk-api.channel.io/desk/channels/200605/groups?limit=1000" response = requests.get(url, headers=HEADERS) response.raise_for_status() data = response.json() groups = data.get("groups", []) return { group.get("id"): group.get("title") for group in groups if "id" in group and "title" in group } def post_welcome_message() -> None: TITLES = get_group_titles() # {group_id: title} welcome_text = WELCOME_TEMPLATE.format( hq=TITLES.get(532214, "本部") ) url = f"{BASE}/groups/{GROUP_ID}/messages" payload = { "requestId": f"desk-web-{int(time.time() * 1000)}", "blocks": [ {"type": "text", "value": welcome_text} ] } requests.post(url, headers=HEADERS, json=payload, timeout=20).raise_for_status() print("[INFO] 歓迎メッセージを送信しました") def invite_person(group_id: int, person_id: str) -> None: url = f"{BASE}/groups/{group_id}/invite" params = {"managerIds": person_id} requests.post(url, headers=HEADERS, params=params, timeout=20).raise_for_status() print(f"[INFO] personId={person_id} を group {group_id} に招待しました") # ===== ロジック ===== def process(): messages = get_messages() # personId=599642 の最新発言時刻 latest_599642 = max( (int(m.get("createdAt", 0)) for m in messages if str(m.get("personId")) == CHECK_PERSON_ID), default=0 ) # 条件を満たす join メッセージを抽出 join_targets = [] for m in messages: log = m.get("log") or {} if log.get("action") != "join": continue created_at = int(m.get("createdAt", 0)) person_id = str(m.get("personId", "")) # join 以降に 599642 の発言が無い if created_at > latest_599642: join_targets.append(person_id) if not join_targets: return # 重複排除 join_targets = list(set(join_targets)) # 歓迎メッセージは1回だけ post_welcome_message() # 全員を各グループへ招待 for pid in join_targets: for gid in INVITE_GROUPS: invite_person(gid, pid) def main(): print("[INFO] Bot 起動(10秒間隔)") while True: try: process() except Exception as e: print(f"[ERROR] {e}") time.sleep(10) if __name__ == "__main__": main()