captchaforge 0.2.34

Automatic CAPTCHA detection and multi-strategy solving for chromiumoxide-driven headless browsers (Cloudflare Turnstile, reCAPTCHA v2/v3, hCaptcha, image grids, audio, sliders).
Documentation
�

�4j���\�dZddlZddlZddlZddlZddlZddlmZee�j�jZedzZejjZ
dededzfd�Zdededzfd�Zd	ededzfd
�Zdeded
edefd�Zdedefd�Zd�Zedk(rej.e��yy)uspcap2fixture: convert a captured HTTP exchange into a captchaforge
bench fixture OR adversarial_replay::AdversarialCapture JSON.

Usage:
  python3 tools/pcap2fixture/convert.py [--out-mode bench|adversarial]

Reads every file in `incoming/`, dispatches by extension:
  .har  → HAR v1.2 parser
  .txt  → curl --trace-ascii parser
  .pcap → scapy parser (requires `pip install scapy` + TLS keys)

Emits files into `bench/src/fixtures.rs` (bench mode) or
`adversarial-corpus/<vendor>/<id>.json` (adversarial mode).

Stub for now — protocol locked so the implementation can land
incrementally without disrupting consumers.
�N)�Path�incoming�path�returnc	���tj|j��}|jdi�jdg�D]�}|jdi�jdd��t	�fd�dD��s�:|jdi�}|jd	i�}|jd
d�}�|jdd�|jd
g�D�cic]}|dj�|d��c}|d�cSycc}w)z?Extract the first interesting captcha response from a HAR file.�log�entries�request�url�c3�&�K�|]}|�v���
y�w)N�)�.0�srs  ��W/media/mukund-thiru/SanthData/Santh/software/captchaforge/tools/pcap2fixture/convert.py�	<genexpr>zparse_har.<locals>.<genexpr>%s�����h�A�q�C�x�h�s�)�	turnstile�	recaptcha�hcaptcha�/cdn-cgi/challenge-platform/�response�content�text�statusr�headers�name�value�rrr�bodyN)�json�loads�	read_text�get�any�lower)r�har�entry�resprr�hrs       @r�	parse_harr* s����
�*�*�T�^�^�%�
&�C������#�'�'�	�2�6����i�i�	�2�&�*�*�5�"�5���h�!g�h�h��9�9�Z��,�D��h�h�y�"�-�G��;�;�v�r�*�D���(�(�8�Q�/�CG�8�8�I�WY�CZ�[�a�A�f�I�O�O�-�q��z�9�[��	�
�
���\s�D
c��|j�}d|vryg}|j�D]I}|jd�s�|jdd�}t	|�dkDs�6|j|d��Kdj
|�}|syddi|d	�S)
z>Minimal curl --trace-ascii parser. Returns the first response.z<= Recv dataNz0000:z  �r�unknownrr)r"�
splitlines�
startswith�split�len�append�join)rr�body_chunks�line�
ascii_partrs      r�parse_curl_tracer72s����>�>��D��T�!���K����!�2���?�?�7�#����D�!�,�J��:���"��"�"�:�a�=�1�2��7�7�;��D�������	���_pathc�:�tdtj��y)NzO[pcap2fixture] PCAP parsing not yet implemented; use HAR or curl --trace-ascii.)�file)�print�sys�stderr)r9s r�
parse_pcapr?Js��	�+�14���=�r8�captured�vendor�out_rootc���|dxsd}tj|jdd��j�dd}|||j	dd�|j	di�|gd	d
|j	dd���tt
j��d
�	}||z}|jdd��||�d�z}|jtj|d���|S)Nrrzutf-8�replace�rrr�
recognisedzpcap2fixture import from rr-)	�idrArrr�cookie_names�expected�notes�captured_at_unixT��parents�exist_okz.json�)�indent)�hashlib�sha256�encode�	hexdigestr#�int�time�mkdir�
write_textr �dumps)r@rArBr�cid�payload�dest_dir�dests        r�to_adversarialr^Ps����F��!�r�D�
�.�.����W�i�8�
9�
C�
C�
E�c�r�
J�C����,�,�x��+��<�<�	�2�.��� �,�X�\�\�%��-K�,L�M���	�	��,�
�G��&� �H��N�N�4�$�N�/����U�m�#�D��O�O�D�J�J�w�q�1�2��Kr8c���|jdd�j�}|jd�xsdj�}d|vsd|vryd|vryd	|vsd
|vry	d|vsd|vry
y)Nrrrrzcf-turnstilezcloudflare-turnstilerzcloudflare-interstitialrz	h-captcharzg-recaptchazrecaptcha-v2r-)r#r%)r@rrs   r�infer_vendorr`es{��
�,�,�u�b�
!�
'�
'�
)�C��L�L�� �&�B�-�-�/�D��c��^�t�3�%�%��,�(��S��K�4�/���c��]�d�2��r8c	�v�tj�}|jdddgd��|j�}tj�s+tj
dd��tdt�d��y	ttj��}|std
t�d��y	tdz}d	}|D]�}|jd
k(rt|�}nP|jdk(rt|�}n5|jdk(rt|�}ntd|j�d���n|std|j�����t!|�}|j"dk(rAt%|||�}td
|j�d|j't����|dz
}��td���td
|�d��y	)Nz
--out-mode�bench�adversarial)�choices�defaultTrLz[pcap2fixture] created u — drop captures in and rerunrz[pcap2fixture] z	 is emptyzadversarial-corpusz.harz.txtz.pcapz[pcap2fixture] skipping z (unknown extension)z.[pcap2fixture] no challenge response found in u → r,zM[pcap2fixture] bench-mode emission not yet implemented (use adversarial mode)z capture(s) imported)�argparse�ArgumentParser�add_argument�
parse_args�INCOMING�is_dirrWr<�sorted�iterdir�	ROOT_REPO�suffixr*r7r?rr`�out_moder^�relative_to)	�parser�args�filesrB�countrr@rAr]s	         r�mainrvss���
�
$�
$�
&�F�
�����-�(����
����D��?�?�����t�d��3�
�'��z�1P�Q�R���8�#�#�%�&�E��
���z��3�4���/�/�H�
�E��,���;�;�&� � ���H�
�[�[�F�
"�'��-�H�
�[�[�G�
#�!�$�'�H��,�T�Y�Y�K�7K�L�M����B�4�9�9�+�N�O���h�'���=�=�M�)�!�(�F�H�=�D��O�D�I�I�;�e�D�4D�4D�Y�4O�3P�Q�R��Q�J�E��+�
,�',�*
�O�E�7�"6�
7�8�r8�__main__)�__doc__rfrQr r=rV�pathlibr�__file__�resolve�parent�ROOTrjrn�dictr*r7r?�strr^r`rv�__name__�exitrr8r�<module>r�s����$���
����H�~����&�&���*����K�K���	��D��T�D�[��$�4��D�4�K��0�d��t�d�{���T��3��$��4��*�4��C��+
�\�z���C�H�H�T�V��r8