Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
55b6aa9
fix: update author name
lifefloating Apr 16, 2026
ec814b7
feat: implement Scrapling-based TDC executor and enhance logging for …
lifefloating Apr 17, 2026
6db9a1f
docs: spec for captcha type router + image_select pipeline
lifefloating Apr 17, 2026
c4fe981
docs: tighten classifier rules after reviewing flashTCaptcha harvest
lifefloating Apr 17, 2026
4d05f40
docs: implementation plan for captcha type router + image_select
lifefloating Apr 18, 2026
00d708d
feat(settings): migrate base_url to turing.captcha.qcloud.com and add…
lifefloating Apr 18, 2026
cdf513a
feat(exceptions): add UnsupportedCaptchaType
lifefloating Apr 18, 2026
148cfb0
feat(captcha_type): add pure-function classifier with 4 rules
lifefloating Apr 18, 2026
878892d
feat(client): use runtime settings.base_url, add empty-body guard, up…
lifefloating Apr 18, 2026
afd42bc
feat(pipelines): add package scaffold with _common helpers
lifefloating Apr 18, 2026
bb8b084
refactor(pipelines): type-annotate trajectory and add TDC debug log
lifefloating Apr 18, 2026
7ca0600
feat(pipelines): port slide solver to pipelines/slide.py
lifefloating Apr 18, 2026
06e8c15
feat(pipelines): port icon_click legacy path; move _legacy_solver → _…
lifefloating Apr 18, 2026
0710d68
feat(solvers): add GPT-5.4 vision client for image_select
lifefloating Apr 18, 2026
59eeb13
feat(pipelines): add image_select and wire dispatch registry
lifefloating Apr 18, 2026
d2d1e0a
feat(cli): auto-route via pipelines.dispatch; drop --type flag
lifefloating Apr 18, 2026
6ed8803
refactor: delete legacy slider/ and icon_click/ packages
lifefloating Apr 18, 2026
8e8cb5a
test: update imports after pipelines/ migration; skip tests tied to r…
lifefloating Apr 18, 2026
2c84589
fix(pipelines/slide): restore masked NCC algorithm from original solver
lifefloating Apr 18, 2026
77f120a
fix(settings,client): prehandle must use t.captcha.qq.com; turing onl…
lifefloating Apr 18, 2026
86ea2e4
fix(client): revert image referer to captcha.gtimg.com (CDN requirement)
lifefloating Apr 18, 2026
6b9edbd
fix(settings,client): unify all endpoints on t.captcha.qq.com
lifefloating Apr 18, 2026
9001f75
feat: Implement TDC.js integration with event dispatching and traject…
lifefloating Apr 18, 2026
b7a9caa
feat: Add word-click pipeline and integrate with existing captcha types
lifefloating Apr 20, 2026
ee19eb1
feat: Enhance TCaptchaClient with entry_url for Referer/Origin header…
lifefloating Apr 20, 2026
fc5b9d7
- Removed the outdated captcha type router design document and the js…
lifefloating Apr 20, 2026
e514a18
feat: Update README with detailed features and installation instructi…
lifefloating Apr 20, 2026
de9476b
feat: Add unit tests for pipelines: common, icon click, image select,…
lifefloating Apr 20, 2026
a0be255
Add comprehensive documentation for TCaptcha solver and update naviga…
lifefloating Apr 20, 2026
f1acef9
feat: Add GitHub Actions workflows for Python environment setup, lint…
lifefloating Apr 20, 2026
6de67eb
feat: add uv.lock
lifefloating Apr 20, 2026
923d42b
refactor: improve code formatting and organization across multiple files
lifefloating Apr 20, 2026
6a54997
feat: add all dependency
lifefloating Apr 20, 2026
3e6c48f
docs: update installation instructions
lifefloating Apr 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Copy to .env and fill in. .env is gitignored.
TCAPTCHA_BASE_URL=https://t.captcha.qq.com
TCAPTCHA_LLM_API_KEY=sk-your-relay-key-here
TCAPTCHA_LLM_BASE_URL=https://your-relay.example.com
TCAPTCHA_LLM_MODEL=gpt-5.4
TCAPTCHA_LLM_TIMEOUT=30
40 changes: 40 additions & 0 deletions .github/actions/setup-python-env/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: "Setup Python Environment"
description: "Set up Python + uv and sync project dependencies"

