# get_refresh_token.py # A temporary, one-time-use script to get your OAuth2 refresh token. import praw from dotenv import load_dotenv import os import random import socket # --- IMPORTANT: Ensure this matches the "redirect uri" in your Reddit App settings --- REDIRECT_URI = "http://localhost:5000" def main(): print("--- RSTAT Refresh Token Generator ---") load_dotenv() client_id = os.getenv("REDDIT_CLIENT_ID") client_secret = os.getenv("REDDIT_CLIENT_SECRET") if not all([client_id, client_secret]): print( "Error: REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET must be set in your .env file." ) return # 1. Initialize PRAW reddit = praw.Reddit( client_id=client_id, client_secret=client_secret, redirect_uri=REDIRECT_URI, user_agent="rstat_token_fetcher (by u/YourUsername)", # Can be anything ) # 2. Generate the authorization URL # Scopes define what our script is allowed to do. 'identity' and 'submit' are needed. scopes = ["identity", "submit", "read"] state = str(random.randint(0, 65536)) auth_url = reddit.auth.url(scopes, state, "permanent") print("\nStep 1: Open this URL in your browser:\n") print(auth_url) print( "\nStep 2: Log in to Reddit, click 'Allow', and you'll be redirected to a 'page not found'." ) print( "Step 3: Copy the ENTIRE URL from your browser's address bar after the redirect." ) # 3. Get the redirected URL from the user redirected_url = input( "\nStep 4: Paste the full redirected URL here and press Enter:\n> " ) # 4. Exchange the authorization code for a refresh token try: # The state is used to prevent CSRF attacks, we're just checking it matches assert state == redirected_url.split("state=")[1].split("&")[0] code = redirected_url.split("code=")[1].split("#_")[0] print("\nAuthorization code received. Fetching refresh token...") # This is the line that gets the key! refresh_token = reddit.auth.authorize(code) print("\n--- SUCCESS! ---") print("Your Refresh Token is:\n") print(refresh_token) print( "\nStep 5: Copy this token and add it to your .env file as REDDIT_REFRESH_TOKEN." ) print( "Step 6: You can now delete your REDDIT_USERNAME and REDDIT_PASSWORD from the .env file." ) except Exception as e: print(f"\nAn error occurred: {e}") print("Please make sure you copied the full URL.") if __name__ == "__main__": main()