import requests
import re
from collections import Counter
import tkinter as tk
from tkinter import filedialog, messagebox
# æ稿ãåå¾ããé¢æ°
def fetch_posts(mattermost_url, access_token, channel_id):
headers = {
"Authorization": f"Bearer {access_token}"
}
posts = []
page = 0
per_page = 50 # 1ãã¼ã¸ãããã®æ稿æ°ï¼æ大200ï¼
while True:
url = f"{mattermost_url}/api/v4/channels/{channel_id}/posts"
params = {
"page": page,
"per_page": per_page
}
# GETãªã¯ã¨ã¹ããéä¿¡
response = requests.get(url, headers=headers, params=params)
if response.status_code != 200:
raise Exception(f"APIãªã¯ã¨ã¹ã失æ: {response.status_code}, {response.text}")
data = response.json()
order = data.get('order', []) # æ稿ã®IDãªã¹ã
if not order: # æ稿ããªãå ´åã¯çµäº
break
for post_id in order:
posts.append(data['posts'][post_id])
page += 1 # 次ã®ãã¼ã¸ã¸
return posts
# `command=`ã«ç¶ãé¨åãæ½åºãã¦åºç¾åæ°ãè¨ç®ãããã¡ã¤ã«ã«ä¿åããé¢æ°
def save_commands_to_file(posts, file_path):
pattern = r"command=(.+)" # æ£è¦è¡¨ç¾: `command=`ã®å¾ã«ç¶ãå
¨ã¦ã®æåãæ½åº
commands = []
for post in posts:
message = post.get('message', '') # æ稿ã®å
容
match = re.search(pattern, message)
if match:
commands.append(match.group(1)) # `command=`ã«ç¶ãé¨åãåå¾
# åºç¾åæ°ãã«ã¦ã³ã
command_counts = Counter(commands)
# ãã¡ã¤ã«ã«ä¿å
with open(file_path, 'w', encoding='utf-8') as file:
for command, count in command_counts.items():
file.write(f"{command} (åºç¾åæ°: {count})\n")
# GUIã®ã¡ã¤ã³å¦ç
def run_gui():
def execute():
mattermost_url = url_entry.get().strip()
access_token = token_entry.get().strip()
channel_id = channel_entry.get().strip()
if not (mattermost_url and access_token and channel_id):
messagebox.showerror("ã¨ã©ã¼", "ãã¹ã¦ã®ãã£ã¼ã«ããå
¥åãã¦ãã ãã")
return
try:
posts = fetch_posts(mattermost_url, access_token, channel_id)
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("Text files", "*.txt")],
title="ä¿åå
ãé¸æ"
)
if not file_path:
return
save_commands_to_file(posts, file_path)
messagebox.showinfo("æå", f"åºåãå®äºãã¾ããï¼\nãã¡ã¤ã«: {file_path}")
except Exception as e:
messagebox.showerror("ã¨ã©ã¼", f"ã¨ã©ã¼ãçºçãã¾ãã:\n{e}")
# GUIã®è¨å®
root = tk.Tk()
root.title("Mattermost Command Extractor")
tk.Label(root, text="Mattermost URL:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
url_entry = tk.Entry(root, width=50)
url_entry.grid(row=0, column=1, padx=5, pady=5)
tk.Label(root, text="API Token:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
token_entry = tk.Entry(root, width=50, show="*")
token_entry.grid(row=1, column=1, padx=5, pady=5)
tk.Label(root, text="Channel ID:").grid(row=2, column=0, padx=5, pady=5, sticky="e")
channel_entry = tk.Entry(root, width=50)
channel_entry.grid(row=2, column=1, padx=5, pady=5)
tk.Button(root, text="å®è¡", command=execute).grid(row=3, column=0, columnspan=2, pady=10)
root.mainloop()
# ã¡ã¤ã³å¦ç
if __name__ == "__main__":
run_gui()
æ©è½ã®èª¬æ
- GUIæ§ç¯ (tkinter)
- tkinterã使ç¨ãã¦ãMattermostã®URLãAPIãã¼ã¯ã³ããã£ã³ãã«IDãå
¥åããGUIãä½æãã¾ããã
- ä¿åå
ãé¸æããéã«filedialogãå©ç¨ãã¦ãã¾ãã
åºç¾åæ°ã®ã«ã¦ã³ã
- collections.Counterã使ã£ã¦ãåcommand=ã®åºç¾åæ°ãã«ã¦ã³ããã¾ãã
- Counterã®çµæããã¡ã¤ã«ã«æ¸ãåºãéã«ã¯ãã³ãã³ãã¨åºç¾åæ°ãä¸è¡ãã¨ã«ä¿åãã¾ãã
ãã¡ã¤ã«ä¿å
- å®è¡å¾ãåºåãã¡ã¤ã«ã®ä¿åå
ãã¦ã¼ã¶ã¼ãæå®ã§ããããã«ãã¦ãã¾ãã