inputs:
python-version:
description: "Python version to use"
required: true
default: "3.12"
uv-version:
description: "uv version to use"
required: true
default: "0.5.11"
extras:
description: "Comma-separated extras to install (e.g. 'dev,icon-click')"
required: false
default: "dev"

runs:
using: "composite"
steps:
- uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python-version }}

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
version: ${{ inputs.uv-version }}
enable-cache: 'true'
cache-suffix: ${{ inputs.python-version }}

- name: Install Python dependencies
shell: bash
run: |
EXTRA_FLAGS=""
IFS=',' read -ra EXTRAS <<< "${{ inputs.extras }}"
for e in "${EXTRAS[@]}"; do
[ -n "$e" ] && EXTRA_FLAGS="$EXTRA_FLAGS --extra $e"
done
uv sync --frozen $EXTRA_FLAGS
64 changes: 64 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Main

on:
push:
branches: [main]
pull_request:
types: [opened, synchronize, reopened, ready_for_review]

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up the environment
uses: ./.github/actions/setup-python-env

- name: Ruff lint
run: uv run ruff check .

- name: Ruff format check
run: uv run ruff format --check .

tests:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
fail-fast: false
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4

- name: Set up the environment
uses: ./.github/actions/setup-python-env
with:
python-version: ${{ matrix.python-version }}
extras: "dev,icon-click"

- name: Run tests (skip network)
run: uv run pytest tests -m "not network"

build-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up the environment
uses: ./.github/actions/setup-python-env

- name: Build sdist + wheel
run: uv build

- name: Check distribution metadata
run: |
uv run --with twine twine check dist/*

- uses: actions/upload-artifact@v4
with:
name: dist-${{ github.sha }}
path: dist/
retention-days: 7
80 changes: 80 additions & 0 deletions .github/workflows/on-release-main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: release-main

on:
release:
types: [published]

jobs:
set-version:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4

- name: Export tag
id: vars
# Strip leading "v" if present (so v1.2.3 -> 1.2.3)
run: |
TAG=${GITHUB_REF#refs/tags/}
TAG=${TAG#v}
echo "tag=$TAG" >> $GITHUB_OUTPUT

- name: Update project version in pyproject.toml
env:
RELEASE_VERSION: ${{ steps.vars.outputs.tag }}
run: |
sed -i "s/^version = \".*\"/version = \"$RELEASE_VERSION\"/" pyproject.toml
grep '^version' pyproject.toml

- name: Upload updated pyproject.toml
uses: actions/upload-artifact@v4
with:
name: pyproject-toml
path: pyproject.toml

publish:
runs-on: ubuntu-latest
needs: [set-version]
# Trusted Publishing via OIDC — no PyPI token needed.
permissions:
id-token: write
contents: read
environment:
name: pypi
url: https://pypi.org/p/crack-tcaptcha
steps:
- uses: actions/checkout@v4

- name: Set up the environment
uses: ./.github/actions/setup-python-env

- name: Download updated pyproject.toml
uses: actions/download-artifact@v4
with:
name: pyproject-toml

- name: Build package
run: uv build

- name: Verify dist
run: uv run --with twine twine check dist/*

- name: Publish to PyPI
run: uv publish --trusted-publishing always

deploy-docs:
needs: publish
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up the environment
uses: ./.github/actions/setup-python-env
with:
extras: "dev,docs"

- name: Deploy MkDocs to gh-pages
run: uv run mkdocs gh-deploy --force
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ node_modules
site
*.so
*.whl
uv.lock
.env
*.onnx
origin_papers/
Loading
Loading