рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд▓рдЧрдЗрди рд╣реИ,
рдПрдХреНрд╕-рдиреЛрдЯрд┐рдлрд╝рд╛рдпрд░ ред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдирдП рдкрддреНрд░, рд╕рдВрджреЗрд╢, рдФрд░ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред X-Notifier (Gmail, Yandex.Mail, Google+, Facebook, Twitter рдФрд░ рдЕрдиреНрдп) рдХреЗ рд▓рд┐рдП
рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА
рдЧрдИ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдиреЗ рднреА рд╣реЗрдмреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдЯрдХрдерд╛ рдирд╣реАрдВ рд▓рд┐рдЦреА рд╣реИ, рдпрд╣ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕реА рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдРрдб-рдСрди рдореМрдЬреВрдж рд╣реИред рд╣реИрдмрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдФрд░ Google рдХреНрд░реЛрдо рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╛рдж рдореЗрдВ рдпрд╣
рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛
рд╣реИ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рддреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд▓реЗрдЦ рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ,
рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ
рд▓рд┐рдВрдХ ред
рд▓рдХреНрд╖реНрдп рдЕрдзреНрдпрдпрди
рдпрджрд┐ рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рддрд╣реА рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдХреБрдХреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдПрдХ рдЕрдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдФрд░ рдкрд╛рд░реНрд╕ рдЯреНрд░реИрдХрд░ рдФрд░ рдбрд╛рдпрд▓реЙрдЧ рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ!
рдкреГрд╖реНрда
https://id.tmtm.ru/login/ (рд╣рдЯрд╛рдП рдЧрдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг) рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдЖрдХрд╛рд░<form novalidate="" data-remote="true" method="post" id="login_form" class="s-form login_form validateble" action="/ajax/login/"> <input type="hidden" value="180351c318af67fa0ec59ecad9ebae72" name="state"> <input type="hidden" value="habrahabr" name="consumer"> <div class="s-field s-with-error"> <input type="email" data-validate_url="/ajax/validate/email/" id="email_field" tabindex="1" autofocus="" data-required="true" name="email" placeholder="E-mail" value=""> </div> <div class="s-field s-with-error"> <input type="password" tabindex="2" name="password" data-required="true" placeholder="" value=""> </div> <div class="s-field"> <input type="hidden" name="captcha"> <input type="hidden" id="recaptcha_challenge_field" name="recaptcha_challenge_field"> <input type="text" name="recaptcha_response_field" id="recaptcha_response_field" data-required="true" placeholder=" " value="" autocomplete="off" tabindex="3"> <div class="icon_captcha"></div> <script src="//www.google.com/recaptcha/api/challenge?k=6LftHuoSAAAAAORONRXn_6xb2f_QCtXqfbRPfY2e" type="text/javascript"> </script> <input type="hidden" value="recaptcha" name="captcha_type"> </div> </form>
рдпрд╣рд╛рдВ рд╣рдо рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП 3 рджреГрд╢реНрдпрдорд╛рди рдлрд╝реАрд▓реНрдб (рдИрдореЗрд▓, рдкрд╛рд╕рд╡рд░реНрдб, recaptcha_response_field) рджреЗрдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдФрд░ 5 рдЫрд┐рдкреЗ рд╣реБрдП рднреА (рд░рд╛рдЬреНрдп, рдЙрдкрднреЛрдХреНрддрд╛, рдХреИрдкреНрдЪрд╛, recaptcha_challenge_field, captcha_type)ред
state
рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ,
consumer
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рдореВрд▓реНрдп рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛
captcha_type
рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛
captcha_type
,
captcha
рдореВрд▓реНрдп рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд╣реЛрддрд╛ рд╣реИ,
recaptcha_challenge_field
рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреИрдкреНрдЪрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ,
captcha_type
рд╣рдореЗрд╢рд╛
captcha_type
рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЕрдм рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреИрдирд▓ рд╣реИред
рдкреИрдирд▓ <div class="userpanel silver"> <div class="bottom"> <a href="http://habrahabr.ru/tracker/"></a> <a class="count" href="http://habrahabr.ru/tracker/">+2</a> <a href="http://habrahabr.ru/conversations/"></a> <a href="http://habrahabr.ru/users/BloodUnit/favorites/"></a> </div> </div>
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрдВ рдмрд╕ рдирд┐рдпрдорд┐рдд рд╕реАрдЬрди рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдЯреНрд░реИрдХрд░ рдФрд░ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкрдХрдбрд╝реЛ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред
рдЖрдЗрдП рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред
рдПрдкреАрдЖрдИ
рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдПрдкреАрдЖрдИ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдкрд╛рдИ рдЧрдИ, рд╡рд╣ рдереА рдХрд┐ рд▓реЙрдЧ рдХреЛ рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдРрдб-рдСрди рдбреЗрд╡рд▓рдкрд░ рдХреА рдПрдХ
рдЫреЛрдЯреА рд╕реА рдкреЛрд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ
рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ
рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдерд╛ ...
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХреБрд▓ рдореЗрдВ, рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ 5 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- init () - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрд░рдВрднреАрдХрд░рдг рд╡рд┐рдзрд┐, рдПрдХ рдмрд╛рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЪрд▓рд╛рдПрдВ
- getCount (aData) - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЖрдорддреМрд░ рдкрд░ HTML) рд▓реЗрддреА рд╣реИ, рдФрд░ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд▓реМрдЯрд╛рддреА рд╣реИред рдпрджрд┐ рдХрд╛рдЙрдВрдЯрд░> = 0, рд╕рддреНрдпрд╛рдкрди рд╕рдлрд▓ рд░рд╣рд╛, рдЕрдиреНрдпрдерд╛ рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛
- checkLogin (aData, aHttp) - рд▓реЙрдЧрд┐рди рд╕реНрдерд┐рддрд┐, aData рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЖрдорддреМрд░ рдкрд░ HTML), aHttp XMLHttpRequest рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ
- рдкреНрд░рдХреНрд░рд┐рдпрд╛ (aata, aHttp) - рд╡рд┐рдзрд┐ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг (рд╕реВрдЪреА рдиреАрдЪреЗ рд╣реИ) рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, aata рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдЖрдорддреМрд░ рдкрд░ HTML) рд╣реИ, aHttp рдПрдХ XMLHttpRequest рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ
- dlog (рдирд╛рдо, рдбреЗрдЯрд╛) - рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐, рджреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ
рдЪрд░рдгреЛрдВ рдХреА рд╕реВрдЪреА, рд╕рдВрдЦреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ:
- ST_CHECK = 0 - рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЬрд╛рдБрдЪ
- ST_PRE = 100 - рд▓реЙрдЧрд┐рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░реА
- ST_PRE_RES = 101 - рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- ST_LOGIN = 200 - рд▓реЙрдЧрд┐рди
- ST_LOGIN_RES = 201 - рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ
- ST_DATA = 300 - рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдард┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЧрд┐рдирддреА
- ST_DATA_RES = 301 - рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдЕрдиреБрд░реЛрдз рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдХреБрдЫ рдЪрд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ ST_LOGIN, рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдо рдХрд░реЗрдВрдЧреЗред
рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рд╣рдо рдХреБрдЫ рд╕реНрдЯреИрдЯрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд╣ рдЪрд░рдг рдЬрд┐рд╕рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда function init() { this.initStage = ST_PRE;
рдЕрдЧрд▓рд╛ рдЪрд░рдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реИ, рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда function process(aData, aHttp) { switch (this.stage) { case ST_PRE: this.getHtml("https://auth.habrahabr.ru/login/"); return false; case ST_PRE_RES: var recaptchaScriptLink = aData.match(/(\/\/www.google.com\/recaptcha\/api\/challenge\S+?)"/); var state = aData.match(/state=([\w\n]+)/); if (recaptchaScriptLink && state) { this.originPostData = this.loginData[LOGIN_POST]; this.loginData[LOGIN_POST] += "&state=" + encodeURIComponent(state[1]); this.referer = this.loginData[LOGIN_URL] + "?" + "&state=" + encodeURIComponent(state[1]) + "&consumer=habrahabr"; this.getHtml("https:" + recaptchaScriptLink[1]); return false; } this.onError(); break; case ST_PRE_RES + 1: var recaptchaUid = aData.match(/challenge\s*:\s*'(\S+?)'/); if (recaptchaUid) { this.loginData[LOGIN_POST] += "&recaptcha_challenge_field=" + encodeURIComponent(recaptchaUid[1]); this.openCaptchaDialog(this.id, this.user, "https://www.google.com/recaptcha/api/image?c=" + recaptchaUid[1]); return false; } this.onError(); break; case ST_PRE_RES + 2: this.loginData[LOGIN_POST] += "&recaptcha_response_field=" + encodeURIComponent(aData); this.stage = ST_LOGIN; return this.process(aData, aHttp); break; case ST_LOGIN: this.getHtml(this.loginData[LOGIN_URL], this.loginData[LOGIN_POST], { Referer: this.referer }); return false; case ST_LOGIN_RES: this.loginData[LOGIN_POST] = this.originPostData; var habrRedirectLink = aData.match(/'(.*?)'/); if (habrRedirectLink) { this.getHtml(habrRedirectLink[1]); } this.stage = ST_DATA; return true; } return this.baseProcess(aData, aHttp); }
рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВред
- рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд▓рдЧрдЗрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреИрдкреНрдЪрд╛ рдХрд╛ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
- рдпрджрд┐ рдЪрд░рдг
false
, рддреЛ рдЕрдиреБрдХреНрд░рдо рдорд╛рди рдмрдврд╝ рдЬрд╛рдПрдЧрд╛ред - рдбреЗрдЯрд╛ рдЬреЛ рдпрд╣
this.getHtml
рдФрд░ рдЗрд╕ this.openCaptchaDialog
рддрд░реАрдХреЗ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ST_LOGIN
, рд╣рдореЗрдВ Referer рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред Google Chrome рдЖрдкрдХреЛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рдорд╛рдирдХ рд╣реИ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд░реНрдХрд┐рдВрдЧ рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ), рдХреНрд░рдорд╢рдГ, рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЗрд╕рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕рд╛рдЗрдЯ рдореЗрдВ рд▓реЙрдЧ рдЗрди рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓реЗрдЧрд╛!ST_LOGIN
рд╕реНрдЯреЗрдЬ рдкрд░, Habr рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдореБрдЦреНрдп рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда window.location.href = 'https://habrahabr.ru/ac/entrance/?token=5a15a5d48c7fdeaed5ab20e852107dc6&state=26593fdea0963d8241aab3f20a6893b4&time=1390388377&sign=bb8f45d63c768ed6aebc5ae2bb22de3b';
рд▓реЙрдЧрд┐рди рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда function checkLogin(aData, aHttp) { switch (this.stage) { case ST_CHECK: this.getHtml(this.dataURL); return false; case ST_CHECK + 1: var loginLink = aData.match(/<a.+?class="login"/); if (!loginLink) { this.stage = ST_DATA; this.getHtml(this.dataURL); return true; } else { this.stage = this.initStage; return this.process(""); } } this.onError(); return true; }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда function getCount(aData) { var userMenu = aData.match(/userpanel[\s\S]*?charge_string/); if (!userMenu) { return -1; } else { var counter = 0; var counterRegex = /class="count"[^>]*>\+?(\d*)/g var counterResult; while ((counterResult = counterRegex.exec(userMenu[0])) !== null) { counter += +counterResult[1] || 0; } return counter; } }
рдпрд╣рд╛рдВ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдирд┐рдпрдорд┐рдд рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╕рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпреЛрдЬрдирд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреИрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯред 30 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ)ред
Habr рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ X-Notifier рдХреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЗрдЬ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрд╛ GitHub рдкрд░ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред рдХрд╛рдВрдЯреЗ рдФрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдРрдб-рдСрди рдкреЗрдЬ ред