Locally, my Twitter bot runs fine but when I deploy it on Heroku it crashes with this error. Locally, everything is fine and when I run it, it tweets, likes and even retweets but on heroku it says it has crashed.
2022-08-23T10:13:38.309984+00:00 app[worker.1]: api.update_status(get_quote())
2022-08-23T10:13:38.309993+00:00 app[worker.1]: File "/app/app.py", line 59, in get_quote
2022-08-23T10:13:38.310053+00:00 app[worker.1]: read_f = json.load(f)
2022-08-23T10:13:38.310062+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/json/__init__.py", line 293, in load
2022-08-23T10:13:38.310195+00:00 app[worker.1]: return loads(fp.read(),
2022-08-23T10:13:38.310198+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/codecs.py", line 322, in decode
2022-08-23T10:13:38.310309+00:00 app[worker.1]: (result, consumed) = self._buffer_decode(data, self.errors, final)
2022-08-23T10:13:38.310322+00:00 app[worker.1]: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 12: invalid start byte
2022-08-23T10:13:38.453938+00:00 heroku[worker.1]: Process exited with status 1
2022-08-23T10:13:38.552988+00:00 heroku[worker.1]: State changed from up to crashed
Here is the local source code
from gc import collect
import json
import random
import re
import tweepy
from dotenv import load_dotenv
import os
import time
from bs4 import BeautifulSoup
import requests
load_dotenv()
appkey = os.environ['APPKEY']
app_secret = os.environ['APP_SECRET']
acces_token = os.environ['ACCESS_TOKEN']
access_token_secret = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuth1UserHandler(appkey, app_secret, acces_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)
user = api.verify_credentials()
def quotes_scraper():
collection = list()
TAGS = ["science","humor","life", "knowledge","motivational", "inspirational", "truth", "philosophy" ] #tags
for tag in TAGS:
url = f"https://www.goodreads.com/quotes/tag/{tag}"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser") #gets the html of the page
raw_data = soup.find_all(class_ ="quoteText") #finds elements with class quoteText
for quote in raw_data:
quote_text = quote.contents[0].strip()
author = quote.find(class_="authorOrTitle").text.strip()
data = {
"quote": quote_text,
"author": author,
"genre": tag
}
collection.append(data)
#creates a file and adds quotes to that file
with open("quotes3.json", "w") as qfile:
json.dump(collection, qfile, ensure_ascii=False)
return collection
#get a quote from a quotes file
def get_quote():
f = open('quotes3.json')
read_f = json.load(f)
random_quote = random.choice(read_f) #Gets a random quote from all quotes
author = random_quote['author']
quote_text = f"{random_quote['quote']}"
tweet = re.sub("[^A-Za-z0-9.,:;' ]","",quote_text)
ftweet= tweet +" - " +author +" #Inspiration_of_the_day"
while True:
if len(ftweet) <=280:
return ftweet
def tweet():
api.update_status(get_quote())
print(get_quote())
def like_and_retweet():
for tweet in tweepy.Cursor(api.home_timeline).items(10):
if tweet.user.id != user.id:
if not tweet.favorited:
try:
api.create_favorite(tweet.id)
print(f"liked {tweet.user.name}")
except tweepy.errors.TweepyException as e:
print(e)
if not tweet.retweeted:
try:
api.retweet(tweet.id)
print(f"retweet {tweet.user.name}")
except tweepy.errors.TweepyException as e:
print(e)
def run_tm(st, end):
random_time = random.randint(st, end)
return random_time
def run():
while True:
tweet()
time.sleep(10)
like_and_retweet()
time.sleep(run_tm(60*60*4,60*60*10))
if __name__ == "__main__":
run()
What can I do to correct this error and make the app run on Heroku? What could be causing this error?