This Selenium automatization script helps to catch cita timeslot for Spanish CNP/Extranjería.
Enable your speakers and wait for "ALARM ALARM ALARM" message :) Next you'll have to confirm an appointment via SMS code.
It can make a reservation automatically if you set up anti-captcha, webhooks and IFTTT applet on your phone, read instructions below.
If you want a support for new procedure or province, open an issue or better a pull request. The following things are fully supported at the moment:
Procedures:
- POLICIA - SOLICITUD ASILO
- POLICIA - RECOGIDA DE TARJETA DE IDENTIDAD DE EXTRANJERO (TIE)
- POLICIA-AUTORIZACIÓN DE REGRESO
- POLICIA-CARTA DE INVITACIÓN
- POLICIA-CERTIFICADO DE REGISTRO DE CIUDADANO DE LA U.E.
- POLICIA-CERTIFICADOS (DE RESIDENCIA, DE NO RESIDENCIA Y DE CONCORDANCIA)
- POLICIA-CERTIFICADOS Y ASIGNACION NIE
- POLICIA-CERTIFICADOS Y ASIGNACION NIE (NO COMUNITARIOS)
- POLICIA-TOMA DE HUELLAS (EXPEDICIÓN DE TARJETA) Y RENOVACIÓN DE TARJETA DE LARGA DURACIÓN
- POLICÍA-EXP.TARJETA ASOCIADA AL ACUERDO DE RETIRADA CIUDADANOS BRITÁNICOS Y SUS FAMILIARES (BREXIT)
Provinces:
- Barcelona
- Santa Cruz de Tenerife
Other provinces are also supported if you leave offices
empty and that way try and get an appointment in a random office, but if you're required to select a specific office (as in case of OperationType.RECOGIDA_DE_TARJETA
), you should figure out office ids for your province from the appropriate page on your own.
-
Install Python 3.8.
-
pip install -r requirements.txt
-
Install Google Chrome.
-
Download chromedriver and put it in the PATH (Python dir from step 1 should work).
4.1. [Windows only] Download wsay and put it in the PATH.
-
Copy example file and fill your data, save it as
grab_me.py
. -
Run
python grab_me.py
orpython3 grab_me.py
, follow the voice instructions.
-
Get API key from https://anti-captcha.com ($5 is enough, trust me! :) and set
auto_captcha=True
. -
Get API key from https://webhook.site and set it to
sms_webhook_token
. -
Install IFTTT or any other automation tool on your phone and create an applet redirecting SMS having text "CITA PREVIA" to the temporary email you got from https://webhook.site.
-
example1.py
— Recogida de tarjeta -
example2.py
— Toma de huellas
@dataclass
class CustomerProfile:
anticaptcha_api_key: Optional[str] = None
auto_captcha: bool = True
auto_office: bool = True
chrome_driver_path: str = None
min_date: Optional[str] = None # "dd/mm/yyyy"
max_date: Optional[str] = None # "dd/mm/yyyy"
save_artifacts: bool = False
sms_webhook_token: Optional[str] = None
wait_exact_time: Optional[list] = None # [[minute, second]]
province: Province = Province.BARCELONA
operation_code: OperationType = OperationType.TOMA_HUELLAS
doc_type: DocType
doc_value: str # Passport? "123123123"; Nie? "Y1111111M"
name: str
country: str = "RUSIA"
year_of_birth: Optional[str] = None
phone: str
email: str
offices: Optional[list] = field(default_factory=list)
except_offices: Optional[list] = field(default_factory=list)
reason_or_type: str = "solicitud de asilo"
-
anticaptcha_api_key
— Anti-captcha.com API key (not required ifauto_captcha=False
) -
auto_captcha
— Should we use Anti-Captcha? For testing purposes, you can disable it and trick reCaptcha by yourself. While on appointment selection page, do not select a slot or click buttons, just pretend you're a human reading the page (select text, move cursor etc.) and press Enter in the Terminal. -
auto_office
— Automatic choice of the police station. IfFalse
, again, select an option in the browser manually, do not click "Accept" or "Enter", just press Enter in the Terminal. -
chrome_driver_path
— The path where the chromedriver executable is located. For Linux leave it as it is in the example files. For Windows change it to something like:chrome_driver_path="C:\\Users\\youruser\\AppData\\Local\\Programs\\Python\\Python38-32\\chromedriver.exe",
This is just an example, enter the path where you saved the program. -
min_date
— Minimum date for appointment in "dd/mm/yyyy" format. Appointments available earlier than this date will be skipped. -
max_date
— Maximium date for appointment in "dd/mm/yyyy" format. Appointments available later than this date will be skipped. -
sms_webhook_token
— webhook.site API key, used to automate SMS confirmation. -
wait_exact_time
— Set specific time (minute and second) you want it to hitSolicitar cita
button -
province
— Province name (Province.BARCELONA
,Province.S_CRUZ_TENERIFE
). Other provinces. -
operation_code
— Procedure (OperationType.TOMA_HUELLAS
). All procedures. -
doc_type
—DocType.NIE
,DocType.PASSPORT
orDocType.DNI
-
doc_value
— Document number, no spaces -
name
— First and Last Name -
year_of_birth
— Year of birth, like "YYYY" -
country
— Country (RUSIA by default). Copypaste yours from the appropriate page. -
phone
— Phone number, no spaces, like "600000000" -
email
— Email -
offices
— Required field forOperationType.RECOGIDA_DE_TARJETA
! If provided, script will try to select the specific police station or end the cycle. ForOperationType.TOMA_HUELLAS
it attempts to select all provided offices one by one, otherwise selects a random available. Supported offices. -
except_offices
— Select offices you would NOT like to get appointment at. -
reason_or_type
— "Motivo o tipo de solicitud de la cita". Required for some cases, likeOperationType.SOLICITUD_ASILO
. Related blog post.
For Windows, escape paths with additional backslash, e.g. C:\\Users\\lehne
If you feel like the script is being stuck at the office selection page — it's not, it refreshes the page 12 times (maximum allowed) until the office is found and then starts over.
SMTH BROKEN: [Errno 13] — that means the script is unable to write a file to file system, try to adjust permissions for it, or set save_artifacts=False
to disable saving snapshots for offices/appointments.
To generate script for Autofill
extension use --autofill
option. This approach allows you to forget about captcha.
$ python grab_me.py --autofill