Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/11/2016, à 15:59

rasdehya

se loguer a un site a travers un script

Bonjour
je dois me connecter a ce site avec un script python :
https://stuart.staffomaticapp.com/login
apres je dois aller sur la page :
https://stuart.staffomaticapp.com/locat … ?view=list

J essaye avec la methode session.post et .get
dans le paylaod
'user_email': 'xxxx', et 'user_password': 'xxxxx'
je met user_email comme c est marque dans l inspecteur firefox lorsque je met la souris sur le cadre login.

je recois du code html et lorsque je l ouvre dans firefox , il m affiche ue page blanche avec ca
{'x-powered-by': 'Express', 'transfer-encoding': 'chunked', 'accept-ranges': 'bytes', 'content-encoding': 'gzip', 'vary': 'Accept-Encoding', 'keep-alive': 'timeout=5, max=99', 'server': 'Apache', 'last-modified': 'Tue, 15 Nov 2016 07:30:52 GMT', 'connection': 'Keep-Alive', 'etag': 'W/"4634-3439389981-gzip"', 'cache-control': 'public, max-age=0', 'date': 'Thu, 17 Nov 2016 13:39:11 GMT', 'content-type': 'text/html; charset=UTF-8'}

qu elle est la demarche ou les piste a explorer pour avancer dans mon projet ?

jmport urllib
import urllib2
import BeautifulSoup
from requests import session
from urllib2 import Request, urlopen
import time

url = ('https://stuart.staffomaticapp.com/login')
req = Request(url)
try:
    handle = urlopen(req)
except IOError, e:
    if hasattr(e, 'reason'):
        print 'Nous avons echoue a joindre le serveur'
        print 'Raison: ', e.reason
    elif hasattr(e, 'code'):
        print 'Le serveur n a pu satisfaire la demande.'
        print 'Code d erreur : ', e.code
else:
    # everything is fine
    payload = {
#        'action': 'login-form',
        'user_email': 'xxxx',
        'user_password': 'xxxx'
    }

    with session() as c:
#        c.post('https://stuart.staffomaticapp.com/login', data=payload)
#        response = c.get('https://stuart.staffomaticapp.com/')
        c.post('https://stuart.staffomaticapp.com/locations/16381/schedules/256986?view=list', data=payload)
        response = c.get('https://stuart.staffomaticapp.com/locations/16381/schedules/256986?view=list&scale=week&filter=shorthanded&date=2016-11-14')
    a = response.headers
    b = response.text
    soup = BeautifulSoup.BeautifulSoup
    soup = soup(b)
    print(soup)
    fichier = open("/tmp/rawhtml.html", "w")
    fichier.write(str(a))
    fichier.write(str(b))
    fichier.close()

mais surtout j aimerai savoir ou chercher et quoi chercher dans l inspecteur.... cookie, la reponse header , request header.. je suis perdu ... si vous conaissé un tuto  clair sur ces notions c pas clair du tout pour moi
je ne sais meme pas quelle est la reponse du serveur apres lui avoir envoyer le payload. y at il un moyen de le savoir ?

Dernière modification par rasdehya (Le 17/11/2016, à 16:01)

Hors ligne

#2 Le 21/11/2016, à 22:37

rasdehya

Re : se loguer a un site a travers un script

Salut, me revoila,
Bon je me rend compte a quel point je manquais de  connaissance sur le sujet... pas etonnant de pas avoir eu de reponse sur les forum
D ailleurs si qqn en connait un , succeptible de m aider ... car je pense pas que ce soit lié a ma mauvaise grammaire de python (quoi que) mais plus a ma logique de progression pour resoudre ce probleme... les cours du zero html et python n ont pas suffit.

Partagez une video qui a change votre facon de jongler avec le web ... ouai c ca que je recherche avant meme d avoir la solution a ce script
car c vraiment saisir la facon de proceder pour parler au serveurs en CLI qui m interesse.

voila une autre approche  j essaye avec la methode requests... j ai laisse des commentaire qui etait destine a mon pote a l origine
j ai essaye de le rendre le plus verbeux possible...
Je suis bloque au retour du serveur 404 cannot POST /login   ...... quezako?
Il y a t il un moyen de savoir pourquoi cannot POST ?? ou c a moi de le deviner (par quel moyen?) est ce que mes headers sont pas bon ? il manque des cookies?  comment savoir ca?

je dois passe a cote de qqchose d important...
pour cookieJar et opener je me suis embrouille... en plus request est censé gerer tout seul les cookie non?
dans login_data  ===> la ligne 'action' est peut etre en trop ?  j ai pas bien saisi a quoi ca sert / correspond

Si qqn a des pistes?

#!/usr/bin/env python

import urllib
import urllib2
from bs4 import BeautifulSoup
import requests
import time
import sys

import urllib
import urllib2
import cookielib

my_user = 'xxxx'
my_pass = 'xxxx'
login_url = 'https://stuart.staffomaticapp.com/login'
shedule_url = 'https://stuart.staffomaticapp.com/locations/16381/schedules/256986?view=list&scale=week&filter=shorthanded'

