I am trying to make a program to help people get rid of their spam. There is a part of my code that gets my an error that I don't know what to do with. My python script is the following: import requests import msal import joblib # Azure AD app info TENANT_ID = 'ba960d84-655e-49a8-939f-aec5cf604024' CLIENT_ID = '409fbe46-4627-459f-be95-f1fc3e4ff10f' CLIENT_SECRET = '.AM8Q~tw8kfbHyqmXYKbgx1RuWaHKcSTt1OtvcUc' SCOPES = [ 'Mail.Read', 'Mail.ReadBasic', 'Mail.ReadWrite', 'Mail.Send', 'User-Mail.ReadWrite.All', 'User.Read'] # Laad je model model = joblib.load('spam_detector_model.pkl') def get_token_via_device_flow(): app = msal.PublicClientApplication( CLIENT_ID, authority=f'https://login.microsoftonline.com/{TENANT_ID}' ) flow = app.initiate_device_flow(scopes=SCOPES) if 'user_code' not in flow: raise Exception("Fout bij het verkrijgen van device code") print("Ga naar de volgende URL en voer de code in om te authenticeren:") print(flow['verification_uri']) print("Code:", flow['user_code']) print("Wacht totdat je hebt ingelogd en toestemming gegeven...") result = app.acquire_token_by_device_flow(flow) if 'access_token' in result: return result['access_token'] else: raise Exception("Fout bij het verkrijgen van toegangstoken: " + str(result.get('error_description'))) # Rest van je code blijft hetzelfde... def get_spam_emails(token): headers = {'Authorization': f'Bearer {token}'} url = 'https://graph.microsoft.com/v1.0/me/mailFolders/junkemail/messages' response = requests.get(url, headers=headers) response.raise_for_status() return response.json().get('value', []) def evaluate_email(email): data = { 'subject': email['subject'], 'body': email['body']['content'], 'from': email['from']['emailAddress']['address'] } prediction = model.predict([data['subject'] + ' ' + data['body']])[0] return prediction def main(): token = get_token_via_device_flow() print("Token verkregen, ophalen van spam-mails...") print("Token: " + token) emails = get_spam_emails(token) likely_spam = [] possible_falspositives = [] ai_only_spam = [] for email in emails: outlook_spam = True try: ai_spam = evaluate_email(email) except: continue if outlook_spam and ai_spam: likely_spam.append(email) elif outlook_spam and not ai_spam: possible_falspositives.append(email) elif not outlook_spam and ai_spam: ai_only_spam.append(email) print('Waarschijnlijk echt spam (Outlook + AI):') for e in likely_spam: print(f'- {e["subject"]} ({e["from"]["emailAddress"]["address"]})') print('\nOutlook spam, AI niet spam (controle):') for e in possible_falspositives: print(f'- {e["subject"]} ({e["from"]["emailAddress"]["address"]})') print('\nAI spam, Outlook niet spam (controle):') for e in ai_only_spam: print(f'- {e["subject"]} ({e["from"]["emailAddress"]["address"]})') if __name__ == '__main__': main() Some text in the code is Dutch (just like me), so you might want to translate that. When running this code (in replit) I'm getting the following console message: Ga naar de volgende URL en voer de code in om te authenticeren: https://microsoft.com/devicelogin Code: LP2DUHR2B Wacht totdat je hebt ingelogd en toestemming gegeven... which is the expected response, so I'm logging in using the instructions with no problems. BUT when I'm successfully logged in, I'm getting the the following response: Token verkregen, ophalen van spam-mails... Token: eyJ0eXAiOiJKV1QiLCJub25jZSI6IktaYldFd2R0eWE0Q3lZUEdGbkpfbXVHOFNaSklENWNQTTYzZ3JVTm94VU0iLCJhbGciOiJSUzI1NiIsIng1dCI6Il9qTndqZVNudlRUSzhYRWRyNVFVUGtCUkxMbyIsImtpZCI6Il9qTndqZVNudlRUSzhYRWRyNVFVUGtCUkxMbyJ9.eyJhdWQiOiIwMDAwMDAwMy0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9iYTk2MGQ4NC02NTVlLTQ5YTgtOTM5Zi1hZWM1Y2Y2MDQwMjQvIiwiaWF0IjoxNzUxNTQ3ODgzLCJuYmYiOjE3NTE1NDc4ODMsImV4cCI6MTc1MTU1MjIzNCwiYWNjdCI6MCwiYWNyIjoiMSIsImFjcnMiOlsicDEiXSwiYWlvIjoiQVpRQWEvOFpBQUFBaUIwVnJ4T2NzdmQzRU9nTm1aYXJ2VTRTcHRsMnVpOXE5RUZjbloyWHFsUEdTWVRaSGxobitlT2ZmVlJRcGJGT1hvRDZXRmgrQy9Zb2pBczh2NlRGV2tRU2Jzb1NGYjNlUThXaEJCNXhKK25xZzFHV09LUElsRVpKRUFWeTVGSExqTVprWFA4WXlvWDZDSmptbmd1S0ExaDFLUDBJS2YwSTY1dENVd051YmNDdXloT1U0RXBJQ011d3UxRXUwa3kxIiwiYWx0c2VjaWQiOiIxOmxpdmUuY29tOjAwMDM3RkZFN0Y2QUM1RTQiLCJhbXIiOlsicHdkIiwibWZhIl0sImFwcF9kaXNwbGF5bmFtZSI6IlNwYW10ZXN0amUiLCJhcHBpZCI6IjQwOWZiZTQ2LTQ2MjctNDU5Zi1iZTk1LWYxZmMzZTRmZjEwZiIsImFwcGlkYWNyIjoiMCIsImVtYWlsIjoiZGVsZW5vcHNjaG9vbEBvdXRsb29rLmNvbSIsImZhbWlseV9uYW1lIjoib3Agc2Nob29sIiwiZ2l2ZW5fbmFtZSI6ImRlbGVuIiwiaWRwIjoibGl2ZS5jb20iLCJpZHR5cCI6InVzZXIiLCJpcGFkZHIiOiIzNC4xMzkuMjE5LjIzOSIsIm5hbWUiOiJkZWxlbiBvcCBzY2hvb2wiLCJvaWQiOiI1ZTRjMTIzMS1jNjU0LTQ5YjktYTlmNS1iMmJkMGZmMmEyMTAiLCJwbGF0ZiI6IjgiLCJwdWlkIjoiMTAwMzIwMDRDRkY5NUM1RSIsInJoIjoiMS5BUk1CaEEyV3VsNWxxRW1UbjY3RnoyQkFKQU1BQUFBQUFBQUF3QUFBQUFBQUFBQTZBY2NUQVEuIiwic2NwIjoiTWFpbC5SZWFkIE1haWwuUmVhZEJhc2ljIE1haWwuUmVhZFdyaXRlIE1haWwuU2VuZCBvcGVuaWQgcHJvZmlsZSBVc2VyLlJlYWQgVXNlci1NYWlsLlJlYWRXcml0ZS5BbGwgZW1haWwiLCJzaWQiOiIwMDZhZmViOS0yNDg4LTFlOTItN2ZlZi0zNzIwODhiYmVjNzIiLCJzaWduaW5fc3RhdGUiOlsia21zaSJdLCJzdWIiOiJ4TWJEeV9Ya0ZVd0toenhTU1dJTUlaVW9mNWhURWZfTllqVUo4WFdtaEdRIiwidGVuYW50X3JlZ2lvbl9zY29wZSI6IkVVIiwidGlkIjoiYmE5NjBkODQtNjU1ZS00OWE4LTkzOWYtYWVjNWNmNjA0MDI0IiwidW5pcXVlX25hbWUiOiJsaXZlLmNvbSNkZWxlbm9wc2Nob29sQG91dGxvb2suY29tIiwidXRpIjoiT2tlbURwWk41VWFuTmN6bXQ2OWJBQSIsInZlciI6IjEuMCIsIndpZHMiOlsiNjJlOTAzOTQtNjlmNS00MjM3LTkxOTAtMDEyMTc3MTQ1ZTEwIiwiYjc5ZmJmNGQtM2VmOS00Njg5LTgxNDMtNzZiMTk0ZTg1NTA5Il0sInhtc19mdGQiOiIxUHhnZ1QySGY4RTlQbTBoRDZaQktkeGVXY2FPbWpPMXZhNHQ5d3loazNrQlpuSmhibU5sWXkxa2MyMXoiLCJ4bXNfaWRyZWwiOiIxMCAxIiwieG1zX3N0Ijp7InN1YiI6IldhVFRGV0RrQmlRekFDc3NvSDFPNzlEeld2RXN5a2FOcGhIVnZHZFlDQ2cifSwieG1zX3RjZHQiOjE3NTEzNzAxNDEsInhtc190ZGJyIjoiRVUifQ.oPgYnYK9vIwQLU2HM8pVBPnMzDCEnnFzcXUDzB9MaRDmqSbaVUv9l-bNC7n4Iwldp8O30PsD6J4_G6dbW4r5fau8uIhnUpQe-9UEiVELHSdUtJFbZlTp0LqnA9GIjMVJCWeTzjAkwUhLeu1e94CPFVzFHDbabKZio4TCt_bDgJ7MOEq5Z_4uv1HeRXT5lithB3dES2RSI-3UFD1CVSgRaySQvmhX9-oIkQ4DDU98lKl3tQFnyi-kVbsnUAOOjZ8-Ratt5v7-atQt366lRyBBRLALh-RKVjztTHnomtMkUqyGdtAK3_NwyRzKdX1-Ueaj1qRNCw0ar5dPo0hIlzNbyg this part is expected, but I'm getting this error at the end: Traceback (most recent call last): File "/home/runner/workspace/main.py", line 96, in <module> main() File "/home/runner/workspace/main.py", line 64, in main emails = get_spam_emails(token) ^^^^^^^^^^^^^^^^^^^^^^ File "/home/runner/workspace/main.py", line 48, in get_spam_emails response.raise_for_status() File "/home/runner/workspace/.pythonlibs/lib/python3.11/site-packages/requests/models.py", line 1026, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://graph.microsoft.com/v1.0/me/mailFolders/junkemail/messages I have tried everything, but nothing seems to work... can someone please help me? Continue reading...