Initial commit: Discord automation tools
This commit is contained in:
99
scripts/chat_fetcher.py
Executable file
99
scripts/chat_fetcher.py
Executable file
@@ -0,0 +1,99 @@
|
||||
# discord_tools/scripts/chat_fetcher.py
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
# Add the parent directory to the Python path
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
project_root = os.path.dirname(os.path.dirname(script_dir))
|
||||
sys.path.insert(0, project_root)
|
||||
|
||||
from discord_tools.config.settings import DISCORD_TOKEN, DATA_DIR, MAX_MESSAGES_PER_REQUEST
|
||||
from discord_tools.utils.api_utils import make_discord_request
|
||||
|
||||
def fetch_all_messages(channel_id):
|
||||
"""
|
||||
Fetch all messages from a specific channel.
|
||||
|
||||
:param channel_id: The ID of the channel to fetch messages from
|
||||
:return: List of all fetched messages
|
||||
"""
|
||||
all_messages = []
|
||||
last_message_id = None
|
||||
|
||||
while True:
|
||||
endpoint = f'/channels/{channel_id}/messages?limit={MAX_MESSAGES_PER_REQUEST}'
|
||||
if last_message_id:
|
||||
endpoint += f'&before={last_message_id}'
|
||||
|
||||
response = make_discord_request('GET', endpoint)
|
||||
|
||||
if not response:
|
||||
print(f"Failed to fetch messages. Stopping.")
|
||||
break
|
||||
|
||||
new_messages = response.json()
|
||||
if not new_messages:
|
||||
break
|
||||
|
||||
all_messages.extend(new_messages)
|
||||
print(f"Fetched {len(all_messages)} messages so far...")
|
||||
|
||||
last_message_id = new_messages[-1]['id']
|
||||
time.sleep(1) # To avoid hitting rate limits
|
||||
|
||||
return all_messages
|
||||
|
||||
def format_messages(messages):
|
||||
"""
|
||||
Format the messages for export.
|
||||
|
||||
:param messages: List of message objects
|
||||
:return: List of formatted message dictionaries
|
||||
"""
|
||||
return [
|
||||
{
|
||||
'id': msg['id'],
|
||||
'content': msg['content'],
|
||||
'author': msg['author']['username'],
|
||||
'timestamp': msg['timestamp'],
|
||||
'attachments': [att['url'] for att in msg.get('attachments', [])],
|
||||
'embeds': msg.get('embeds', [])
|
||||
} for msg in messages
|
||||
]
|
||||
|
||||
def export_to_json(messages, channel_id):
|
||||
"""
|
||||
Export the formatted messages to a JSON file.
|
||||
|
||||
:param messages: List of formatted message dictionaries
|
||||
:param channel_id: The ID of the channel the messages are from
|
||||
"""
|
||||
formatted_messages = format_messages(messages)
|
||||
|
||||
filename = f'channel_{channel_id}_export_{datetime.now().strftime("%Y%m%d_%H%M%S")}.json'
|
||||
filepath = os.path.join(DATA_DIR, filename)
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(formatted_messages, f, ensure_ascii=False, indent=4)
|
||||
|
||||
print(f"Exported {len(formatted_messages)} messages to {filepath}")
|
||||
|
||||
def main():
|
||||
channel_id = input("Enter the channel ID to fetch messages from: ").strip()
|
||||
|
||||
if not channel_id.isdigit():
|
||||
print("Invalid channel ID. Please enter a numeric ID.")
|
||||
return
|
||||
|
||||
print("Starting to fetch messages...")
|
||||
messages = fetch_all_messages(channel_id)
|
||||
print(f"Finished fetching messages. Total messages: {len(messages)}")
|
||||
|
||||
export_to_json(messages, channel_id)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user