[PYTHON] Grattez automatiquement le site reCAPTCHA quotidiennement (5/7: 2captcha)

  1. Définition de l'exigence ~ construction de l'environnement python
  2. Créer un mécanisme de grattage de site
  3. Traitez le fichier téléchargé (xls) pour créer le produit final (csv)
  4. Télécharger le fichier depuis S3 / Créer un téléchargement de fichier vers S3
  5. ** Implémentation de 2 captcha **
  6. Autorisez-le à démarrer dans un conteneur Docker
  7. Inscrivez-vous au lot AWS

Vers une exécution automatique

Jusqu'à la dernière fois, c'est devenu un programme qui peut atteindre l'objectif. Mais ... cette exigence exige que cela soit fait sur une base régulière tous les jours.

Normalement, vous pouvez exécuter le système de traitement par lots régulièrement avec cron, etc., mais cette fois ce n'est pas si facile.

  1. ReCAPTCHA doit être libéré (écran requis, travail manuel requis)
  2. le sélénium ne fonctionne pas non plus en mode sans tête (pas d'écran) (car le téléchargement en cliquant était requis)

Premièrement, les mesures reCAPTHCA. Quand je l'ai recherché, j'ai trouvé qu'il y avait un service russe appelé "2CAPTCHA".

image.png

C'est un service qui libère à distance reCAPTCHA. Il est exceptionnellement bon marché, avec une percée de 1000 fois et plusieurs centaines de yens. J'ai pensé que c'était un peu suspect, mais j'ai décidé de l'utiliser.

Inscription à 2captcha ~ Facturation

Créez un compte avec 2captcha et mettez de l'argent en solde. Vous ne serez pas facturé uniquement pour l'enregistrement et l'utilisation de votre carte de crédit, mais vous pouvez utiliser le service pour le montant que vous avez mis.

image.png

Je vais omettre comment l'utiliser car il y a d'autres personnes qui l'ont introduit.

https://tanuhack.com/pr-2captcha/

Cependant, je ne pouvais pas utiliser "PayU", donc j'ai utilisé paypal via "PayPro Global" et j'ai facturé 300 yens en premier. Au rythme actuel, cela semble aller environ 3000 fois.

Installation de 2captcha

Préparation préalable

Tout d'abord

--2 Obtention de la clé API du Captcha --Obtenir le reCAPTCHA google_site_key pour le site --Trouver "textarea # g-recaptcha-response" sur le site

Vous devez faire trois choses.

google_site_key est censé être un coup lorsque vous recherchez avec `data-sitekey sur le site ci-dessus, mais dans mon cas, c'était en javascript sur la source. J'ai l'impression de l'avoir trouvé en recherchant «recaptcha». (Au contraire, pour éviter les ruptures en utilisant ce service, il peut être bon de le rendre difficile à trouver ici ...)

La zone de texte a trouvé immédiatement # g-recaptcha-response. En raison du mécanisme, cela ne peut pas être changé ...

Rendre la zone de texte visible

Comme vous pouvez le voir sur le site d'introduction ci-dessus, si la zone de texte est invisible, vous ne pouvez pas la saisir, utilisez donc javascript pour la visualiser.

De plus, sur mon site cible, la case à cocher reCAPTCHA elle-même était masquée. Le comportement était "appuyez sur le bouton de connexion pour obtenir reCAPTCHA (après l'annulation, appuyez à nouveau sur le bouton de connexion pour vous connecter)".

driver.execute_script('document.querySelector(hoge).style.height = "auto";')
driver.execute_script('document.querySelector(hoge).style.position = "inherit";')
driver.execute_script('document.getElementById("g-recaptcha-response").style.display="";')

Demandez à 2captcha de libérer

Tout d'abord, récupérez le captcha_id comme suit. Je n'ai jamais eu d'erreur avec cela, mais cela se produira lors de la maintenance du service.

#Vérifiez si 2captcha est prêt
url = "http://2captcha.com/in.php?key=" + config.service_key + "&method=userrecaptcha&googlekey=" + config.google_site_key + "&pageurl=" + LOGIN_URL 
resp = requests.get(url) 
if resp.text[0:2] != 'OK': 
    exit('2captcha Service error. Error code:' + resp.text) 
captcha_id = resp.text[3:]

Utilisez ensuite ce captcha_id pour demander une libération.

#En fait, demander l'annulation
fetch_url = "http://2captcha.com/res.php?key="+ config.service_key + "&action=get&id=" + captcha_id
print('Demande d'annulation ...')
for __i in range(1, 10):
    time.sleep(5) # wait 5 sec.
    resp = requests.get(fetch_url)
    if resp.text[0:2] == 'OK':
        break
print('Google response token: ', resp.text[3:])

Je n'ai pas étudié les détails, mais il semble que "CHA_NOT_READY" puisse être retourné dans la réponse. Cela se produit-il lorsque le personnel n'est pas prêt à déverrouiller? Dans ce cas, c'est un problème, donc dans mon cas je l'ai implémenté pour recommencer plusieurs fois.

if resp.text[3:] == 'CHA_NOT_READY':
    print('Le traitement a échoué')
    driver.quit()
    if count == 0:
        exit('Error: 2captcha is not ready')
    else:
        #Recommencer
        return getLoginedDriver(config,count-1)

Lorsque le jeton est renvoyé en toute sécurité, placez-le dans la zone de texte et connectez-vous.

#Entrez le jeton dans la zone de texte
driver.find_element_by_id('g-recaptcha-response').send_keys(resp.text[3:])
time.sleep(INTERVAL)

driver.execute_script('document.querySelector(hoge).style.visibility = "hidden";') #Pour ce site, j'avais besoin de cela pour appuyer sur le bouton de connexion
submit_button = driver.find_element_by_css_selector(hoge)
submit_button.click()

Courir

Comme vous pouvez le voir, c'est incroyable ... Merci pour le merveilleux service.

Cependant, comme le système dépend de la survie de ce service, j'ai pensé à nouveau que je ne voulais pas faire de grattage si possible. Nous négocions avec le fonctionnement de ce site pour préparer l'API, mais j'espère que cela se passera bien.

Achevée

Comme reCAPTCHA peut ne pas sortir, il sera terminé si nous pouvons gérer ce cas. Maintenant, cela fonctionne simplement en exécutant (sans annuler reCAPTCHA).

Tout ce que j'ai à faire maintenant est de l'exécuter sur le serveur, pas sur le PC local ... C'est une autre montagne car elle ne fonctionne pas en mode sans tête.

Plus à ce sujet.

Recommended Posts

Grattez automatiquement le site reCAPTCHA quotidiennement (5/7: 2captcha)
Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)
Grattez automatiquement le site reCAPTCHA quotidiennement (6/7: conteneurisation)
Grattez automatiquement le site reCAPTCHA quotidiennement (4/7: traitement des fichiers S3)
Grattez automatiquement le site reCAPTCHA tous les jours (1/7: construction de l'environnement python)
Grattez automatiquement le site reCAPTCHA quotidiennement (3/7: traitement des fichiers xls)
L'édition définitive du grattage python! (Site cible: grande caméra)
J'ai essayé de gratter la publicité du site de dessin animé piraté