James Huang
James Huang

Reputation: 876

How to fill out a text box on website with requests python

I'm trying to convert a latex equation into an image in python. I tried certain converters but they didn't work out. I found this website https://latex2png.com/ that will convert the latex string for me but I'm not sure how to fill in the text box through python. I know requests uses http but I don't know the forms to fill in. Does anyone know how to do this?

I get this result when viewing the form data in the inspector. enter image description here

Upvotes: 1

Views: 2911

Answers (2)

Booboo
Booboo

Reputation: 44108

Update

I figured out how to do this with just using requests, which is easier and quicker:

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import requests


FORMULA = '\\sum _ {i = 1} ^ { m } \\operatorname{log} p ( x ; \\theta)'

data = {
    "auth" : { "user" : "guest", "password" : "guest"},
    "latex" : FORMULA,
    "resolution" : 600,
    "color" : "000000"
}
resp = requests.post('https://latex2png.com/api/convert', json=data, allow_redirects=True, verify=False)
results = resp.json()
if results['result-code'] == 0:
    url = 'https://latex2png.com' + results['url']
    resp = requests.get(url, allow_redirects=True, verify=False)
    png = resp.content
    with open('latex.png', 'wb') as f:
        f.write(png)
    print('Image saved.')
else:
    print(results['result-message'])

Note

Without using verfy=False, I get the following exception:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate

I have verified via my browser that the certificate is valid. Because it is not a great practice in general to disable certificate checking, although in this instance is seems to be relatively safe, we can add the missing certificate as follows:

  1. The following URL has instructions for downloading SSL certificates from a website using various browsers. You need to create a .pem file. For that you need to use Firefox. There are also various options. When you get to the Certificate page, select Let's Encrypt Authority X3 and then click on the PEM (chain) download link. This will create a file latex2png-com-chain.pem in the directory of your choice.
  2. Wherever the source specified verify=False, replace it with verify='/path-to/latex2png-com-chain.pem'

If this is a lot of trouble, this is the contents of latex2pmg-com-chain.pem:

-----BEGIN CERTIFICATE-----
MIIFUjCCBDqgAwIBAgISBDNrXu0HGJnfae4oRF0HS1MwMA0GCSqGSIb3DQEBCwUAMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQDExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDA5MjkxNTA2MTdaFw0yMDEyMjgxNTA2MTdaMBgxFjAUBgNVBAMTDWxhdGV4MnBuZy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUqji1n3TXwlCdLtEM+lhMVvyTk5DP3zM8oS3t/3AdB2qUA1bCj1hYXLzmrF1a7s8xzvyeAqTz9IPMuwfaoVNeDTLpl+KfwjuD99TrrRm6lNUcjrxeN55s7t3TM4T4Oomnn7ve+ldc+9BnnZsQSqvdgwZY6VjgqvB6Pimw1c8hFTq+zUz1uJHIrSpE55sMJTqnfYSWzelvmzIgcSn+mSZLYOlr5z3gN5x3aOgYtTx+aYi4Ns3TEXNR/eqnxzOpMI9P6hZ5UGs0Vi/j6sQQc1nEhhc8ddpxLeGNF0Qj217RzgWQWHiTuc1u+7//q/WQWNrRt4R5lJ9AQoEzRO+7HadHAgMBAAGjggJiMIICXjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKaJmoHjTE93A7alZiUawAnqaAEkMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMG8GCCsGAQUFBwEBBGMwYTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AuaW50LXgzLmxldHNlbmNyeXB0Lm9yZzAvBggrBgEFBQcwAoYjaHR0cDovL2NlcnQuaW50LXgzLmxldHNlbmNyeXB0Lm9yZy8wGAYDVR0RBBEwD4INbGF0ZXgycG5nLmNvbTBMBgNVHSAERTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQQGCisGAQQB1nkCBAIEgfUEgfIA8AB2AF6nc/nfVsDntTZIfdBJ4DJ6kZoMhKESEoQYdZaBcUVYAAABdNqdVBoAAAQDAEcwRQIgfP9e7demogIXl0FNaqqil6RMyz60bQEfsAM1jDEtZvgCIQCnvcQ1tC25GX2hRlzrSQZJ+M9Aj/ptzgPKEUeYrtg3mQB2ALIeBcyLos2KIE6HZvkruYolIGdr2vpw57JJUy3vi5BeAAABdNqdU/YAAAQDAEcwRQIgZCI1hyuxD2bnVYhE/AMh7klRGDvuKN2MlSO/K1mKzvACIQCmPglG7ZMWTGSRsUY56KpZG7HcdFonh+ao0vzo0nXEsTANBgkqhkiG9w0BAQsFAAOCAQEAWmNzDoCno1ueQCcMy8usDHUbIdr2gifu5z2LpzDiTdx7gvx2RcojtlgAoxuaTlocwPQSfW21eaq5aDAQ46JaldvGzdsqgPJlIJ91MRyWccHX+AMxxf05PiEKAe4MgLUJSb6+mwmZ0WEaBxZLcKp4vmYHBfOTvja3sOzQSydLSvyQE685f0U+PaoB3uWX2uDpobkwzLF7c7wGEY0mHsmIRBAB5kAyP0MLb2W5pV+M2vuYxVemVq2ah4tYSxc3cSjNS9r5N+A9i69ukIzNzArSXzyhDqbkexL9w2aik3F0gt8G/WgouhjEwBGDAO3YUiYRdvI7khpQTx1/re2Tpm/MXQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0NlowSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMTGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EFq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWAa6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIGCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNvbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9kc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAwVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcCARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwuY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsFAAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJouM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwuX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlGPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
-----END CERTIFICATE-----