#cj = cookielib.CookieJar()
#opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = {
    'action': 'login-form',
    'user_email': 'my_user',
    'user_password': 'my_pass'
}

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'
}
# j ai essaye avec plusieur login_data avec ou sans 'action' ... et sans cookie, ... je le fais mal vu que j ai rien capte)
# je me suis embrouille entre les differentes methode de urllib(2) entre
# sessionns opener et request... c ca qui ma mis dans le mal ... je
# reprend a zero que avec requests


with requests.session() as c:

    # recuperation des info  de la page de login ( ca permettra de tester si  la page est accessible mais la c plutot pour decomposer au maximum)
    login_page = c.get('https://stuart.staffomaticapp.com/login')
    print login_page.headers
    time.sleep(1)
    print login_page.status_code
    time.sleep(1)
    print login_page.text
    # ya d autre chose a recup fix ?
    time.sleep(1)

    # envoie du formulaire
    login_formulaire = c.post(login_url, login_data, headers)
    print login_formulaire.headers
    time.sleep(1)
    print ""
    print login_formulaire.request.headers
    time.sleep(1)
    print login_formulaire.status_code
    # j ai un 404  je me dit que c a cause de urlencode mais ca fais pareil
    # (cf j ai essaye 2 variable login_data)
    time.sleep(1)
    # le revoila mon canot POST  que puis je mettre pour avoir la raison de ce
    # refus !!! IMPORTANT !!!
    print login_formulaire.text
    # quel methode permet de connaitre les entrees du formulaire ?? ... moi j
    # ai regarde dans l inspecteur
    time.sleep(1)
    print login_formulaire.content
    # arrive a ce niveau la que devrais me renvoyer le serveur a la place de
    # canot POST ?
    time.sleep(1)
    # qqchose comme successfull ou bien m affiche la meme chose que firefox. c
    # a dire la page d acceuil de mon compte

    # recuperation des info de la page protegee par login

    shedule_page = c.get(shedule_url)
    # c la ou j ai pas tout capte... vu que je suis deja authentifier, dois je remettre les data et headers, vu qu il concerne la page login ,
    # ici devrait plutot se trouver les info type ?view=xxx&location=xxx ...
    # etc ... mais bon faudrais deja que ca marche au dessus
    print shedule_page.headers
    time.sleep(1)
    print shedule_page.status_code
    time.sleep(1)
    print shedule_page.content
    # la j ai l impression qu il me rnvoie le meme DOM qu avec la page de login ? non ..
    # par contre le code 200 c surement parceque je suis dja authentifier sur le serveur depuis firefox
    #  mais alors si je suis deja autentifier  et  q uil me rnvoie un 2OO pourquoi je n ai pas le meme code source que dans l inspecteur
    # lorsque je suis sur la page shedule.... ca me rend perplexe

    # bon je m arrete la y a d autre partie du code a cote mais tant que ca
    # tourne pas... ya pas d interet

    # tu vois d autres appel de fonction a lancer pour etre plus verbeux ... 
    # je trouve pas la methode pour afficher le payload que j envoie. (avec urllib.get.data je l avais)

    # dis moi sinon si ma logique d approche avec get et post est bonne ?
    # hormis le fait que je n ai aucun traitement des erreur, ni imbriquer tt
    # ca dans des boucles.

merci d avance... la je suis au point mort...je c plus ou chercher

Dernière modification par rasdehya (Le 21/11/2016, à 22:53)

Hors ligne

#3 Le 22/11/2016, à 00:24

alius

Re : se loguer a un site a travers un script

Yo

tu devrais jeter un œil plus attentif à ce que ton inspecteur firefox te dit et essayer de comprendre la requete qu'il envoi quand tu te logue avec firefox et reproduire la meme chose avec python.


Alius

Hors ligne

#4 Le 22/11/2016, à 12:45

soshy

Re : se loguer a un site a travers un script

404 cannot POST /login   ...... quezako?

Ca me semble assez clair, tu ne peux pas POST sur /login.

Il y a t il un moyen de savoir pourquoi cannot POST ?? ou c a moi de le deviner (par quel moyen?) est ce que mes headers sont pas bon ? il manque des cookies?  comment savoir ca?
je dois passe a cote de qqchose d important...

Je ne suis pas certain. Je dirais qu'effectivement c'est a toi de deviner, et ca se fait surtout avec l'experience smile

je dois passe a cote de qqchose d important...

Effectivement, et la premiere c'est que tu veux POST sur la mauvaise URL. Si tu vas voir en debug ce qu'il se passe du cote reseau (dans chrome ou firefox) au moment ou tu veux t'identifier (rentre des info bidon), tu noteras que la requete s'effectue non pas sur /login mais ici /v3/stuart/users/sessions.json

Dernière modification par soshy (Le 22/11/2016, à 12:48)

Hors ligne

#5 Le 23/11/2016, à 06:01

rasdehya

Re : se loguer a un site a travers un script

tu devrais jeter un œil plus attentif à ce que ton inspecteur firefox te dit

tu as raison je me rend compte a quel point c indispensable pour reperer plus rapidement/efficacement les info necessaire a elaborer mon code cote client (= j ai besoin de connaitre le code generer en cas de reelle utilisation d un client web...  c ca le concept . right ?)
Je commence tout juste en dev web j ai assimiler deja pas mal de concept qui s emmele un peu, beaucoup. Par contre je me rend compte que la pluspart des tuto et surtout exemples (pour le html) sont quasi toujours  pour le cote serveur... donc ca m aide pas trop a comprendre la facon d aborder la chose en temps que client...

