any-env-code / dmsender.py
izuemon's picture
Update dmsender.py
989948d verified
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()