Spaces:
Running
Running
| import time | |
| import requests | |
| import os | |
| BASE_URL = "https://desk-api.channel.io/desk/channels/200605" | |
| MEDIA_BASE_URL = "https://media.channel.io/cht/v1" | |
| TARGET_FORWARD_CHAT_ID = "463667" | |
| SKIP_PERSON_ID = 604730 | |
| HEADERS = { | |
| "accept-language": "ja", | |
| "x-account": os.getenv("dmsendertoken") | |
| } | |
| SEND_BODY_TEMPLATE = { | |
| "requestId": "desk-web-1768737053326fv6n", | |
| "blocks": [ | |
| { | |
| "type": "text", | |
| "value": "送信しました" | |
| } | |
| ], | |
| "buttons": None, | |
| "form": None, | |
| "webPage": None, | |
| "files": None, | |
| "customPayload": None | |
| } | |
| FORWARD_BODY_TEMPLATE = { | |
| "requestId": "desk-web-1768736747518jhqp", | |
| "blocks": None, | |
| "buttons": None, | |
| "form": None, | |
| "webPage": None, | |
| "files": None, | |
| "customPayload": None | |
| } | |
| def get_direct_chats(): | |
| url = f"{BASE_URL}/direct-chats?limit=1200" | |
| r = requests.get(url, headers=HEADERS) | |
| r.raise_for_status() | |
| return r.json() | |
| def post_message(chat_id, body): | |
| url = f"{BASE_URL}/direct-chats/{chat_id}/messages" | |
| r = requests.post(url, headers=HEADERS, json=body) | |
| r.raise_for_status() | |
| return r.json() | |
| def post_group_message(chat_id, body): | |
| url = f"{BASE_URL}/groups/{chat_id}/messages" | |
| r = requests.post(url, headers=HEADERS, json=body) | |
| r.raise_for_status() | |
| return r.json() | |
| def get_messages(chat_id): | |
| url = ( | |
| f"{BASE_URL}/direct-chats/{chat_id}/messages" | |
| "?sortOrder=desc&limit=36&logFolded=false" | |
| ) | |
| r = requests.get(url, headers=HEADERS) | |
| r.raise_for_status() | |
| return r.json() | |
| def mark_messages_read(chat_id): | |
| url = f"{BASE_URL}/direct-chats/{chat_id}/messages/read" | |
| r = requests.put(url, headers=HEADERS) | |
| r.raise_for_status() | |
| def find_latest_message(messages): | |
| return max(messages, key=lambda m: m.get("updatedAt", 0)) | |
| def fetch_original_file(chat_id, file_key): | |
| url = ( | |
| f"{MEDIA_BASE_URL}/desk/channels/200605/" | |
| f"direct-chats/{chat_id}/messages/file" | |
| ) | |
| r = requests.get(url, headers=HEADERS, params={"key": file_key}) | |
| r.raise_for_status() | |
| return r.content | |
| def upload_file_to_group(file_name, file_bytes): | |
| url = ( | |
| f"{MEDIA_BASE_URL}/pri-file/200605/" | |
| f"groups/{TARGET_FORWARD_CHAT_ID}/message/{file_name}" | |
| ) | |
| headers = { | |
| "x-account": os.getenv("dmsendertoken"), | |
| "Content-Type": "application/octet-stream" | |
| } | |
| r = requests.post(url, headers=headers, data=file_bytes) | |
| r.raise_for_status() | |
| return r.json() | |
| def main_loop(): | |
| while True: | |
| try: | |
| data = get_direct_chats() | |
| sessions = data.get("sessions", []) | |
| for session in sessions: | |
| if session.get("unread", 0) < 1: | |
| continue | |
| chat_id = session.get("chatId") | |
| if not chat_id: | |
| continue | |
| msg_data = get_messages(chat_id) | |
| messages = msg_data.get("messages", []) | |
| if not messages: | |
| continue | |
| latest = find_latest_message(messages) | |
| if latest.get("personId") == SKIP_PERSON_ID: | |
| mark_messages_read(chat_id) | |
| continue | |
| # ① 送信しました | |
| post_message(chat_id, SEND_BODY_TEMPLATE) | |
| # ② ファイル処理 | |
| uploaded_files = [] | |
| for f in latest.get("files", []) or []: | |
| original_bytes = fetch_original_file(chat_id, f["key"]) | |
| uploaded_file = upload_file_to_group( | |
| f["name"], | |
| original_bytes | |
| ) | |
| uploaded_files.append(uploaded_file) | |
| # ③ 転送 | |
| forward_body = FORWARD_BODY_TEMPLATE.copy() | |
| forward_body["blocks"] = latest.get("blocks") | |
| forward_body["files"] = uploaded_files if uploaded_files else None | |
| post_group_message(TARGET_FORWARD_CHAT_ID, forward_body) | |
| # ④ 既読 | |
| mark_messages_read(chat_id) | |
| except Exception as e: | |
| print("Error:", e) | |
| time.sleep(5) | |
| if __name__ == "__main__": | |
| main_loop() | |