From 7ecc217a92d6af24f395be5c9d38066945610da2 Mon Sep 17 00:00:00 2001 From: Zevaryx Date: Mon, 29 Aug 2022 09:40:59 -0600 Subject: [PATCH] New antiphish, faster yachts sink --- jarvis/client.py | 91 ++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/jarvis/client.py b/jarvis/client.py index b721df9..30800d6 100644 --- a/jarvis/client.py +++ b/jarvis/client.py @@ -81,6 +81,7 @@ class Jarvis(StatsClient): self.logger = logging.getLogger(__name__) self.phishing_domains = [] self.pre_run_callback = self._prerun + self.synced = False async def _chunk_all(self) -> None: """Chunk all guilds.""" @@ -88,15 +89,17 @@ class Jarvis(StatsClient): self.logger.debug(f"Chunking guild {guild.name} <{guild.id}>") await guild.chunk_guild() - @Task.create(IntervalTrigger(hours=1)) + @Task.create(IntervalTrigger(minutes=1)) async def _update_domains(self) -> None: self.logger.debug("Updating phishing domains") async with ClientSession(headers={"X-Identity": "Discord: zevaryx#5779"}) as session: - response = await session.get("https://phish.sinking.yachts/v2/recent/3700") + response = await session.get("https://phish.sinking.yachts/v2/recent/60") response.raise_for_status() data = await response.json() self.logger.debug(f"Found {len(data)} changes to phishing domains") + if len(data) == 0: + return add = 0 sub = 0 @@ -141,9 +144,11 @@ class Jarvis(StatsClient): async def on_ready(self) -> None: """NAFF on_ready override.""" try: - await self._sync_domains() - self._update_domains.start() - asyncio.create_task(self._chunk_all()) + if not self.synced: + await self._sync_domains() + self._update_domains.start() + asyncio.create_task(self._chunk_all()) + self.synced = True except Exception as e: self.logger.error("Failed to load anti-phishing", exc_info=e) self.logger.info("Logged in as {}".format(self.user)) # noqa: T001 @@ -662,46 +667,50 @@ class Jarvis(StatsClient): """Check if the message contains any known phishing domains.""" for match in url.finditer(message.content): async with ClientSession() as session: - resp = await session.get( - "https://spoopy.oceanlord.me/api/check_website", json={"website": match.string} + resp = await session.post( + "https://anti-fish.bitflow.dev/check", + json={"message": match.string}, + headers={ + "Application-Name": "JARVIS", + "Application-Link": "https://git.zevaryx.com/stark-industries/jarvis", + }, ) if resp.status != 200: break data = await resp.json() - for item in data["processed"]["urls"].values(): - if not item["safe"]: - self.logger.debug( - f"Scam url `{match.string}` detected in {message.guild.id}/{message.channel.id}/{message.id}" - ) - expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=24) - await Warning( - active=True, - admin=self.user.id, - duration=24, - expires_at=expires_at, - guild=message.guild.id, - reason="Unsafe URL", - user=message.author.id, - ).commit() - tracker = warnings_tracker.labels( - guild_id=message.guild.id, guild_name=message.guild.name - ) - tracker.inc() - reasons = ", ".join(item["not_safe_reasons"]) - embed = warning_embed(message.author, reasons) - try: - await message.channel.send(embeds=embed) - except Exception: - self.logger.warn("Failed to send warning embed") - try: - await message.delete() - except Exception: - self.logger.warn("Failed to delete malicious message") - tracker = malicious_tracker.labels( - guild_id=message.guild.id, guild_name=message.guild.name - ) - tracker.inc() - return True + if data["match"]: + self.logger.debug( + f"Scam url `{match.string}` detected in {message.guild.id}/{message.channel.id}/{message.id}" + ) + expires_at = datetime.now(tz=timezone.utc) + timedelta(hours=24) + await Warning( + active=True, + admin=self.user.id, + duration=24, + expires_at=expires_at, + guild=message.guild.id, + reason="Unsafe URL", + user=message.author.id, + ).commit() + tracker = warnings_tracker.labels( + guild_id=message.guild.id, guild_name=message.guild.name + ) + tracker.inc() + reasons = ", ".join(f"{m['source']}: {m['type']}" for m in data["matches"]) + embed = warning_embed(message.author, reasons) + try: + await message.channel.send(embeds=embed) + except Exception: + self.logger.warn("Failed to send warning embed") + try: + await message.delete() + except Exception: + self.logger.warn("Failed to delete malicious message") + tracker = malicious_tracker.labels( + guild_id=message.guild.id, guild_name=message.guild.name + ) + tracker.inc() + return True return False @listen()