et essayer de comprendre la requete qu'il envoi quand tu te logue avec firefox et reproduire la meme chose avec python.

Alors la tu a pointe exactement ce que j aimerai comprendre...
Qd je suis sur la page /login lorsque je vais sur l inspecteur je vois un code html
Ds l onglet Network j ai les code de retour 202 403 404 (confirmer ce que je dis : c bien le code retour de chacun des appels de fonction que fais firefox au serveur)
Sur la droite j ai  les  response et request headers ...   c la je pense il me manque pas gd chose pour avoir compris le fonctionnement et la facon de faire.

la response headers , c bien les headers que m envoie le serveur en m affichant la page de login ( mais ca c avant ou apres me l avoir affichée ? )
la request headers ... c la ou je sais plus rien ...  certaines info sont identique a ceux de la response headers ... ( c normal je me dit ... mais qu elle info sont necessaire/interessante  pour moi en tant que client

Host: stuart.staffomaticapp.com
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: remember_user_token=BAhbB1sGaQPx1ANJIhlLRGdSdFhwWXdHTjk5LW9MVXYtOAY6BkVG--49288101d7873bc8fa276bc9f034177dbd15afa2; entry_url=/login; i18next=en; _staffomatic_session=WVZ1ZGxBMDhKYXRYNlpEL2ErSWpYNUViYjJxaHBtbHZua1BHc2l5QTNPOVVGSXkvS1dzYlNCbkJMRTk5S25UazJsTnFFSmp4V2QvelJYR0F6cjBhNnNOYm1JZXBRMllVQzJLWEVsWEI3OUs3UWpMVk5rMWNVYzA1dnYvdnNWcFRGVUtQYlowMHZHaFZKVW5URXlnMUVJK0lQZ051TGd1TU92TWtkQnUvNUxBPS0tV2pDWDBTZmFTUmpxb2Q2QWs2Zm00Zz09--7ad37aa3f2f7e017180db82485d9e2d66005edb0; v3-1.schedule.view=list; v3-1.schedule.scale=week; v3-1.schedule.date=2016-11-21
Connection: keep-alive
If-Modified-Since: Mon, 21 Nov 2016 14:09:48 GMT
If-None-Match: W/"4634-2227442291"
Cache-Control: max-age=0

toutes ces variables doivent etres inscriptes dans ma variable headers? Toutes ? comme cela ?

headers = {
    'user-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0'
    Cache-Control: max-age=5
    Cookie:remember_user_token=BAhbB1sGaQPx1ANJIhlLRGdSdFhwWXdHTjk5LW9MVXYtOAY6BkVG49288101d7873bc8fa276bc9f034177dbd15a
}

dois je mettre des guillemets comme je l ai fait avec user agents ?
Sinon pour les cookie je pas tout saisi: c bien un fichier c ca ? stocker sur mon ordi ? mais le user_remember_token ... a part son sens explicit en anglais, la suite de chiffre et lettre m a reffroidi lol
J ai lu plusieurs fois qu il fallait gerer les cookieJar (en python)  d autres dise que request les gerent automatiquement...  ya  tellement de truc a assimmiler . POur une premiere approche du web j aurais pu trouver un site plus facile pour me faire la main

au moment ou tu veux t'identifier (rentre des info bidon), tu noteras que la requete s'effectue non pas sur /login mais ici /v3/stuart/users/sessions.json

alors la merci ... je v voir ca direct... je pense que c l info la plus precieuse que j ai eu  pour comprendre comment comprendre la base de fonctionnement du shmilblick
car je me disait comment obtenir les info ( ou des piste pour avancer) sachant que je suis sur une page encore non remplie et que lorsque je m identifie je suis redirige vers une autre page
Je me souviendrait de ton trick.

sur l inspecteur sur la page /login je vois un code html avec <div id="main" class="container"></div> qui est rempli de ce qui m interesse (il faut d ailleur cliquet sur le menu deroulant pour le voir):
Par contre dans le code html que je recois en python il n y a que <div id="main" class="container"></div> apres ca passe a la div suivante.
TILT l histoire de la div qui s affiche derriere un menu deroulant ca  pas pas rapport au xml ? c ptet pour ca que dans le code que je recois en python avec la methode request il n y a rien)

Sinon dans le code ca parle de javascript et un pote m a parle de csrf ...  ca  c des truc a mettre dans les headers aussi ?

J ai une question : Moi je dois aller  sur xxxx/login pour m enregistrer (bon apparelent c sur /v3/stuart/users/sessions.json que je dois POST envoyer le formulaire)
Mais a la fin du script je dois simuler les deux derniers click qui font ouvrir un pop up et valider
Ca c sur xxxxx.com/locations/16381/schedules/258988?view=list&scale=week&filter=shorthanded

ce que je dois faire c est une requette post sur cette adresse url ? si oui  que mettre dedans? et dedans c quoi c dans la variable data (remarque je vois pas autre chose ) ?
c est vraiment c est aspect que je saisi pas ... certes le serveur attend une action de ma part... je dois trouver un <form> c ca ? pour poster ma requette.. ou bien un <a href> si je veut aller sur un lien ....  comment "ALLER" ou comment "ENVOYER" ?  si qqn saisi mon dileme ... tout tourne autour de ce concept ... qd j aurais compris ca ... ca va depoter grave


