Stop claiming Medium's managed challenge cannot be solved (§19) - #3
Merged
Merged
Conversation
v0.1.0's README said of the two refusal pages: "Neither is solvable ...
there is nothing to hand a captcha solver." That is true of the WAF
refusal, which carries no widget, and false of the managed challenge.
Cloudflare calls `turnstile.render(container, params)` once and keeps
nothing, so `sitekey`, `action`, `cData` and `chlPageData` exist only
inside that call and no static read of the HTML -- however careful --
can build a solvable task. The measurement in the README ("0 data-sitekey
attributes, 0 iframes") was therefore evidence about the markup being
read as evidence about the product. The parameters can be captured with
an init script installed before any page script runs, and 2Captcha solves
what comes out as TurnstileTaskProxyless; foodpanda-scraper in this
family does exactly that.
No measurement changed. Only the conclusion did, from "not solvable" to
"not implemented here" -- which is a TODO rather than a limitation, and
is the only sentence this family is entitled to. The reason it is not
implemented is also now stated and is measured: the challenge here is
transient, 9 of 27 first attempts met it and a fresh context cleared all
9, so a retry costs nothing where a solve costs money.
Also:
* the reCAPTCHA Enterprise paragraph now says this repo does not
implement RecaptchaV2EnterpriseTaskProxyless, rather than leaving the
reader to infer nothing could be done;
* test_challenge_is_not_solvable is renamed
test_a_challenge_is_never_paid_for_here -- its assertions were always
right, its name asserted something it never measured;
* test_captcha_capability_claims_match_the_code is added, guarding both
directions: a documented "cannot be solved", and a README claiming a
Turnstile solve with no task type or no interception hook behind it.
Verified by control -- reverting the README sentence turns it red.
Not changed: the policy. A managed challenge is still never solved here,
still retried in a fresh context, and still counted as blocked if the
retries run out. Nothing is charged for a block.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.1.0's README said of the two refusal pages: "Neither is solvable ...
there is nothing to hand a captcha solver." That is true of the WAF
refusal, which carries no widget, and false of the managed challenge.
Cloudflare calls
turnstile.render(container, params)once and keepsnothing, so
sitekey,action,cDataandchlPageDataexist onlyinside that call and no static read of the HTML -- however careful --
can build a solvable task. The measurement in the README ("0 data-sitekey
attributes, 0 iframes") was therefore evidence about the markup being
read as evidence about the product. The parameters can be captured with
an init script installed before any page script runs, and 2Captcha solves
what comes out as TurnstileTaskProxyless; foodpanda-scraper in this
family does exactly that.
No measurement changed. Only the conclusion did, from "not solvable" to
"not implemented here" -- which is a TODO rather than a limitation, and
is the only sentence this family is entitled to. The reason it is not
implemented is also now stated and is measured: the challenge here is
transient, 9 of 27 first attempts met it and a fresh context cleared all
9, so a retry costs nothing where a solve costs money.
Also:
implement RecaptchaV2EnterpriseTaskProxyless, rather than leaving the
reader to infer nothing could be done;
test_a_challenge_is_never_paid_for_here -- its assertions were always
right, its name asserted something it never measured;
directions: a documented "cannot be solved", and a README claiming a
Turnstile solve with no task type or no interception hook behind it.
Verified by control -- reverting the README sentence turns it red.
Not changed: the policy. A managed challenge is still never solved here,
still retried in a fresh context, and still counted as blocked if the
retries run out. Nothing is charged for a block.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
🤖 Generated with Claude Code