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

Snoopy10800 -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -

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 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 

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 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 878
 

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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 

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