Juste en logique deduction, je sais que le serveur attend de ma part autant de possibilite d action que lui, en offre....
Mais concretement il attend quoi de moi ?? il veut que je parle en html ??
la traduction de click sur ce lien (=rajoute le contenu de la balise <a href> a lurl sur laquel tu est ) .... C quoi eh HTML ?
et celle de click sur le bouton valider... ?

est ce que tout ca est a mettre dans une variable $data  et a mettre dans la requette POST  (avec eventuellement les headers) ? c ca ?  genre request.post(my_url, data, headers)
tout comme pour remplir un formulaire??  est ce que c comme ca que "TOUT" fonctionne (a peu de chose pres)  cote utilisateur/client ?

il y a t il d ailleur possibilite d avoir  une liste de ces actions ?
comment ce definissent elles ? VOus voyer c vraiment des ptit bout de concept qui me manque

mais surtout; les actions de l utilisateur, pour tout ce qui est de clicker sur un lien, remplir un formulaire ou cocher une casse C QUOI c est une requette POST/GET ou c autre chose ?....
Que contient elle ?... par exemple je repere dans le code de la page un <a href> avec #/12345 qui correspond a l url apres /location (=/location/12345)
je veux aller sur cette page....
Mais bordel je fais quoi? unn espece de GET/POST  sur  /location  ...
Pareil qd je serai sur /locations/16381/schedules/258988?view=list&scale=week&filter=shorthanded ... je fais un GET/POST dessus avec une action "ouvrir"  l'objet contenu dans la class div-category qui contient le pop up ou je devrais valider... ce bouton est lui meme a l interieur de cette div-category....

surement rentrer une "valeur" lieé a un objet/ variable ... mais ... pfffff... toutes les notions / concept de programmation j en ai trop pris d un coup en pratiquant peu

Est ce que je peux directement effectuer l action qu attend le serveur qd je suis dans le pop up ... sans passer par l action "ouvrir  le pop up"
genre je suis sur une page et je veux savoir tout ce que je peux y faire dessus ? c possible ca ?
Mais surtout une fois que je connais tout ce que je peut entreprendre... comment agir  !!!!

et si je met ces cookie dans les headers, le mois prochain ca cera toujours valide comme script?

je note que ca parle de javaScript dans le DOM que je recois par python ... . c pour ca que je vois rien  dans la div  ?

C plein de question j espere que vous comprener ma facon de decrire mes interrogation sur la facon dont tt ca marche...
je suis sur que d truc parrait tellement evident que ca vient meme pa s l idee de l expliquer... j ai limpression d avoir asimiler plein de truc mais certaine logique de base m on echappé ...  et ca me bloque grave j ai envie de faire des truc , j ai la logique pour comment faire  ... boucler ... catcher les erreur...etc ... j ai du assimiler beaucoup de concept deja et la sa s embrouille avec tout la face web a decouvrir, ...ca fumme la haut

a +
one love


edit: en fait grace a ton truc de rentré des mauvais id/pass me fais comprendre mieux.
j ai un retour 200 du serveur pour la page  /v3/stuart/users/sessions.json.... c que c bon
mais il ya un 422 aussi (ca c pour le mauvais password j imagine)

Mais d ailleurs je dois faire une requette post sur  /v3/stuart/users/sessions.json et donc lui parler en "json"  ?
ou plutot en shematisant faire un POST sur /login avec dans le payload un espece de script en "json" pour aller recuperer les info sur la page ...ou enfin peut etre un POST sur /login avec un truc special dans les headers... Dans ce cas j aurais ptet le contenu complet de la page dans mon retour console

j ai lu entre temps le debut de https://developer.mozilla.org/en-US/docs/Web/HTTP ... ca va surement m aider :-)

Dernière modification par rasdehya (Le 23/11/2016, à 07:48)

Hors ligne

#6 Le 23/11/2016, à 12:13

soshy

Re : se loguer a un site a travers un script

Je pense que tu te heurtes aux joies du web nouvelle generation, plein de de javascript, qu'on appelle les SPA.

Pour faire simple, il y a l'ancien model, fait en PHP par exemple, ou le serveur t'envois une page et son contenu. Et quand tu cliques sur un lien, ca t'envois une nouvelle page. Avec ce model, tu t'attends a avoir tout le contenu de ta page quand tu fais un GET sur une URL. Puis le gens se sont dit "ouais ca serait cool de pas avoir a tout recharger a chaque fois". Donc javascript est arrive peu a peu, et permettait de modifier l'affichage de la page, voir meme son contenu en faisant quelques requetes supplementaire en JS puis en modifiant le contenu de la page (donc sans recharger la page) en fonction de la reponse. Aujourd'hui, on en arrive a un point ou les gens se disent "ouais c'est trop cool javascript, ca evite de recharger les pages entierement, ca donne des transitions super stylees c'est vraiment trop cool, on va plus faire que ca". Du coup aujourd'hui, on a ce qu'on appel les SPA (ton site en est un exemple). Un "Single Page Action" comme son nom l'indique n'a en realite qu'une seule page. Dedans on y met 3 tones de javascript, et ce javascript va lire l'URL, va requeter le serveur (en JSON generalement) pour obtenir les informations pertinentes pour l'affichage, et remplir/construire/modifier le DOM de ton unique page pour "simuler une autre page" (si on compare avec l'ancien model).

