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 :

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 
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 :

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 … 
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 :

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 »