Scrapper profile publique Duolingo

Objectfif : scrapper les données du profil publique d’un compte Duolingo

Bonjour,
Je souhaite scrapper les info du profil publique d’un compte duolingo :

Voici comment je parametrate le scarpper :

Quelle que soit la valeur scrapper, il me retourne « inconnu »

Je dois louper quelque chose, mais je ne vois pas quoi …
Avez-vous une idée du probleme ?
merci de votre aide

Ma configuration


System Information

version core-2024.2.5
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.12.1
os_name Linux
os_version 6.6.16-haos
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.34.0
Stage running
Available Repositories 1399
Downloaded Repositories 4
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 12.0
update_channel stable
supervisor_version supervisor-2024.02.1
agent_version 1.6.0
docker_version 24.0.7
disk_total 48.5 GB
disk_used 7.3 GB
healthy true
supported true
board generic-aarch64
supervisor_api ok
version_api ok
installed_addons Spotify Connect (0.13.0), Terminal & SSH (9.9.0), eWeLink Smart Home (1.4.3), Studio Code Server (5.15.0)
Dashboards
dashboards 1
resources 2
views 7
mode storage
Recorder
oldest_recorder_run 27 février 2024 à 14:54
current_recorder_run 7 mars 2024 à 09:55
estimated_db_size 59.04 MiB
database_engine sqlite
database_version 3.44.2
___

Salut,

tu n’as rien dans les logs ?

Voici les logs :
image

Logger: homeassistant.components.scrape.sensor
Source: components/scrape/sensor.py:183
Integration: Scrape (documentation, issues)
First occurred: 7 mars 2024 à 09:55:23 (484 occurrences)
Last logged: 12:30:41

Index '0' not found in sensor.joelle_flamme
Index '0' not found in sensor.nom
Index '0' not found in sensor.web_scrape
Index '0' not found in sensor.flammes
Index '0' not found in sensor.flammes_2

Il semble rien avoir d’interessant …

Si le fait que rien ne semble fonctionnel avec scrape :wink:
Et là c’est pas les logs complets… Avec le mode debug en plus ça pourrait t’aider

Après il faut sans doute repartir du début. Un profil publique est-il consultable sans être connecté au site (moi j’ai pas l’impression) etc etc

le profile est public, voici un exemple : Duolingo

J’ai activer le mode debug :
image

Voici le resultat :

2024-03-08 13:01:57.395 WARNING (MainThread) [homeassistant.components.scrape.sensor] Index '0' not found in sensor.flammes
2024-03-08 13:01:57.396 DEBUG (MainThread) [homeassistant.components.scrape.sensor] Parsed value: None
2024-03-08 13:01:57.401 WARNING (MainThread) [homeassistant.components.scrape.sensor] Index '0' not found in sensor.flammes_2
2024-03-08 13:01:57.402 DEBUG (MainThread) [homeassistant.components.scrape.sensor] Parsed value: None
2024-03-08 13:01:57.405 WARNING (MainThread) [homeassistant.components.scrape.sensor] Index '0' not found in sensor.nom
2024-03-08 13:01:57.406 DEBUG (MainThread) [homeassistant.components.scrape.sensor] Parsed value: None

il faut peu etre forcer un header :

Pour ce faire passer pour un simple navigateur ?

Il faut faire des tests possible que ça bloque…
Pour le sélecteur, par expérience quand il y a des DIV dedans ça fonctionne moins bien qu’en le supprimant

Le code semble être généré en javascript, donc à priori, tu ne pourras pas faire de scrapping sans passer par un moteur de rendu comme chromium ou gecko.

Si tu fais un wget (ou un curl) de la page, tu peux voir le javascript en question.

L’avantage, comme c’est du javascript, on retrouve les informations en clair dans des fichiers JSON.

Ici : users et là : leaderboards

1 « J'aime »

Merci pour ce retour

J’ai 2 questions :

1°) comment tu trouves ces 2 url : users et leaderboards

2°) J’ai essayer de creer le sensor suivant :

sensor:
  - platform: command_line
    name: Duolingo Flammes
    command: "curl -s 'https://www.duolingo.com/2017-06-30/users/229268022?fields=courses,creationDate,fromLanguage,gemsConfig,globalAmbassadorStatus,hasPlus,id,learningLanguage,lingots,name,picture,privacySettings,roles,streak,streakData%7BcurrentStreak,previousStreak%7D,subscriberLevel,totalXp,username&_=1709925608144' | jq -r '.streak'"
    unit_of_measurement: "days"
    scan_interval: 3600  # Interval de rafraîchissement en secondes

Mais il n’apparait pas dans outils de developpement/ Etats / entités (apres redemarrer un redemmarrage rapide… et je n’ai pas d’erreur d’afficher …

Comme tu as du t’en rendre compte je suis un peu newbiz avec home assitant … :smiling_face:

Ce n’est pas une histoire de HA, c’est un truc assez générique ce que tu veux faire.

Pour trouver les fichiers, il faut utiliser l’outil de développement dans ton navigateur et regarder les éléments que ton navigateur télécharge lors de l’ouverture de la page de profil.

A priori, il faut utiliser un attribut value_template pour récupérer le résultat de ta commande.

Je serai toutefois passé par un sensor : RESTful Sensor pour faire ce que tu veux faire.

Bon, j’ai encore reussi a trouver dans la console chrome comment identifer les pages qui sont appeller…
Mais avec ce que tu m’as donné… j’ai reussi à bricoler ca :

sensor:
  - platform: rest
    resource: "https://www.duolingo.com/2017-06-30/users/229268022?fields=courses,creationDate,fromLanguage,gemsConfig,globalAmbassadorStatus,hasPlus,id,learningLanguage,lingots,name,picture,privacySettings,roles,streak,streakData%7BcurrentStreak,previousStreak%7D,subscriberLevel,totalXp,username&_=1709925608144"
    name: "Duolingo JV"
    value_template: "{{ value_json.streak }}"
    icon: mdi:fire
    json_attributes:
      - totalXp
      - name
      - learningLanguage

ce qui ma permis de faire cette carte :

image

Prochaine etape historiser les flammes par jours, et faire une automatisation du type :

A 18h00
SI Nombre de flamme J-1 egale Nombre de flamme J
ALORS Notification pour rappeller de faire son duolingo !

1 « J'aime »