Ce que tu veux faire, se fait de 2 facons completement differentes en fonction de si tu es sur un site base sur l'ancien model, ou sur le nouveau model. Dans un cas faire des GET regarder l'url et la source pour voir ou part le POST suffit, dans l'autre il faut la console de debug avec l'onglet network, et analyser chaque requete pour trouver celle qui t'interesse et le cheminement pour atteindre ce que tu veux. Dans ce dernier cas, le DOM est generalement peu pertinent.

Dernière modification par soshy (Le 23/11/2016, à 12:20)

Hors ligne

#7 Le 23/11/2016, à 14:50

rasdehya

Re : se loguer a un site a travers un script

Un "Single Page Action" comme son nom l'indique n'a en realite qu'une seule page. Dedans on y met 3 tones de javascript, et ce javascript va lire l'URL, va requeter le serveur (en JSON generalement) pour obtenir les informations pertinentes pour l'affichage, et remplir/construire/modifier le DOM de ton unique page pour "simuler une autre page" (si on compare avec l'ancien model). .

merci maintenat le concept est clair... enfin le cote architecture... je ne voie tjs pas la logique cote utilisateur/client.
C a dire si c le javascript qui simule une page ... commmet parler au serveur en javascript  pour qu il modifie la page justement

Ce que tu veux faire, se fait de 2 facons completement differentes en fonction de si tu es sur un site base sur l'ancien model, ou sur le nouveau model..

ok grace a toit g bien capte ca... d ailleur s pour commencer avec le web ca aurait ptet ete plus simple a aborde (comprendre les concepts) si javais essaye de jongle avec du html simple ... mais bon au moins je suis direct dans le gd bain ... comme qd j etais gamain a la mer ... sauf que la j ai pas de bouée accrochée... j arrive a en attrapée qq une sur irc ou ici ,lancée par soshy... GIVE THANKS.

dans l'autre il faut la console de debug avec l'onglet network, et analyser chaque requete pour trouver celle qui t'interesse et le cheminement pour atteindre ce que tu veux. Dans ce dernier cas, le DOM est generalement peu pertinent. .

je comprend de mieux en mieux... mais ducoup ca fais reference a une question que j ai deja posé (surement tres mal dit) ... y a t il possible d'avoir les information (TOUTES !!!) que j ai a ma dispo dans l onglet network de  l inspecteur directement dans ma console ?.... ... forcement oui , j ai vite compris que tout etait possible en CLI suffit d avoir l outil approprie...
moi j ai desside de bosser en python, par exemple avec request de la biblio urllib ... lorsque je print request.headers ou response.headers response.status_code, j ai une partie de ses info ... y a pa s un "TRUC" ? pour avoir toutes les info dont j ai besoin ==> c ptet a moi d ectire cette fonction...  mais suis sur q u il en existe deja ecritent...

Je vais finir par y arriver....
je repointe ce probleme... si ca parle en json... j imagin qu il faut une librairie python avec methode adequate pour python... suis encore un peu perdu ... google tourne a plein regime

y a pas une autre bouée ... j aimerai bien une en canard et jaune si pas trop demandé... une reponse sur un forum vaut des heures sur google , je me rend compte...

a +

