From 0f6b756667248eaacd280ae98b9eb47b1d07af1f Mon Sep 17 00:00:00 2001 From: sclement Date: Mon, 30 Oct 2023 14:58:04 +0100 Subject: [PATCH] Init --- .vscode/launch.json | 17 +++++++++ .vscode/settings.json | 8 +++++ main.py | 83 +++++++++++++++++++++++++++++++++++++++++++ pixiv.py | 20 +++++++++++ requirements.txt | 2 ++ 5 files changed, 130 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 main.py create mode 100644 pixiv.py create mode 100644 requirements.txt diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9a221b7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "main.py", + "envFile": "${workspaceFolder}/.env", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c1670f7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.formatting.provider": "none", + "python.analysis.autoImportCompletions": true, + "python.analysis.typeCheckingMode": "basic" +} diff --git a/main.py b/main.py new file mode 100644 index 0000000..ff49c21 --- /dev/null +++ b/main.py @@ -0,0 +1,83 @@ +import math +import os +import re +from shlex import join +from tempfile import TemporaryDirectory +import discord +import pixiv + +REFRESH_TOKEN = os.getenv("PIXIV_REFRESH_TOKEN") +if REFRESH_TOKEN is None: + print("Pixiv refresh token is missing, please set PIXIV_REFRESH_TOKEN") + exit(1) +DISCORD_TOKEN = os.getenv("DISCORD_TOKEN") +if DISCORD_TOKEN is None: + print("Discord token is missing, please set DISCORD_TOKEN") + exit(1) + + +intents = discord.Intents.default() +intents.message_content = True + +client = discord.Client(intents=intents) + + +@client.event +async def on_ready(): + print(f"We have logged in as {client.user}") + + +@client.event +async def on_message(message: discord.Message): + if message.author == client.user: + return + + if ( + match := re.search( + r"(?Phttps?://(?:www\.)?pixiv.net/\w+/artworks/(?P\d+))", + message.content, + ) + ) is not None: + with TemporaryDirectory() as tmp_dir: + async with message.channel.typing(): + pixiv.dowload_pixiv_images( + int(match.group("id")), tmp_dir, REFRESH_TOKEN + ) + files = os.listdir(tmp_dir) + to_send_files = [] + to_send_embed = [] + files.reverse() + for file in files: + joined = os.path.join(tmp_dir, file) + embed = discord.Embed(url=match.group("url")) + embed.set_image(url=f"attachment://{file}") + to_send_files.append(discord.File(joined, file)) + to_send_embed.append(embed) + if len(to_send_embed) > 4: + parts = math.ceil(len(to_send_embed) / 4) + i = 1 + while len(to_send_embed) > 4: + splited_file = to_send_files[:4] + to_send_files = to_send_files[4:] + splited_embed = to_send_embed[:4] + to_send_embed = to_send_embed[4:] + for embed in splited_embed: + embed.title = f"Part {i}/{parts}" + if i == 1: + await message.reply( + files=splited_file, embeds=splited_embed + ) + else: + await message.channel.send( + files=splited_file, embeds=splited_embed + ) + + i = i + 1 + for embed in to_send_embed: + embed.title = f"Part {i}/{parts}" + await message.channel.send( + files=to_send_files, embeds=to_send_embed + ) + + +client.run(DISCORD_TOKEN) diff --git a/pixiv.py b/pixiv.py new file mode 100644 index 0000000..a36129a --- /dev/null +++ b/pixiv.py @@ -0,0 +1,20 @@ +import pixivpy3 + + +def dowload_pixiv_images( + illust_id: int, + dest_folder: str, + refresh_token: str, +): + api = pixivpy3.AppPixivAPI() + api.auth(refresh_token=refresh_token) + # get origin url + json_result = api.illust_detail(illust_id) + illust = json_result.illust + pages = illust["meta_pages"] + print(f"Dowloading image to {dest_folder}") + for page in pages: + url = page["image_urls"]["original"] + print(url) + api.download(url=url, path=dest_folder) + print("Dowload finished !") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2178dbe --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pixivpy3 +discord.py \ No newline at end of file