Error response: Too many requests. Try again in some time

Bonjour,

Depuis longtemps certaine personne (@olive entre autres) rencontraient l’erreur « Too many requests. Try again in some time. » sans vraiment comprendre pourquoi, car du coté de l’équipe de Dev/Testeur, personne n’avais l’erreur et nous n’arrivions pas a reproduire.

Depuis plusieurs jours, cela a changé, plusieurs personnes de l’équipe on rencontré le problème (et d’autre sur le net).
Apres de longues investigations, j’ai trouvé une solution qui a fonctionné pour moi et pour d’autres.

Avant de donner la solution je vais expliqué pourquoi cela arrive.
Il existe des limitation en nombre de requête/minutes, un nombre de requêtes mensuel et plein d’autre encore…

Pour vulgariser AlexaAPI est une émulation de l’application Alexa du téléphone, et donc ces limitation sont communes, ce qui explique que quand on a le Too many requests sur le plugin, l’application est aussi en rideau.
Visiblement il existe une autre limitation (dont je ne connais pas les marges), c’est une limitation de « l’agent », un agent un présent dans les requête web, c’est pour identifier sur quel navigateur vous vous trouver et ajuster l’affichage lors de votre surf sur votre navigateur. Ici nous n’utilisons pas de navigateur, mais c’est un paramètre obligatoire, il faut donc en choisir un !

Pour ce faire, il faut modifier un fichier du plugin AlexaAPI : /plugins/alexaapi/resources/lib/alexa-remote.js

Dans les environ des lignes 90 (mon code étant modifié il peut y avoir des variations) vous devriez trouver ceci :

init(cookie, callback) {
    if (typeof cookie === 'object') {
        this._options = cookie;
        if (!this._options.userAgent) {
            const platform = os.platform();
            if (platform === 'win32') {
                this._options.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0';
            }
            /*else if (platform === 'darwin') {
                this._options.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36';
            }*/
            else {
                this._options.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36';
            }
        }

Modifiez le par :

init(cookie, callback) {
    if (typeof cookie === 'object') {
        this._options = cookie;
        if (!this._options.userAgent) {
            const platform = os.platform();
            if (platform === 'win32') {
                this._options.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15';
            }
            /*else if (platform === 'darwin') {
                this._options.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36';
            }*/
            else {
               this._options.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15';
            }
        }

Cela fonctionne chez moi. Je pense (et cela n’engage que mon avis perso), qu’il est préférable d’utiliser un agent diffèrent de l’agent utilisé pas l’application de son téléphone.
Utilisant Android sur mon mobile, j’utilise donc un agent iOS sur mon plugin. A mon avis il faudra faire exactement l’inverse pour ceux utilisant un iOS, et pour ceux qui ont un de chaque débrouillez vous testez en des différents :wink:

Dans une version futur, il y aura une optimisation des requêtes, peut être que option sera ajouter pour changer facilement l’agent sans bidouiller le code, mais en attendant, voici une page qui tous les agents : Liste des User Agent par système d'exploitation et navigateur

Si vous rencontrez également le soucis et que cela résous votre problème, n’hésitez pas a le dire !

2 « J'aime »

Bonsoir,

Merci pour cette proposition de correction.
J’ai le problème depuis quelques jours également, quand le plugin alexa smarthome est activé ça met les équipements de l’appli Alexa de mon iPhone en vracs…
Il suffit de désactiver le plugin smarthome et là plus de problème.

Je n’ai pas testé ta solution. Pour l’instant, j’ai désactivé le plugin alexa smarthome et je suis en train de changer l’intégration de mes équipements Jeedom à Alexa.(j’utilisais homebridge + la plateforme alexa, qui est devenu payante (2$/mois), par le plugin alexa de Jeedom, payant aussi mais moins cher, surtout avec les promos d’été :grinning:)

Je réactiverai ensuite le plugin smarthome pour récupérer tous mes équipements alexa (ceux venant de Jeedom mais surtout ceux venant de tiers).

Comme j’utilise un iPhone, pourrais tu proposer le code à remplacer avec ce type de téléphone stp ?

Merci d’avance !

2 « J'aime »

Aucune idée, je suis appleophobe c’est pour ça que j’ai donné un site les listant tous, mais après je pense que ma théorie est potentiellement fausse, je pense qu’il y a juste une bride sur les agents hors mobile.

Donc je pense que cela devrait aller avec ceux que je propose.

Ah j’oubliais les équipements que tu envoies dans Alexa, via le plugin Alexa (Ash) les récupérer ensuite dans Alexa smarthome n’a que très peu d’intérêt (voir aucun), il est d’ailleurs conseillé de les désactiver pour soulager le requêtes de rafraîchissement que tu as déjà dans le même jeedom

Grand merci à toi, cela faisait quelques jours que j’étais concerné, et le problème est maintenant résolu !

2 « J'aime »

Il va y avoir une nouvelle version de la lib avec une approche différente sur la correction
[https://github.com/Apollon77/alexa-remote/pull/186]

Bonjour,

Oui c’est déjà en cours d’implémentation, mais c’est encore en Alpha fermé, la « bidouille » proposé est pour vous faire patienter :wink:

Il y a pas mal de nouveau avec la nouvelle lib également dont un système d’optimisation des requêtes et de nouvelles commandes, mais c’est les vacances ^^

2 « J'aime »

oui, c’est les vacances :innocent:

Je tente de pousser une nouvelle alpha dans quelques jours

Très joli le nom de cette maladie. Je crois que je suis atteint aussi !

Et du coup c’est bon, cette nouvelle lib est bien intégrée dans la dernière bêta ?
Car j’étais pas mal emmerdé avec ces erreurs, en gros je dois globalement savoir cb de req j’envoie via le plugin et mettre des sleep entre…

salut, oui elle tourne pas trop mal, et j’ai l’impression a l’utilisation qu’il y a une file integré ou un retry, car quand par exemple je fais 2-3 « faire parler » en meme temps le dernier est fais en décalé de quelques secondes

1 « J'aime »

Ah cool je vais pouvoir tester sans les sleep alors! C’est vrai que je me demandais mais pouvoir donc les requêtes ne s’empilaient pas dans le plugin au lieu de tout balancer directement ? Forcément si c’était pas le fonctionnement attendu :kissing_heart:

Effectivement, plus d’erreur après avoir enlever les sleep ! On peut mettre des commandes à la suite sans se prendre la tête. La nouvelle lib marque vraiment une grosse évolution sur ce point là :slightly_smiling_face:

1 « J'aime »