import discord from discord import Embed from discord.ext import commands import requests from bs4 import BeautifulSoup import urllib.parse import pytube import logging logger = logging.getLogger(__name__) class Web(commands.Cog): def __init__(self, bot): self.bot = bot @commands.slash_command( name="web", description="Search the web using DuckDuckGo" ) async def web( self, ctx: discord.ApplicationContext, query: str ): await ctx.defer(ephemeral=True) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} encoded_query = urllib.parse.quote_plus(query) url = f"https://duckduckgo.com/html/?q={encoded_query}" response = requests.get(url, headers=headers) logger.info(f"Query: {query}") if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') links = soup.find_all('a', class_='result__a') if links: embed = Embed(title="Search Results", description=f"Top results for: {query}", color=0x1E90FF) view = discord.ui.View(disable_on_timeout=True) for i, link in enumerate(links[:5], start=1): title = link.text if link.get('href').startswith('https://www.youtube.com/'): logger.info("youtube link") try: parsed_url = urllib.parse.urlparse(link.get('href')) video_id = urllib.parse.parse_qs(parsed_url.query).get('v', [None])[0] if video_id: yt = pytube.YouTube(f'https://www.youtube.com/watch?v={video_id}') title = yt.title except Exception: pass embed.add_field(name=f"Result {i}", value=f"[{title}]({link.get('href')})", inline=False) button = discord.ui.Button(label=f"Send Result {i}") async def button_callback(interaction: discord.Interaction, link=link): await interaction.response.send_message(link.get('href')) button.callback = button_callback view.add_item(button) await ctx.respond(embed=embed, view=view, ephemeral=True) logger.info("Search results sent") else: await ctx.respond(content="No results found.", ephemeral=True) logger.warning("No results found") else: await ctx.respond(content=f"Error: {response.status_code}", ephemeral=True) logger.error(f"Error: {response.status_code}") def setup(bot): bot.add_cog(Web(bot))