Using Selenium and Requests

The following is complete code that:

  1. Uses Selenium to clear the current default latex formula and input your formula of choice.
  2. Waits for the new PNG file to be generated.
  3. Gets the URL of the new PNG file.
  4. Uses the requests package to download the PNG file to latex.png in the current directory.

This code is for driving Chrome, but you can download drivers for any browser of your choice.

Download ChromeDrver

Install Selenium

from selenium import webdriver
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from selenium.webdriver.common.keys import Keys
import requests
import time

FORMULA = '\\sum _ {i = 1} ^ { m } \\operatorname{log} p ( x ; \\theta)'

options = webdriver.ChromeOptions()
options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

try:
    driver.implicitly_wait(3) # wait up to 3 seconds before calls to find elements time out
    driver.get('https://latex2png.com/')
    # current png url:
    url_old = driver.find_element_by_xpath('/html/body/div[4]/div[5]/img').get_attribute('src')
    text_area = driver.find_element_by_id('form_latex')
    text_area.send_keys(Keys.CONTROL, 'a');
    text_area.send_keys(FORMULA)
    driver.find_element_by_id('convert_button').click()
    t0 = time.time()
    while True:
        # wait for new png to be generated:
        url = driver.find_element_by_xpath('/html/body/div[4]/div[5]/img').get_attribute('src')
        if url != url_old:
            break
        time.sleep(.1)
        t1 = time.time()
        if t1 - t0 > 10:
            raise Exception('Timeout waiting for new png to be generated.')
    resp = requests.get(url, allow_redirects=True, verify=False)
    png = resp.content
    with open('latex.png', 'wb') as f:
        f.write(png)
    print('Image saved.')
finally:
    driver.quit()

Upvotes: 3

LightFelicis
LightFelicis

Reputation: 139

You don't actually want to fill the boxes in "human" way. What you are looking for is sending POST request to the server. The simplest approach how to learn which request you need: Go to the site, open network tab in your browser, fill the boxes and click button. Check what kind of arguments are added to POST request. Check what type of response you are receiving and extract your png file from it. Then simply recreate the POST request in your python code using requests.

If you want to fill the boxes (see the bot filling it), you can use selenium.

Upvotes: 2

Related Questions