title: Python - Gspread Request Error 401
body: <p>I'm currently making a Discord-bot that connects to a Google-spreadsheet (gspread).
  But after I've been running it for a while it starts to hand out errors and it can't connect to my gspread anymore (unless i restart it).</p>
  
  <p>The error that I'm receiving: (<a href="https://hastebin.com/odutucawuv.tex" rel="noreferrer">https://hastebin.com/odutucawuv.tex</a>)</p>
  
  <pre><code>Ignoring exception in command sub
  Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 50, in wrapped
  ret = yield from coro(*args, **kwargs)
  File "C:\Users\simvid-5\Desktop\Pogomoves\DiscordBot.py", line 65, in sub
  val = worksheet.cell(cell_name.row, cell_name.col+4)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 392, in cell
  self._cell_addr(row, col))
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\client.py", line 210, in get_cells_cell_id_feed
  r = self.session.get(url)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 73, in get
  return self.request('GET', url, params=params, **kwargs)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 69, in request
  response.status_code, response.content))
  gspread.exceptions.RequestError: (401, '401: 
  b\'&lt;HTML&gt;\\n&lt;HEAD&gt;\\n&lt;TITLE&gt;Unauthorized&lt;/TITLE&gt;\\n&lt;/HEAD&gt;\\n&lt;BODY 
  BGCOLOR="#FFFFFF" TEXT="#000000"&gt;\\n&lt;H1&gt;Unauthorized&lt;/H1&gt;\\n&lt;H2&gt;Error 
  401&lt;/H2&gt;\\n&lt;/BODY&gt;\\n&lt;/HTML&gt;\\n\'')
  
  The above exception was the direct cause of the following exception:
  
  Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\bot.py", line 846, in process_commands
  yield from command.invoke(ctx)
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 374, in invoke
  yield from injected(*ctx.args, **ctx.kwargs)
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 54, in wrapped
  raise CommandInvokeError(e) from e
  discord.ext.commands.errors.CommandInvokeError: Command raised an exception: 
  RequestError: (401, '401: 
  b\'&lt;HTML&gt;\\n&lt;HEAD&gt;\\n&lt;TITLE&gt;Unauthorized&lt;/TITLE&gt;\\n&lt;/HEAD&gt;\\n&lt;BODY 
  BGCOLOR="#FFFFFF" TEXT="#000000"&gt;\\n&lt;H1&gt;Unauthorized&lt;/H1&gt;\\n&lt;H2&gt;Error 
  401&lt;/H2&gt;\\n&lt;/BODY&gt;\\n&lt;/HTML&gt;\\n\'')
  Ignoring exception in command add
  Traceback (most recent call last):
  File "C:\Users\simvid-5\Desktop\Pogomoves\DiscordBot.py", line 130, in add
  cell_name = worksheet.find(str(member))
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 711, in find
  return self._finder(finditem, query)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 696, in _finder
  cells = self._fetch_cells()
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 331, in _fetch_cells
  feed = self.client.get_cells_feed(self)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\client.py", line 176, in get_cells_feed
  r = self.session.get(url)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 73, in get
  return self.request('GET', url, params=params, **kwargs)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 69, in request
  response.status_code, response.content))
  gspread.exceptions.RequestError: (401, '401: 
  b\'&lt;HTML&gt;\\n&lt;HEAD&gt;\\n&lt;TITLE&gt;Unauthorized&lt;/TITLE&gt;\\n&lt;/HEAD&gt;\\n&lt;BODY 
  BGCOLOR="#FFFFFF" TEXT="#000000"&gt;\\n&lt;H1&gt;Unauthorized&lt;/H1&gt;\\n&lt;H2&gt;Error 
  401&lt;/H2&gt;\\n&lt;/BODY&gt;\\n&lt;/HTML&gt;\\n\'')
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 50, in wrapped
  ret = yield from coro(*args, **kwargs)
  File "C:\Users\simvid-5\Desktop\Pogomoves\DiscordBot.py", line 136, in add
  cell_list = worksheet.range('A2:A100')
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 72, in wrapper
  return method(self, *args, **kwargs)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\models.py", line 412, in range
  params={'range': name, 'return-empty': 'true'}
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\client.py", line 176, in get_cells_feed
  r = self.session.get(url)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 73, in get
  return self.request('GET', url, params=params, **kwargs)
  File "C:\Python36\lib\site-packages\gspread-0.6.2-
  py3.6.egg\gspread\httpsession.py", line 69, in request
  response.status_code, response.content))
  gspread.exceptions.RequestError: (401, '401: 
  b\'&lt;HTML&gt;\\n&lt;HEAD&gt;\\n&lt;TITLE&gt;Unauthorized&lt;/TITLE&gt;\\n&lt;/HEAD&gt;\\n&lt;BODY 
  BGCOLOR="#FFFFFF" TEXT="#000000"&gt;\\n&lt;H1&gt;Unauthorized&lt;/H1&gt;\\n&lt;H2&gt;Error 
  401&lt;/H2&gt;\\n&lt;/BODY&gt;\\n&lt;/HTML&gt;\\n\'')
  
  The above exception was the direct cause of the following exception:
  
  Traceback (most recent call last):
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\bot.py", line 846, in process_commands
  yield from command.invoke(ctx)
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 374, in invoke
  yield from injected(*ctx.args, **ctx.kwargs)
  File "C:\Python36\lib\site-packages\discord.py-0.16.10-
  py3.6.egg\discord\ext\commands\core.py", line 54, in wrapped
  raise CommandInvokeError(e) from e
  discord.ext.commands.errors.CommandInvokeError: Command raised an exception: 
  RequestError: (401, '401: 
  b\'&lt;HTML&gt;\\n&lt;HEAD&gt;\\n&lt;TITLE&gt;Unauthorized&lt;/TITLE&gt;\\n&lt;/HEAD&gt;\\n&lt;BODY 
  BGCOLOR="#FFFFFF" TEXT="#000000"&gt;\\n&lt;H1&gt;Unauthorized&lt;/H1&gt;\\n&lt;H2&gt;Error 
  401&lt;/H2&gt;\\n&lt;/BODY&gt;\\n&lt;/HTML&gt;\\n\'')
  </code></pre>
  
  <p>And one of the functions that I'm using if it's to any help to understand the problem above, I can provide more of my code if it's necessary to fix it:</p>
  
  <pre><code>import discord
  import asyncio
  import random
  import pickle
  import os
  import gspread
  import time
  
  from oauth2client.service_account import ServiceAccountCredentials
  from discord.ext import commands
  
  prefix = '!'
  
  def returnPrefix():
      global prefix
      return prefix
  
  bot = commands.Bot(returnPrefix())
  
  scope = ['https://spreadsheets.google.com/feeds']
  credentials = 
  ServiceAccountCredentials.from_json_keyfile_name('GoogleSpreadsheetCreds.json', scope)
  gc = gspread.authorize(credentials)
  sh = gc.open("MyWorksheet")
  worksheet = sh.sheet1
  
  
  @bot.event
  async def on_ready():
          print('Logged in as')
          print(bot.user.name)
          print(bot.user.id)
          print('-----')
          await bot.change_presence(game=discord.Game(name='Stackoverflow'))
  
  
  
  @bot.command(pass_context=True)
  @commands.has_role("Premium")
  async def sub(ctx, member: discord.Member = None):
      global cell_name
      if member is None:
          member = ctx.message.author
  
      #Delete user_command.
      await bot.delete_message(ctx.message)
  
      #Retrieve user from commander.
      Username = '{0}'.format(member)
  
      try:
          #Try to find the username in spreadsheet.
          cell_name = worksheet.find(Username)
      except: #If we dont find the username.
          await bot.say("Your name ("+Username+") was not found, please contact someone for help.")
  
      if cell_name.value == Username: #If we find the username.
          #Retrieve some values.
          val = worksheet.cell(cell_name.row, cell_name.col+4)
          val_date = worksheet.cell(cell_name.row, cell_name.col+3)
          remaining_days = val.value
          remaining_date = val_date.value
  
          #Send a message to a member.
          await bot.send_message(member,
                              "```Username: "+ Username+
                              "\nRemaining days: "+remaining_days+
                              "\nDate for expiration: "+remaining_date+"```")
  </code></pre>