edit : je vais definitivement fouiller en profondeur la lib mechanize de python... ca a l air de faire quasi tout , apres faut arriver a comprendre quel fonctions je dois utilise... et pour ca saisir les concept client html/web
J avais essaye des truc avec selenium (ca pilote un navigateur et simule les actions souris click ... mais j ai pas reussi a faire la base, cad naviguer dans le site... et puis c de trop au niveau , ca m aide vraiment pas a comprendre les concept...
et c justement  ca qui me fait triper comprendre comment le system marche... pas me contenter de la derniere couche..

each one teach one .

Dernière modification par rasdehya (Le 23/11/2016, à 15:54)

Hors ligne

#8 Le 23/11/2016, à 16:04

rasdehya

Re : se loguer a un site a travers un script

ca donne ca  ....
apres les """ ... c du copier coller en vrac ... des idees pour moi

Traceback (most recent call last):
  File "/home/ryms/scripts/python_web_search.py", line 28, in <module>
    br.form = list(br.forms())[0]  # use when form is unnamed
IndexError: list index out of range
[Finished in 0.9s with exit code 1]

ca  ca veut dire qu il ne trouve pas de form et que donc c out of range ( c ca?)


#!/bin/python

import mechanize

#Create a browser object and give it some optional settings.



login_url = 'https://stuart.staffomaticapp.com/login'
shedule_url = 'https://stuart.staffomaticapp.com/locations/16381'


br = mechanize.Browser()
br.addheaders =  [('user-Agent','Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0')] 	      	# [('User-agent', 'Firefox')]
response = br.open(login_url)

#Open a webpage and inspect its contents
print response.read()      # the text of the page
response1 = br.response()  # get the response again
#print response1.read()     # can apply lxml.html.fromstring()


#To go on, the mechanize browser object must have a form selected
#List the forms that are in the page
for form in br.forms():
    print "Form name:", form.name
    print form
br.form = list(br.forms())[0]  # use when form is unnamed
br.select_form("Login")         # works when form has a name
br.set_all_readonly(False)    # allow everything to be written to
br.set_handle_robots(False)   # ignore robots
br.set_handle_refresh(False)  # can sometimes hang without this


###################################################
#   
###################################################
"""


Using Controls

Iterate through the controls in the form.

for control in br.form.controls:
    print control
    print "type=%s, name=%s value=%s" % (control.type, control.name, br[control.name])

Controls can be found by name

control = br.form.find_control("controlname")

Having a select control tells you what values can be selected

if control.type == "select":  # means it's class ClientForm.SelectControl
    for item in control.items:
    print " name=%s values=%s" % (item.name, str([label.text  for label in item.get_labels()]))

Because 'Select' type controls can have multiple selections, they must be set
with a list, even if it is one element.

print control.value
print control  # selected value is starred
control.value = ["ItemName"]
print control
br[control.name] = ["ItemName"]  # equivalent and more normal

Text controls can be set as a string

if control.type == "text":  # means it's class ClientForm.TextControl
    control.value = "stuff here"
br["controlname"] = "stuff here"  # equivalent

Controls can be set to readonly and disabled.

control.readonly = False
control.disabled = True

OR disable all of them like so

for control in br.form.controls:
   if control.type == "submit":
       control.disabled = True

Submit the form

When your form is complete you can submit

 
response = br.submit()
print response.read()
br.back()   # go back

Finding Links

Following links in mechanize is a hassle because you need the have the link
object.

Sometimes it is easier to get them all and find the link you want from the text.

for link in br.links():
    print link.text, link.url

Follow link and click links is the same as submit and click

request = br.click_link(link)
response = br.follow_link(link)
print response.geturl()

I hope that you got more understanding of the Mechanize module in Python.

"""



"""
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

login_url = 'https://stuart.staffomaticapp.com/login'
shedule_url = 'https://stuart.staffomaticapp.com/locations/16381'

import mechanize

browser.open(loginurl)
browser.select_form(name='Login')
browser['user_email'] = 'remi.anselme@gmail.com'
browser['user_password'] = 'rastafareye'
browser.submit()
"""



"""
# recupere l instance firefox pour l emulation de navigateur
driver = webdriver.Firefox()

# recupre la page avec driver.get
driver.get(login_url)
time.sleep(5)

# assert permet de verifier la presence de "Login" dans la balise <title>
assert "Login" in driver.title

# trouver un element "input text" par le nom de son attribut
user_form = driver.find_element_by_name('user[email]')
# effacer les eventuels champs preremplis
user_form.clear()
# remplir le champs du formulaire
user_form.send_keys("remi.anselme@gmail.com")


# IDEM avec simulation touche enter pour valider avec .Keys.RETURN
pass_form = driver.find_element_by_name('user[password]')
pass_form.clear()
pass_form.send_keys("rastafareye")
pass_form.send_keys(Keys.RETURN)
time.sleep(4)
# i a ce niveau j ai firefox ouvert sur la page /location /... mais comment avoir le code source... 
# en ai je vraiment besoin ?  selenium est capable de tout faire... ?
#Est ce que je dois utiliser la biblio selenium  jusqu a la fin ?  dans ce cas j ai pas aaser fouiller la doc ...
#d ailleurs c quoi l action a effectuer pour aller plus loin  dans l arbre du site ? une fois que j ai reperer le <h ref> 
#comment y acceder c vraiment cette etape du parsing que je capte pas car le code html qu il me faut est sur cette page ... bon je fouille la doc

#sinon vais voir avec phantomjs


###################################################

##################################################
link = driver.find_elements_by_tag_name('a')
print (link)

newurl = driver.current_url   
print (newurl) 
time.sleep(1)
html = driver.currentframe
print (html)
time.sleep(1)

time.sleep(2)
driver.close()

###################################################
#   
###################################################

up vote
0
down vote
favorite
	

I want to use python/mechanize to control my modem/router box. While I can login and navigate through the menus, I am not able to change any value (browser submit has no effect). The pages use javascript, but I think that I did the equivalent with mechanize in my script. Can it be it because of the antiCSRF.js file inclusion that prevents me to change any value?

The html/js code of the page:

<head>
<script type="text/javascript">
        function main_reboot_button()
        {
            var confrm = confirm("Do you want to continue...")
            if(confrm){         
                document.getElementById("main_reboot").value = "1";
                document.getElementById("main-reboot-form").submit();
                return false;
            }
            else {
                return false;
            }
        }
</script>
</head>
<body>
<div class="panel-body panel-align">
<div class="panel panel-default accor_brd accor_brd_RB_Curved content_blk">
  <form method="post" action="bbox-maintenance.lp" id="main-reboot-form" style="padding-top:20px;">
  <div class="control_blk clearfix">
    <input type="hidden" name= "main_reboot" id="main_reboot" value="0"></input>
    <label for="input01" class="control-label txt-head">Reboot Modem</label>
    <button class="btn_proximus_standalone" onclick='return main_reboot_button()'>Restart</button>
  </div>
  </form> 
</div>
</div>
</body>
<script type='text/javascript' src='js/antiCSRF.js'></script>

The antiCSRF.js file:

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
 return null;
}
var forms=document.getElementsByTagName("form");
var rn = readCookie('xAuth_SESSION_ID');
for (var i=0; i<forms.length; i++)
{
  var temp = document.createElement("INPUT");
  temp.type = "hidden";
  temp.name = "rn";
  temp.value = rn;
  forms[i].insertBefore(temp, forms[i].firstChild);
}

