title: Python missing 1 required keyword-only argument
body: <p>I have a Discord Bot for UKHotDeals, but it throws an error.</p>
  <p>This is written for Python 3.x.</p>
  <p>The original repository can be find in here: <a href="https://github.com/davidteather/Hotukdeals-Discord-Notifier" rel="nofollow noreferrer">https://github.com/davidteather/Hotukdeals-Discord-Notifier</a></p>
  <pre><code>    Traceback (most recent call last):
    File &quot;C:\Users\USER\Desktop\Hotukdeals-Discord-Notifier-master\main.py&quot;, line 179, in &lt;module&gt;
      client = MyClient(channel_id)
    File &quot;C:\Users\USER\Desktop\Hotukdeals-Discord-Notifier-master\main.py&quot;, line 31, in __init__
      super().__init__(*args, **kwargs)
  TypeError: Client.__init__() missing 1 required keyword-only argument: 'intents'
  </code></pre>
  <p>I can't get where I'm missing something in the code, which is this:</p>
  <pre><code>import discord
  import asyncio
  import requests
  from selenium import webdriver
  from selenium.webdriver.firefox.options import Options
  import json
  
  with open('settings.json') as data:
      settings = json.load(data)
  
      min_upvotes = int(settings[&quot;min_upvotes&quot;])
      max_upvotes = int(settings[&quot;max_upvotes&quot;])
  
      base_url = settings[&quot;base_url&quot;]
      pages_to_index = int(settings[&quot;pages_to_index&quot;])
      discord_api_key = settings[&quot;discord_api_token&quot;]
  
      min_price = float(settings[&quot;min_price&quot;])
      max_price = float(settings[&quot;max_price&quot;])
  
      channel_id = int(settings[&quot;discord_channel_id&quot;])
  
      time_interval_seconds = int(settings[&quot;time_interval_seconds&quot;])
  
  
  class MyClient(discord.Client):
      def __init__(self, channel, *args, **kwargs):
          self.outOfStock = []
          self.checkUrls = []
          self.channelID = channel
          super().__init__(*args, **kwargs)
  
          # create the background task and run it in the background
          self.bg_task = self.loop.create_task(self.my_background_task())
  
  
      # Check deals
      def checkDealsBeautifulSoup(self, url):
          # Imports
          import requests
          from bs4 import BeautifulSoup
          import json
          import random
  
          # Loads JSON and vars
          with open('settings.json') as data:
              settings = json.load(data)
  
              min_upvotes = int(settings[&quot;min_upvotes&quot;])
              max_upvotes = int(settings[&quot;max_upvotes&quot;])
  
              min_price = float(settings[&quot;min_price&quot;])
              max_price = float(settings[&quot;max_price&quot;])
  
          # Loads proxies
          with open('proxies.txt', 'r') as proxies:
              proxies = proxies.readlines()
  
          # Picks random proxy
          proxy = random.choice(proxies)
  
          returnMsgs = []
          newArray = []
  
          # Reads already used things
          with open('data/usedLinks.txt', 'r') as data:
              usedArray = data.readlines()
  
          # Sets up proxy
          proxies = {
              &quot;http&quot;: &quot;http://&quot; + proxy,
              &quot;https&quot;: &quot;https://&quot; + proxy,
          }
  
          page = requests.get(url, proxies=proxy)
          soup = BeautifulSoup(page.text, 'html.parser')
          var = False
  
          # Tries to get things
          try:
              listings = soup.find_all(
                  'article', attrs={'data-handler': 'history'})
              upvotes = soup.find_all('span', attrs={'class': 'cept-vote-temp'})
              pricing = soup.find_all('span', attrs={'class': 'thread-price'})
              urls = soup.find_all(
                  'a', attrs={'class': 'cept-thread-image-link'})
              var = True
          except:
              var = False
  
          if var == True:
              upvotesIndex = 0
              index = 0
              for x in range(0, len(listings)):
  
                  try:
                      upvote = upvotes[upvotesIndex].text.strip().replace(
                          &quot; &quot;, &quot;&quot;).replace(&quot;°&quot;, &quot;&quot;).replace(&quot;\n&quot;, &quot;&quot;)
                      if &quot;Deal&quot; in upvote or &quot;alerts&quot; in upvote:
                          upvotesIndex += 1
                          upvote = upvotes[upvotesIndex].text.strip().replace(
                              &quot; &quot;, &quot;&quot;).replace(&quot;°&quot;, &quot;&quot;).replace(&quot;\n&quot;, &quot;&quot;)
  
                  except:
                      upvote = 0
  
                  try:
                      price = pricing[index].text.strip().replace(&quot;£&quot;, &quot;&quot;)
                  except:
                      price = 0
                  try:
                      url = urls[index].get('href')
                  except:
                      url = None
                  if price != &quot;FREE&quot;:
                      try:
                          price = float(price.replace(&quot;,&quot;, &quot;&quot;))
                      except:
                          price = 0
                  else:
                      price = 0
  
                  if min_price &lt;= price &lt;= max_price:
                      if min_upvotes &lt;= int(upvote) &lt;= max_upvotes:
                          if url != None:
                              if url + &quot;\n&quot; not in usedArray:
                                  # Return Message
                                  message = url + &quot; Satisfies your deal criteria. It is at &quot; + \
                                      str(upvote) + \
                                      &quot; degrees and costs £&quot; + str(price)
                                  returnMsgs.append(message)
                                  usedArray.append(url)
                                  newArray.append(url)
  
                  upvotesIndex += 1
                  index += 1
  
          # Saves new logged files
          with open('data/usedLinks.txt', 'a') as fileObj:
              for line in newArray:
                  fileObj.write(line + &quot;\n&quot;)
  
          # Returns stuff
          return returnMsgs
  
  
      # On start
      async def on_ready(self):
          print('Logged in as')
          print(self.user.name)
          print(self.user.id)
          print('------')
  
  
      # On message
      async def on_message(self, message):
          if message.author.id == self.user.id:
              return
  
  
      # Background manager
      async def my_background_task(self):
          await self.wait_until_ready()
          channel = self.get_channel(int(channel_id))
          while not self.is_closed():
              for page in range(0, int(pages_to_index)):
                  print('checking page ' + str(page))
                  res = self.checkDealsBeautifulSoup(
                      base_url + &quot;?page=&quot; + str(page))
                  if res != []:
                      for msg in res:
                          await channel.send(msg)
              await asyncio.sleep(int(time_interval_seconds))
  
  
  
  # Main
  
  client = MyClient(channel_id)
  client.run(discord_api_key)
  </code></pre>
  <p>channel_id and discord_api_key correctly set in settings.json like this:</p>
  <pre><code>{
      &quot;min_upvotes&quot;: &quot;500&quot;,
      &quot;max_upvotes&quot;: &quot;1000&quot;,
      &quot;base_url&quot;: &quot;https://www.hotukdeals.com&quot;,
      &quot;pages_to_index&quot;: &quot;10&quot;,
      &quot;discord_api_token&quot;: &quot;asdAxNasdDkxNzQ1NDcasdasd4ODU1OTAxOQ.GxasdNr.Hasdv7k9Iladsdvasd67jasdasdCXHF4&quot;,
      &quot;min_price&quot;: &quot;0&quot;,
      &quot;max_price&quot;: &quot;500&quot;,
      &quot;discord_channel_id&quot;: &quot;5712311231233167&quot;,
      &quot;time_interval_seconds&quot;: &quot;1800&quot;
  }
  </code></pre>