IndexError: list index out of range sur un script Python...

Fermé
Snoopy10800 - 5 nov. 2023 à 19:26
mamiemando Messages postés 33334 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 novembre 2024 - 9 nov. 2023 à 15:54

Bonjour,

J'utilise un script Python depuis pratiquement 2 ans, pour gérer la géolocalisation des iPhone de la maison, dans le cadre d'un système domotique.

Depuis aujourd'hui, quand je lance le script, j'ai systématiquement un message d'erreur :

pi@raspberrypi:~ $ sudo python3 geoloc.py
Setup Time Zone
Py iCloud Services
Two-factor authentication required. Your trusted devices are:
Which device would you like to use? [0]: 0
Traceback (most recent call last):
  File "geoloc.py", line 29, in <module>
    device = devices[device]
IndexError: list index out of range

Voici le script :

import os
import click
import datetime
import time
import requests
from pyicloud import PyiCloudService


print("Setup Time Zone")
time.strftime("%X %x %Z")
os.environ["TZ"] = "Europe/Paris"


print("Py iCloud Services")
#remplacer par votre mail et password de compte icloud
api = PyiCloudService("***@***", "XYZ")

if api.requires_2fa:
    print("Two-factor authentication required. Your trusted devices are:")

    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print(
            "  %s: %s"
            % (i, device.get("deviceName", "SMS to %s" % device.get("phoneNumber")))
        )

    device = click.prompt("Which device would you like to use?", default=0)
    device = devices[device]
    if not api.send_verification_code(device):
        print("Failed to send verification code")
        sys.exit(1)

    code = click.prompt("Please enter validation code")
    if not api.validate_verification_code(device, code):
        print("Failed to verify verification code")
        sys.exit(1)

i = 0
#permet d'obtenir l'id de votre device
for c in api.devices:
    print("%d :%s" % (i,c))
    i = i+1


iphone_loc = {}
#remplacer 16 par l'id voulu
iphone_loc = api.devices[1].location()
location = "%s,%s" % (iphone_loc['latitude' ] , iphone_loc['longitude'])
print(location)
#url du device geotrav
url = "%s%s" % ("https://jeedom.XYZ.ovh/plugins/geotrav/core/api/jeeGeotrav.php?apikey=ABCD&id=644&value=",location)
print(url)
requests.get(url)

Vu que ce script n'a jamais été modifié en 2 ans, et qu'il a toujours fonctionné, je ne comprends pas pourquoi, d'un coup, j'ai ce message d'erreur... Donc je me tourne vers les pros du code. Voyez vous une anomalie quelque part ?

Merci à tous !
Macintosh / Safari 15.6.1

A voir également:

2 réponses

NHenry Messages postés 15163 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 1 novembre 2024 342
6 nov. 2023 à 18:57

D'après l'affichage, il semble que

enumerate(devices)

Te retourne une liste vide (pas de "SMS to ...")
De ce fait il n'y a rien à l'index 0.


1
mamiemando Messages postés 33334 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 novembre 2024 7 801
9 nov. 2023 à 15:54

Je valide cette explication. Il te reste donc juste à comprendre pourquoi api.trusted_devices est vide.

Quoi qu'il en soit, le code devrait contrôler si l'index device est valide, en particulier quand la liste devices est vide.

Une adaptation possible de ton code :

    if not devices:
        raise RuntimeError("No device found!")
    device_ok = False
    while not device_ok:
        device = click.prompt("Which device would you like to use?", default=0)
        device_ok = (0 <= device < len(devices))
        if not device_ok:
            print(f"Invalid device: valid values are between 0 and {len(devices)}")
    device = devices[device]

Bonne chance

0
jordane45 Messages postés 38270 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 novembre 2024 4 695
6 nov. 2023 à 09:47

Bonjour,

As tu essayé de voir ce que contient ta variable devices  ?

Il se peut que l'API PyiCloudService  ne retourne plus la liste ( modif de l'api ...  ou panne momentanée .. )


0