The part of the python code I use to make the request (after login stuff):

browser.open("http://192.168.1.1/bbox-maintenance.lp")    
browser.select_form(nr = 0)
browser.form.find_control("main_reboot").readonly = False
browser.form['main_reboot'] = "1"
browser.submit()
"""

mais au final je suis toujours au meme point comment obtenir les form qui sont genere par du javasvript ? ( mon vocabulaire est bon j espere)

comment avoir ces form dans mon DOM ???

Hors ligne

#9 Le 23/11/2016, à 16:10

soshy

Re : se loguer a un site a travers un script

commmet parler au serveur en javascript  pour qu il modifie la page justement

C'est ca le truc. Tu ne parles pas au serveur en JS, et le serveur ne modifie aucune page. C'est le javascript que tu as telecharge la premiere fois qui fait tout le travail pour changer la page. Si tu veux voir les modifications a chaque action dans un script, il faudrait que ton script soit capable d'executer du javascript en simulant un navigateur.

Tu parles au serveur avec avec REST (PUT / GET / POST ... ) en JSON. les requetes que tu envoie doivent avoir les bon header HTTP, si ta requete de login te renvois un cookie, c'est a ton script de le sauver puis de le reintegrer a chaque requete suivante pour que le serveur sache de qui vient la demande (sauf si python a un truc magic qui te gere ca, je ne connais pas python encore moins les outils disponibles).

y a t il possible d'avoir les information (TOUTES !!!) que j ai a ma dispo dans l onglet network de  l inspecteur directement dans ma console ?

Oui et non. Comme dit plus haut, tu interroges une API REST. La seule facon d'obtenir toutes les informations, c'est d'avoir la documentation de l'API fournie par les developpeurs de la dite API. Sauf que les mec qui ont pondu le site web, ils s'occupent de leur site et ils ont pas forcement envie que quelqu'un fasse une autre interface carrement plus mieux que la leur. Du coup, en plus du fait que l'API change probablement a chaque version (et que ca ne doit pas interesser grand monde), ils ne vont certainement pas s'embeter a fournir publiquement une doc technique. Bilan, tu es condamne a faire ce que l'on appel de la "rétro ingénierie". Et oui, rien n'est simple dans la vie roll

mais au final je suis toujours au meme point comment obtenir les form qui sont genere par du javasvript ? ( mon vocabulaire est bon j espere)
comment avoir ces form dans mon DOM ???

Voir mon premier paragraphe, tu peux pas. (tu peux pas depuis ton script, le dom et ses modifications tu peux les visualiser dans la console de debug)

Dernière modification par soshy (Le 23/11/2016, à 16:20)

Hors ligne

#10 Le 25/11/2016, à 16:37

rasdehya

Re : se loguer a un site a travers un script

Salut... j ai pu echanger qq truc sur irc #python-fr .... je suis plus a  l aise avec certain truc....

en shematisant /   je veux faire en script la meme chose que ce que je fais deja avec firefox...
1) me connecter a un serveur.. il m envoie auto matiquement sur la page /login ...
2) apres je suis sur mon compte....je remplie le formulaire....
3)  je clique sur le lien qui m envoie a mon agenda ('shedule)....
4) je modifie le filtre d affichage en choisisans une option dans un menu deroulant ('shothanded').... je me retrouve donc avec une url  du type xxxx.com/xxx/xxxx/?filter=xxx.... deshormais sur la page je voie  (si disponible) des cadres representant mes creneau horaire....
5) je clique une fois sur le cadre 08:00-14:00 , ca ouvre un pop-up et je reclick sur "submit"
6) voila j ai fais ce qu il fallait pour lundi... je dois repeter l operation 5) pout ttous les jours de la semaine....

Mais le temps que j arrive a vendredi d autre gars auront pris les creneau .... alors si ils ont la fibre cher eux , je suis meme pas sur d avoir le lundi ...
Vous avez capter mon script?

je dois etre capable de faire ca en script en parlant http au serveur... je ai essaye d utiliser  pour ca python avec des lib comme urllib<request<mechanize<selenium (de bas niveau a haut niveau d abstraction, selenium pilote un firefox c vraiment pas ce que j ai envie de faire....je veux capter comment parler au serveur en CLI )

Donc voila les etapes 1 a 5 ca represente quoi en language client serveur.... (= combien d etapes?)

(sauf si python a un truc magic qui te gere ca

je pense ne pas me tromper en tant que debutant,....python EST magique request est cense pouvoir TOUT gerer
cj=cookieJar() ...etc

est ce que mon plan est bon ?? je suis sur qu a certaes etapes je dois les decomposer pour repondre au securite d authentification du serveur...car j ai compris qu il fallait que je recupere des infos(contenu dans les headers et .... ou?) genre cookie et ptet d autre truc  ptet csrf (jeconnais a peine la notion mais etendu  le concept)...
mais deja l authentification ce fait grace a du java script(du moins sur firefox, je dois desactif l addon noscript)...

Ma question c est : puisque je parle direct au serveur tout ca est superflue non?  est ce que les etapes de 1 a 5 peut se resumer a une seule action POST ? (je sais ca depend)

request.post (ou bien une autre methoode c la principe ici)  C  IMPORTANT pour moi ce paragraphe
requests.post(url_ou_y_a_mon_agenda, payload, headers)
dans payload c la ou ca bloque .... quelle information pour faire comprendre au serveur que je veux directement valider le creneau 08:00-14:00 le lundi et aussi le mardi,mercredi... tout ca doit pouvoir etre inscrit au meme endroit.... je c meme pas si j ai le droit (est ce que ca doit etre 5 requette POST pour les 5 jours de la semaine ??je pense que non. j aimerai tellement saisir definitivement les rouages de communication client serveur.

Si dans les headers .j ai mis tout ce qu il faut  ( tout mon travail va etre la deja) cad cookie user token, tout les truc en Xxx, ?
est ce que je peux POST directement sur la page en mettant la bonne url (?view=xxx&filter=xxx) ?      oui/non ?

genre pour me macher le travail... et je considere que je triche la ( a la base c pas comme ca que je voudrais faire...  et puis ca empecherai de mettre le code en boucle )
Si je vais sur firefox faire les etapes 1 a 4 est ce que je peux recuperer dans l inspecteur tout ce qu il faut (cookie usertoken les headers)
et le copier dans ma variable headers?             oui/ non ?

Oui et non. Comme dit plus haut, tu interroges une API REST

Sur irc un gars m adit vas dans l onglet network ...sur la ligne qui t interesse click droit et copy link cURL... mais je l ai plus revu !!! la j ai  limpression d avoir la requette http complete  (mais c du curl et je connais pas du tout .. mais il y a lair d avoir tout... mais je c pas la syntaxe a utiliser pour mettre toutes ces variables au bon endroit avec les bon '""' '''' '=' ':' ' ' etc.. dans ma $headers

les vrai etapes
1) POST sur /login ' (j ai pas deja beesoin des bon headers?)
1b) mais au fait c pas sur /login mais sur la page en json.....
2)Recup cookie (tout le reste aussi ?... mais commennt savoir si tout le reste est necessaire/indispensable)
2b) Mais c cookie il sont a recup sur /login ou /xxx/xxxx/xxx.json ?      HELP ME
3)POST sur /ma_page_protegée

4) YEEEEEEEEEEESSSSSSSSS

Tu parles au serveur avec avec REST (PUT / GET / POST ... ) en JSON

alors la c IMPORTANT pour moi...je parle en json pour l authentification ? c plus du http !!!???  (ca dois pas etre trop eloigne j imagine)
donc du coup dans le payload du POST sur /login est ce que la syntaxe change ?

mais si je parle en jsonn, j ai plus besoin de lire le javascript? ca c juste si je connais pas le nom des variable du <form> ? et que j ai besoin de parser le DOM d e/login avec beautifulsoup     oui/non?

je demande ptet beaucoup mais mon payload  y at il plus que ca (certain mette un premier parametre 'action': 'login' ==> c quoi reelement ?)

login_data = {
    'user_email': 'rerggee@gmail.com',
    'user_password': 'ragerge'
}

et la dedans... (je sais que ca va dependre , mais sur un site un temps soit peu attentif a la securite  que retrouve t on AU MINImUM dedans ? et surtout est ce que tout ceux que je voie dans firefox sont forcement INDISPENSABLE a la requette POST ?)

headers = {
    'user-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0',
    'cookie': cj
    }

si qqn peut completer ou donne des generalites...

autre question si ma requette est en json est ce que la syntaxe change a l interieur de headers et logindata ?

woowww ca fais un bon pavé!! moi qui ecris pas souvent :-)
mais surtout beaucoup de question ...mais crucial ....
des fois je dois pense etre dans le vrai alors que non et trop souvent a l inverse je doute car les concept sont encore un peu flou.
Merci soshy
Each one teach one rasta

Dernière modification par rasdehya (Le 26/11/2016, à 03:52)

Hors ligne

#11 Le 26/11/2016, à 04:04

rasdehya

Re : se loguer a un site a travers un script

pour les specialiste de python:

je suis tomber sur une video du type DEFCON ou un ancien avais creer un script pour un ami a lui qui achetati des voiture(grossiste) sur un site web... et la meme problematique , ils sont des 100aine a vouloir les meme voitures... avec des 100aine de click a effectuer en raffraichissant les page au max = des 10aine de secretaire.... Bref pour ceux qu on suivit c exactement la meme problematique que moi.

Sauf que lui utilise les outils de bas niveau de python  cad 'socket' ...  et qd j ai vu ca je me dit putain c exactement ce niveau de comprehension que je veux atteindre ( c ptet pas demain).
A ce niveau la il doit etre tout a fait possible de faire la meme chose que ce que je veux faire avec request...
mes outils serait donc  dans l ordre des_1_et_des_0<import socket<import urllib<import mechanize<import selenium<reste_sur_firefox_t_as_rien_compris... j ai qu a choisir c ca ?  ahaha

Hors ligne