I.åé¡ã¯äœã§ãã
ãã©ãŠã¶ãŒã®æ¡åŒµæ©èœ- é«åºŠãªWebãµãŒãã£ã³ã®ããã®åŒ·åãªããŒã«ã§ãããå€ãã®ããŒã«ã®äžã§æãã¢ã¯ã»ã¹ãããããéçºãããæ®åããŠããéšåã§ãã ãã ããæ¡åŒµæ©èœã«ã¯åŒ±ç¹ããããŸããåãã©ãŠã¶ã«ã¯ç¬èªã®ã«ãŒã«ãšåœ¢åŒã®ç¥èãšã¢ããªã±ãŒã·ã§ã³ãå¿ èŠã§ãããããã¯äœæè ã«ãšã£ãŠã¯ããã«è€éãªããšã§ãã æ¡åŒµæ©èœã¯ã¯ãã¹ãã©ãŠã¶ã§ã¯ãªããããå®å ãããã«å¶éãããŸãã æ¡åŒµæ©èœã®äœæãäžè¬åããè©Šã¿ããããŸãããæ¢ã«ç¬èªã®ãã©ãŒããããšã«ãŒã«ã®ã¬ã€ã€ãŒãè¿œå ã§ããŸãã
æ¡åŒµæ©èœããã©ãŠã¶ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¹å®ã®åŽé¢ãæ¹åããå Žåãæ¡åŒµæ©èœãªãã§ã¯å®è¡ã§ããŸããã ãã ããäžéšã®ã¿ã¹ã¯ã¯æ®éçã§ããããã©ãŠã¶ã®ãã©ã€ããŒããªæ段ãšã¯æ¥ç¶ãããŠããŸããããæ¡åŒµãªãã§ã¯å®è¡ã§ããŸããã ãã®ãããªã¿ã¹ã¯ã®1ã€ã¯ãåäžãœãŒã¹ã®ããªã·ãŒã«éåããã¯ãã¹ãã¡ã€ã³
XMLHttpRequest
èŠæ±ã§ãã
IIã 解決ããããšããç§çãªè©Šã¿
ãã®å Žåã«åœ¹ç«ã€æ¡åŒµæ©èœã®ã¿ã€ãããããããã«å€ãã®æ¡åŒµæ©èœããããŸã-ä»ã®å€ãã®æ¡åŒµæ©èœã®å¿ èŠæ§ãæé€ããããã«èšèšãããŠããŸãã ãããã¯æåãªGreasemonkeyãšTampermonkeyã§ãïŒåçŽãªJavaScriptã³ãŒãã䜿çšããŠå€ãã®åé¡ã解決ããåæã«ãŠãŒã¶ãŒãã¬ãŒãã³ã°ã«é¢ä¿ãªããäžè¬çãªãœãŒã¹ãããã®ãããªã¹ã¯ãªãããè¿ éã«ã€ã³ã¹ããŒã«ããããã®å€ãã®è£å©ã¡ãœãããäœæã§ããŸãã ãã ãããã©ãŠã¶éã®äºææ§ãšäœæãšäœ¿çšã®å®¹æãã®åé¡ãå®å šã«è§£æ±ºããããã§ã¯ãããŸããã ããã«ãæã匷åãªããŒã«ã®1ã€ã§ãã
GM_xmlhttpRequest
ã®æ©èœã®èª¬æã¯ããã¹ãŠã®æ°ããæšæºãå®è£ ãããŠããªãããšã瀺åããŠããŸãïŒç¹ã«responseText以å€ã®äœããã®å¿çãååŸã§ãããã©ãããç解ããããšã¯å°é£ã§ã-DOMãšããŠå©çšå¯èœãªããã¥ã¡ã³ãã§ã-ããªãŒïŒã
çæ³çã«ã¯ããã¹ãŠã®ãã©ãŠã¶ãŒã§åäœããçŽç²ãªJavaScriptã欲ããã§ãã ããã¯ããŒã¯ã¬ãããŸãã¯ã¹ã¯ãªããã䜿çšããããŒã«ã«HTMLããŒãžã§ãããè¡ãæ¹æ³ã ãã ããçŸåšã®ããŒãžãšããŒã«ã«ãã¡ã€ã«ã®ã³ã³ããã¹ãã§æ©èœããããã¯ããŒã¯ã¬ããã¯ãã¯ãã¹ãã¡ã€ã³ã®
XMLHttpRequest
èŠæ±ãäœæã§ããŸããã
ããã§ã CORSãã¯ãããžãŒã圹ç«ã¡ãŸãã ããèªäœã§ã¯ãããŸããïŒãã®ååèªäœã¯ããŠãŒã¶ãŒããã®ã¡ã«ããºã ã«åœ±é¿ãäžããããšãèš±å¯ãããããŒã¿äº€æããµãŒããŒãšãã©ãŠã¶ã®åã«å®å šã«è»¢éããŸãã ãã ããããã2ã€ã®èŠçŽ ã®éä¿¡ã«ä»å ¥ãããŠãŒã¶ãŒã®ããŒãºã«åãããŠèª¿æŽããã¡ã«ããºã ããããŸãã
ãããã®äžéšã¯ããã©ãŠã¶ãŒæ¡åŒµæ©èœïŒhmmïŒã®åœ¢åŒã§åã³å®è£ ãããŸãã
Firefoxã«ã¯ãHTTPããããŒãå³åº§ã«ç·šéããããã®çŽ æŽãããããŒã«moz-rewriteããããŸãã ãã®æãæ©èœçãªäºçš®ã¯Rewrite HTTP HeadersïŒJSïŒã§ãã ãã®æ¡åŒµæ©èœã¯ãããŸããŸãªæ¡ä»¶ã«å¿ããŠããããŒã®ç·šéãé©åã«å¶åŸ¡ããå€æ°ã䜿çšããŠJavaScriptèªäœã«ã«ãŒã«ãèšè¿°ããæ¢ã«åä¿¡ããããããŒã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
Google Chromeã«ã¯Requestlyã®ãããªæ©èœæ§ã®äœãæ¡åŒµæ©èœãå€æ°ãããŸãããããã®æ©èœã¯æ§ããã§ãããããŒãºã«ã¯ããŸãé©ããŠããŸããã
IEã¯ããã§é©åãªãã®ãåŸãŠããªãããã§ãã
IIIã ã¯ã³ã¹ããããœãªã¥ãŒã·ã§ã³ã
äžè¬ã«ãåã³åãåé¡ã«åãçµã¿ãŸããããã©ãŠã¶éã®äºææ§ãšã·ã³ãã«ããæãªãããŸãã ãã©ãŠã¶ã®è©³çŽ°ã«äŸåããªãããŒã«ãå¿ èŠã§ããããã§ã¯ãããŒã«ã«ãããã·ãµãŒããŒãæãæµ®ãã³ãŸãã 幞ããªããšã«ãéåžžã«ã·ã³ãã«ã§è»œéãªãœãªã¥ãŒã·ã§ã³ããããŸããè¿ éã«ã€ã³ã¹ããŒã«ã§ããã»ãšãã©æ§æããå¿ èŠããªãããã¹ãŠã®äž»èŠãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«æ¢ã«å®è£ ãããŠããŸãã ããã¯ãã£ãã©ãŒã§ãã
ã»ãšãã©ã®å ŽåããŠãŒã¶ãŒåŽã§HTTPãã©ãã£ãã¯ã調æ»ããããã«äœ¿çšãããŸãã ãã ããããã°ã©ã ã¯HTTPããããŒããã®å Žã§ç·šéããå¿çæ¬æãå€æŽããããšãã§ããŸããããã«ãããååãšããŠã GreasemonkeyãStylishãªã©ã®ã«ã¹ã¿ã ã¹ã¯ãªãããã¹ã¿ã€ã«ã®æ¡åŒµæ©èœã眮ãæããããšãã§ããŸãïŒIEãŠãŒã¶ãŒã¯ããã®ãããªããŒã«ã®ãã¯ãŒãåããŠè©Šãããšãã§ããŸãïŒ -ãã ããããã§ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã¡ãåŽã«ã€ããŠã¯èšè¿°ãããããããŒã®ã€ã³ã¿ãŒã»ãããšç·šéã®ã¿ã«çŠç¹ãåœãŠãŸãã
ããããããã°ã©ã ãããŠã³ããŒãããŠãã ãã ã ãã©ãã£ãã¯ãååããã³å€æŽããããã®ã«ãŒã«ããã䟿å©ã«ç·šéããããã«ãããã«æ¡åŒµåãè¿œå ããããšããå§ãããŸãïŒããŒã...ïŒã ãµã€ãã«ã¯å°ãªããšã2ã€ã®ååãš2ã€ã®çæ¯å°ããããŸãã
FiddlerScriptãšãã£ã¿ãŒ
æ§æ匷調衚瀺ã¢ããªã³
ãšããããFiddlerã®ãã¹ãŠã®çµã¿èŸŒã¿ããããã£ãšã¡ãœããã®é©åãªåç §ãããã°ã©ã ã«çŽæ¥è¿œå ãããŸããããã¯ãèšå€§ãªéã®ããã¥ã¡ã³ãã§ããã¹ãŠã®å¯ã«ã€ããŠèšåããŠããªãããã§ãã
æããå¿ èŠã¯ãããŸãããFiddlerã¯åºæ¬çã«åãJavaScriptã§ããéåžžã«æšæºçãªJScript.NETã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®è¿œå ã®ãªããžã§ã¯ããããããã£ãããã³ã¡ãœãããç¥ãããšã¯ãåã
XMLHttpRequest
ãŸãã¯DOMèŠçŽ ã®ããããã£ã®ãããª1ã€ã®å°ããªã€ã³ã¿ãŒãã§ã€ã¹ãåŠç¿ããããšãšåãã§ãã èè ããç°¡åãªçŽ¹ä»ããããŸãã
IVã ã¯ã€ãã¯ã¹ã¿ãŒã
ããŒã«ãå®å šã«å¶åŸ¡ããã人ã¯ãããã¥ã¡ã³ããèªãã§çµã¿èŸŒã¿ã®ãªãã¡ã¬ã³ã¹ã調ã¹ãïŒãŸãã¯ããã°ã©ã ã®äœæè ãæžããæ¬ãèªãïŒã®ã«æ°æéè²»ããããšãã§ããŸããããã®å Žåã®åçãªãã·ã§ã³ãäœæããããšããŸãïŒããã¯ããŒã¯ã¬ãããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã«ïŒãŸãã¯ãã¹ããããïŒãããã¯ãŒã¯äžã§ïŒHTMLããŒãžãäœæãããã©ãŠã¶ã§ãã¹ãŠãæ©èœãããæ¹æ³ãå¹³åçãªãŠãŒã¶ãŒã«èª¬æããå¿ èŠããããŸãïŒæ¡åŒµæ©èœã«çãããããŠããäžéšã®FirefoxãŸãã¯ChromeãŠãŒã¶ãŒãããªããç解ã§ããªãå¯èœæ§ããããŸãïŒ ãã³ãããããIEãŠãŒã¶ãŒã¯ãããã§ã²ã€ã³ïŒéçã«ã¯ã»ãŒå¯äžã®æ¹æ³ãåºãŠããŸãã
1. Fiddlerãšãã®æ¡åŒµæ©èœãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãïŒæ®å¿µãªãããäž¡æ¹ã®ãã¡ã€ã«ã®éãã¯ããã1.7 MBã§ãé»åã¡ãŒã«ã®æ·»ä»ãã¡ã€ã«ã§éä¿¡ããããšãã§ããŸãïŒã
2.ããã©ã«ãã§ã¯ãã»ãšãã©ãã¹ãŠãããã°ã©ã ã®ããŒãºã«åãããŠæ§æãããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ãHTTPSãªã¯ãšã¹ãã䜿çšããå Žåãè¿œå ã®èšå®ã®ã¿ãå¿ èŠã§ãã ãã®ã¿ãã®ããã¯ã¹ããã§ãã¯ããŠãã ããïŒ

3. IEãšGoogle Chromeãè¿œå ã§æ§æããå¿ èŠã¯ãããŸãããããã©ã«ãã§ã·ã¹ãã ãããã·ã䜿çšããŸãïŒè¡šç€ºãããŠããå ŽåïŒãFiddlerã¯èµ·åæã«ãã®ãããªãããã·ãšããŠèªèº«ãç»é²ãããããéåžžã«ç°¡åã§äŸ¿å©ã§ãã Firefoxã®ããã©ã«ãèšå®ã¯å°ãç°ãªããŸãããè€éãªããšããããŸããã ãã¹ãŠãããã§ç°¡åã«èª¬æããŸãã
docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureBrowsers
docs.telerik.com/fiddler/Configure-Fiddler/Tasks/FirefoxHTTPS
4.ãããã®3ã€ã®ã¹ãããã®åŸãFiddlerãèµ·åãããã³ã«ããã©ãã£ãã¯ã¯èªåçã«ééããããã°ã©ã ãéããåŸãéåžžã®ãã¹ã«æ»ããŸãã Fiddlerãæ°žç¶çãªä»²ä»è ã«ããããªãå Žåãããã¯ããŒã¯ã¬ãããŸãã¯ããŒã«ã«ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«ã®ã¿å®è¡ããå Žåã¯ãããã°ã©ã èµ·åã·ã§ãŒãã«ããã«ãªãã·ã§ã³ãè¿œå ãããšäŸ¿å©ã§ãã

Fiddlerã®èšå®ã§ãã¢ã€ã³ã³ãžã®æãããã¿ãéžæããŸãã ãã®åŸãããã°ã©ã ã¯ãã°ããã®éãã¬ã€ã«è¡šç€ºãããŸãïŒããã®ã¢ã€ã³ã³ã®ã¡ãã¥ãŒããéããããšãã§ããŸãïŒã æåã¯è€éãããããã§ããããã¯ããŒã¯ã¬ãããŸãã¯ããŒãžã®ã¢ããªã±ãŒã·ã§ã³å šäœãèµ·åããããšã¯ã§ããŸãããããã«æ £ããããšãã§ããŸãã Fiddlerã¯ãå¿ççã«ãã£ãšäŸ¿å©ã§ããã°ãã¯ãã¹ãã©ãŠã¶æ¡åŒµæ©èœããŸãã¯ã¯ãã¹ãã©ãŠã¶æ¡åŒµæ©èœã®ãã©ãããã©ãŒã ãšèããããšãã§ããŸãã ãããŠãããªããããã絶ããåäœããããŸãŸã«ããŠããã°ã€ã³æã«èªåèµ·åãèšå®ãããªããããªãã¯ãããå®å šã«å¿ããããšãã§ããŸãïŒããã¯å®å šã«ééçã«åäœããã»ãšãã©ã¡ã¢ãªãæ¶è²»ããŸãã-éãã«ã100ã»ãã·ã§ã³ãç¶æããéžæããŸãããã®åŸãç»é¢ã«ã¯æåŸã®ã¯ãšãªãåžžã«100è¡ãã衚瀺ããããã¡ã¢ãªã¯å®è³ªçã«ãã£ã±ãã«ãªããŸããïŒã ããã»ããµãããŒãããããæ©èœäžã®åé¡ããµã€ãã®éçšã«é¡èãªé 延ã¯çºçããŸããã
5.æåŸã®ã¹ããããæ®ã£ãŠããŸã-å¹³åçãªãŠãŒã¶ãŒã«ãšã£ãŠã¯ããããªããšã§ã¯ãããŸããããæ éã«å®è£ ããã°å€§äžå€«ã§ãã é©åãªHTTPæ¥ç¶ããšã«Fiddlerã«ãã£ãŠå®è¡ãããå°ããªã³ãŒããè¿œå ããå¿ èŠãªããããŒãå€æŽ/è¿œå ããå¿ èŠããããŸãã ãã®ã³ãŒãã¯ãã»ãšãã©ã®ã¯ãã¹ãã¡ã€ã³ã¯ãšãªã®ããŒãºã«å¯Ÿå¿ããŠããŸãã
Fiddlerãèµ·åããã¡ãã¥ãŒã§ãã®ã¡ãã¥ãŒé ç®ãéžæããŸãïŒãŸãã¯Ctrl + RãæŒããŸãïŒã

äžèšã®æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããå Žåãå°ããªçµã¿èŸŒã¿ãšãã£ã¿ãŒãããã«å¿ããŠéããŸãïŒãã®å³åŽã«ã¯ãFiddlerãéåžžã®JavaScriptã«è¿œå ãããã¹ãŠãžã®å®å šãªåç §ãå«ãåããããŸãããªã¹ãã¢ã€ãã ãéžæãããšãåã®äžéšã«ãªããžã§ã¯ããããããã£ããŸãã¯ã¡ãœããã®ç°¡åãªèª¬æã衚瀺ãããŸãïŒïŒ

GreasemonkeyãŠãŒã¶ãŒã¹ã¯ãªããã«äŒŒãç¹å¥ãªã¹ã¯ãªããããšãã£ã¿ãŒã«æ¢ã«èªã¿èŸŒãŸããŸããé©åãªããŒãžããã©ãŠã¶ãŒã«èªã¿èŸŒãŸãããã³ã«å®è¡ãããã®ã§ã¯ãªããFiddlerãééããHTTPãã©ãã£ãã¯ã®ãã¹ãŠã®é©åãªã€ãã³ããå®è¡ãããŸãã ãã®ã¹ã¯ãªããã«ã¯ãéçºè èªèº«ããã®äºåçãªã³ãŒããæ¢ã«ãããŸãããç解ããå¿ èŠã¯ãããŸããã å°ããªãã©ã°ã¡ã³ããæ¢åã®é¢æ°ã«æ¿å ¥ããã ãã§ãã ã¿ã¹ã¯ã容æã«ããããã«ããšãã£ã¿ãŒã«ã¯ããã®æ©èœã«ããã«å€æãããç¹å¥ãªã¡ãã¥ãŒé ç®ããããŸãã

ããã§ã次ã®ã³ãŒããæ¿å ¥ããå¿ èŠããããŸãïŒåŸã§èª¬æããŸãïŒã
if (oSession.oRequest.headers.ExistsAndContains('Accept-Language', ',qya;q=0.001') && oSession.oRequest.headers.Exists('Origin')) { oSession.oResponse.headers['Access-Control-Allow-Origin'] = oSession.oRequest.headers['Origin']; oSession.oResponse.headers['Access-Control-Allow-Credentials'] = 'true'; if (oSession.oRequest.headers.Exists('Access-Control-Request-Method')) { oSession.oResponse.headers['Access-Control-Allow-Methods'] = oSession.oRequest.headers['Access-Control-Request-Method']; } if (oSession.oRequest.headers.Exists('Access-Control-Request-Headers')) { oSession.oResponse.headers['Access-Control-Allow-Headers'] = oSession.oRequest.headers['Access-Control-Request-Headers']; } if (oSession.oResponse.headers.Exists('Vary')) { oSession.oResponse.headers['Vary'] += ', Origin'; } else { oSession.oResponse.headers['Vary'] = 'Origin'; } }
æ¿å ¥åŸãé¢æ°ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒæ¿å ¥åã«ãã§ã«1ã€ã®å°ããªãããã¯ããã£ãã®ã§ããã®åŸã«æ¿å ¥ããå¿ èŠããããŸãïŒã

ãã¡ã€ã«ãä¿åããåŸãFiddlerã¯èªåçã«ã¹ã¯ãªããããªããŒãããŠåæãããã¹ãŠãæ£åžžãªå Žåã¯æ¿èªé³ãåºããæ°ããããŒãžã§ã³ã®æ¡çšã«ã€ããŠã¹ããŒã¿ã¹ã©ã€ã³ã§éç¥ããŸãã æ¿å ¥ã«ãã£ãŠäœããäžæããããšããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã äœããããŸããããããã¡ã€ã«ãå ã®äœçœ®ã«æ»ããªãå Žåã¯ãåã«åé€ããŠãã ããã次ã«ããã°ã©ã ãèµ·åãããšãå ã®åœ¢åŒã«åŸ©å ãããŸãïŒWin 7ã®ãã¡ã€ã«ã¢ãã¬ã¹ã¯
c:\Users\[ ]\Documents\Fiddler2\Scripts\CustomRules.js
ãçœå®³åŸ©æ§ã«ã€ããŠã¯ããã«ããŸãã¯ãã¡ã€ã«ã®åé ã®ã³ã¡ã³ããåç §ããŠãã ããïŒã æåŸã«ãã«ãŒã«ãã¡ã€ã«ãèªåã§ç·šéããããšãæããŠãã人ã«ã¢ããªã±ãŒã·ã§ã³ã転éããå¿ èŠãããå Žåã¯ãæ¢ã«æ¿å ¥ãããå®æãããã®ã圌ã«æž¡ããæ£ããã¢ãã¬ã¹ã§çœ®ãæããããŸãã
以äžã§ãã ãããã®æé ã®åŸããªã³ã¯ãFiddler + bookmarklet / local pageãã¯ãã¯ãã¹ãã©ãŠã¶ãŒã®æ¡åŒµæ©èœãŸãã¯ã¢ããªã±ãŒã·ã§ã³ãšèŠãªãããšãã§ããŸãïŒèšäºã®æåŸã«ãããã€ãã®åºæ¬çãªäŸã瀺ããŸãïŒã
V.ã¡ã«ããºã ã®ããã€ãã®æ©èœ
1.ãŸããFiddlerããã¹ãŠã®ããããŒãå€æŽããäžé©åãªã»ãã·ã§ã³å ã§äžå¿ èŠãªãã§ãã¯ãå®è¡ããå¿ èŠããªãããã«ãå ±éã¹ã¬ããã§ã¢ããªã±ãŒã·ã§ã³ããã®ãªã¯ãšã¹ããäœããã®æ¹æ³ã§åé¢ããããšã«ããŸããã ããã€ãã®ãªãã·ã§ã³ãäžè²«ããŠãã¹ãããç Žæ£ããå¿ èŠããããŸããã
aã ãªã¯ãšã¹ãã¢ãã¬ã¹
#fiddler--
ç¹å¥ãªããã·ã¥ã
#fiddler--
ãŸãïŒ
#fiddler--
ïŒã ããã·ã¥ã¯HTTPçµç±ã§éä¿¡ãããªããããæ©èœããŸããããã©ãŠã¶ã«å¯ŸããŠã®ã¿æå³ããããŸãïŒãããã£ãŠããã®ã¡ãœããã¯ããã©ãŠã¶çšã«HTTPç·šéã®æ¡åŒµæ©èœãéçºãããŠããå Žåã«åœ¹ç«ã¡ãŸããããã·ã¥ãã€ã³ã¿ãŒã»ãããããã®æ¡ä»¶ã«åºã¥ããŠããããŒãå€æŽã§ããŸãïŒåè¿°ã®Rewrite HTTP HeadersïŒJSïŒã䜿çšã§ããŸãïŒ; Edgeãå«ããã¹ãŠã®äž»èŠãªãã©ãŠã¶ãŒã®å®è£ ã§ãã®ãããªæ¡åŒµæ©èœãéçºãããå Žåããã®ãããªãªãã·ã§ã³ã«ã€ããŠèããããšãã§ããŸãïŒã
bã æ瀺çãªããã©ã«ãããŒãã®è¿œå -ãã©ãŠã¶ã«ãã£ãŠåæãããŸãã Fiddlerãã€ã³ã¿ãŒã»ããããŠéåžžã®ããŒãã«å€æŽããããã«éæšæºã®ããŒããè¿œå ããããã«ãç§ã¯ãããå±éºãªããžãã¹ã ãšèããŸããã
cã ãµãŒããŒãããããç¡èŠããããšãæåŸ ããŠããã©ãŒã
user:password@
ã®ãã¡ã€ã³ã®åã«èªèšŒéšå URLãè¿œå ããŸãã äœããã®çç±ã§ãã©ãŠã¶ãŒããã®éšåãHTTPçµç±ã§éä¿¡ãããFiddlerã«å°éããªãããšãå€æããŸããã ããã«ããã®éšåãšããŒãçªå·ã¯ãªãã€ã¬ã¯ããšãšãã«æ¶ããŸãããªãã€ã¬ã¯ãã¯
XMLHttpRequest
ã«å¯ŸããŠééçã§ãã€ã³ã¿ãŒã»ãããªãã§ã-æ°ããã¢ãã¬ã¹ãšã®ããããŒäº€æã¯Fiddlerã®åå ãªãã§æ¢ã«è¡ãããŸãã
dã ã¯ãšãª/æ€çŽ¢éšåã«ããŒã«ãŒãè¿œå ããŸãïŒ
&fiddler=1
ïŒã ãã®éšåã§ãªãã¿ã®ãªããªãã·ã§ã³ãçºèŠããäžéšã®ãµãŒããŒã¯ããã®ãªãã·ã§ã³ãªãã§URLã«ãªãã€ã¬ã¯ãããããšãçºèŠãããŸããã ãã®ãããªå ŽåãããŒã«ãŒ
&&&
è¿œå ããããšãã§ããŸããããã¯ãµãŒããŒã«è¡šç€ºãããŸããïŒè§£æããããš3ã€ã®ç©ºã®ãªãã·ã§ã³ã«å€ããããµãŒããŒã®ææãåŒãèµ·ãããŸããïŒããéåžžã®ãªãã€ã¬ã¯ããçºçããå Žåã圌ã¯äœæããæ¶ããŸãã
dã ã¯ãã㌠ã å¥ã®ãã¡ã€ã³ã«ãªãã€ã¬ã¯ããããšå€±ãããŸãã
eã ã«ã¹ã¿ã ãŠãŒã¶ãŒããã㌠ïŒäžéšã®
X-Hello-Fiddler
ïŒãè¿œå ããŸã ã ãã®ãããªããããŒãååšãããšãããããããªãã©ã€ããªã¯ãšã¹ããçºçã ãã€ã³ã¿ãŒã»ããããã³ç·šéã§ããããšãå€æããŸãããããªãã€ã¬ã¯ããç¶ãå Žåããã©ãŠã¶ã¯ãªã¯ãšã¹ããå®å šã«äžæ¢ããŸã-ããªãã©ã€ããªã¯ãšã¹ãã¯ãªãã€ã¬ã¯ããšäºææ§ããããŸããã
ã æšæºããããŒã®è¿œå ã ããã¯ããã»ã©åçŽã§ã¯ãªãããšãããããŸããã ã»ãã¥ãªãã£äžã®çç±ããããã©ãŠã¶ã¯äžéšã®ããããŒãè¿œå ããããšãèš±å¯ãããããèªäœã§ã®ã¿ããããŒãäœæã§ããŸãã ããããŒã®äžéšã¯ãæšæºã®ãã®ã§ãã£ãŠããããªãã©ã€ããªã¯ãšã¹ããåŒã³åºããŸãã ãããé²ãã«ã¯ããåçŽããšèŠãªãããéåžžã«å°æ°ã®èŠåºãã«å¶éããå¿ èŠããããŸãã ãããã«ã€ããŠã¯ã www.w3.org / TR / cors / ïŒterminology ïŒ ãåçŽãªããããŒã ïŒãåç §ããŠãã ããã
ããã§ããã©ãŠã¶ã§å€æŽã§ããéåžžã®ããããŒã«å®å šãªå€æŽãå ãããšãããæ®ãã®æ¹æ³ã«åãããããŸããã ãã®ãããªã¿ã€ãã«ã¯
Accept-Language
ã§ããã ãã©ãŠã¶ãŒãªãã·ã§ã³ã®åªå èšèªèšå®ã«åŸã£ãŠããã©ãŠã¶ãŒã«ãã£ãŠæ§æãããŸãã JavaScriptã³ãŒãã§ã®ãããã®ã¢ã€ãã¢ã¯ãnavigator.languagesããããã£ã䜿çšããŠååŸã§ããŸãããIE11ã§ã¯ãµããŒããããŠããŸããïŒãã¹ãŠã®ãã©ãŠã¶ãŒã§ãµããŒããããŠããnavigator.languageããããã£ã¯ããã©ãŠã¶ãŒèªäœã®ã€ã³ã¿ãŒãã§ã€ã¹èšèªã®ã¿ãæäŸããŸãïŒã ããšãã°ãç§ã®3ã€ã®ãã©ãŠã¶ãŒã§ã¯ãã³ã³ãœãŒã«ã®
JSON.stringify([navigator.language, navigator.languages])
ã³ãŒã
JSON.stringify([navigator.language, navigator.languages])
ã¯ä»¥äžãæäŸããŸãã
Chrome: "[ "en-US", [ "en-US", "en", "ru", "uk" ] ]" Firefox: "[ "en-US", [ "en-US", "en", "ru", "uk" ] ]" IE11: "[ "ru-RU", null ]"
ãã©ãŠã¶èªäœãéä¿¡ããããããŒãWebã³ã³ãœãŒã«ã§ç¢ºèªããããŒã«ãŒãè¿œå ããããšã§ãã®ã³ãŒããã¹ã¯ãªããã§äœ¿çšããã®ãæã䟿å©ã§ãã ç§ã®ãã©ãŠã¶ãŒã¯ã次ã®
Accept-Language
ããããŒãæäŸããŸãã
Chrome: en-US,en;q=0.8,ru;q=0.6,uk;q=0.4 Firefox: en-US,en;q=0.8,ru;q=0.5,uk;q=0.3 IE11: en-US,en;q=0.8,ru;q=0.5,uk;q=0.3
ãããã«æå°ã®éžå¥œä¿æ°ãæã€ãŸããªèšèªãè¿œå ããããšã¯æ®ã£ãŠããŸãã QuenyaãéžæããŸãã ãããã¯ã
qya
ã³ãŒãã§æšæºã«æ¢ã«å«ãŸããŠãã
qya
ã§ãã ãã®ããã
qya;q=0.001
ãããªãã®ãè¿œå ããå¿ èŠããã
qya;q=0.001
ïŒæšæºã§èš±å®¹ãããæå°å€ïŒãããã¯Fiddlerã®æåã®ãã¹ãæ¡ä»¶ã§å°ãé«ããªã£ãŠããŸãïŒã¯ãã¹ãã¡ã€ã³ãªã¯ãšã¹ããµã€ã³ã§ãã
Origin
ããããŒããã§ãã¯ãã -ãããªãã§ã¯ãèŠåºãã«å¹²æžããããšã¯æå³ããããŸããããã¹ãŠããšã«ããåäœããŸãïŒã
2. 2ã€ã®æ¡ä»¶ããã§ãã¯ããåŸãæ¿å ¥ãã£ã¬ã¯ãã£ãã¯äœãããŸããïŒ
aã éä¿¡ãã
Origin
ãªã¯ãšã¹ãã®çºä¿¡å ã¯ãã©ãŒãªã³ã°ãããŸã-ããããªããšããã©ãŠã¶ã¯ã¹ã¯ãªããã«å¿çããŸããïŒããŒã«ã«ããŒãžãããªã¯ãšã¹ãããå Žåã¯
null
ã«ãªã
null
ãããµãŒããŒããããè¿ãå¿ èŠããããŸãïŒã
bã èŠæ±ã®æ¿èªãµããŒããè¿œå ããŸãïŒ
Access-Control-Allow-Credentials
ããããªããšããã©ãŠã¶ãŒã¯Cookieã«é¢é£ããåä¿¡æ å ±ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸãããã€ãŸãããµã€ãã§ã®æ¿èªæã«ååŸããããŒãžãååŸããŸããïŒã
cã ä¿è·ããããã«ãçªç¶ã¹ã¯ãªããã«è¿œå ã§ããå ŽåããŸãã¯ãã©ãŠã¶ãŒèªäœãããããè¿œå ãããå Žåãç¹å¥ãªã¡ãœãããšããããŒã«å¯Ÿãããã©ãŠã¶ãŒèŠæ±ããã©ãŒãªã³ã°ããŸãïŒãããŸã§ã®ãšããããã®ãããªå Žåã¯çºçããŠããŸããïŒã
Vary
ããããŒãè¿œå ããŸããããã䜿çšããªãå Žåããã©ãŠã¶ãŒã¯åã«å¿çããã£ãã·ã¥ããFiddlerããã€ãã¹ããŠãã£ãã·ã¥ããåä¿¡ããŸãããåæã«
Access-Control-Allow-Origin
å¥ã®ãœãŒã¹ã§ã€ãŸããããªã¯ãšã¹ããäžæããŸã
Vary
ããããŒã¯ãã£ãã·ã¥ãé 眮ããŸããã®ãããªå¿çã¯ãèŠæ±ã®ãœãŒã¹ã«äŸåããŸãã
3.ããã€ãã®èããããåé¡ïŒäž»ã«IEã§ïŒããã³ãããã®è§£æ±ºãè©Šã¿ãŸãã
aã IE11ã¯ãŸã æ®åããŠããªãP3Pãã¯ãããžãŒã䜿çšããŠããŸãã ãµãŒããŒãå®è£ ããŠããªãå ŽåïŒã»ãšãã©ã®å ŽåãããçºçããŸãïŒãIEã¯ãã®ãããªãµãŒããŒãåºæ¬ã§ãªãå ŽåïŒæ£ç¢ºã«ã¯ã¯ãã¹ãã¡ã€ã³
XMLHttpRequest
ãªã¯ãšã¹ãã®ã«ãŒã«ïŒããã®ãããªãµãŒããŒã«Cookieãéä¿¡ããŸããã Firefoxã«ã¯ã ãµãŒãããŒãã£ã®Cookieããã©ãŠã¶ãŒèšå®ã§èš±å¯ãããŠããªãå Žåãæ¡åŒµæ©èœãCookieãéä¿¡ããããšããèš±å¯ããªãå€ããã°ããããŸãã IEã§ã¯ã䌌ããããªãã®ããããŸãã
P3P
ã«ãŒã«ã¯éåžžã«è€éã§ããããŠãŒã¶ãŒã¯Fiddlerã䜿çšããŠãããã®å¹²æžãåããŸãããç§ã¯ãããŠããŸããã§ããïŒãã ããCookieã¯äºåã«
P3P
ã«ãŒã«ãšäžç·ã«èšå®ãããFiddlerã¯ããŒãºã«é¢ä¿ãªãåžžã«ãã¹ãŠã®ã»ãã·ã§ã³ã§ããã«åŸãå¿ èŠããããŸãã¢ããªã±ãŒã·ã§ã³ïŒã ãã ããç¶æ³ããæãåºãç°¡åãªæ¹æ³ããããŸãã IEã®èšå®ã§ã¯ããããã®ãŠã£ã³ããŠãéãã次ã®ãªãã·ã§ã³ã確èªããå¿ èŠããããŸãã

ãã®åŸãIEã®
XMLHttpRequest
ãªã¯ãšã¹ãã§èªèšŒãµããŒããåãåããŸãã ãšããã§ãç§ã¯å¥åŠãªäžå ·åã«ééããŸããïŒãã®ãªãã·ã§ã³ãäžåºŠé©çšããŠãããã£ã³ã»ã«ããåŸãIEã¯åŒãç¶ããµãŒãããŒãã£Cookieãéä¿¡ãç¶ããŸããã ããããããã¯ç¶æ³ã®ãŠããŒã¯ãªçµã¿åããã§ããã
ãŸããåããã€ã¢ãã°ãŸãã¯ãã©ã€ãã·ãŒããªã·ãŒãã€ã¢ãã°ã§äŸå€ãäœæããåãµã€ããäœæããããšãã§ããŸãããããã¯å°ãèœã¡çãæçšãŸãã¯é床ã®ãã©ãã€ã¢ã§ã¯ãããŸãããããã¯é·ãæ®éçãªæ¹æ³ã§ã¯ãããŸããã
Chromeããã³Firefoxã§ã¯ããµãŒãããŒãã£ã®Cookieãããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãïŒFirefoxã§ã¯ãã»ãšãã©ã®å Žåã蚪åãããµã€ãããã®Cookieã®ã¿ãåãå ¥ãã䟿å©ãªãªãã·ã§ã³ããããŸãïŒããªãã·ã§ã³ã§äœãèšå®ã§ããŸããã
bã IE11ã«ã¯éåžžã«å¥åŠãªãã°ãããããã®æ§è³ªã¯ç解ã§ããŸããã§ããã äžéšã®ãµã€ãã§ã®ã¿ããªãã€ã¬ã¯ãæã«ã®ã¿2ã€ã®äžæçãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
SEC7120: null Access-Control-Allow-Origin.
XMLHttpRequest: 0x80070005, .
åæã«ãããããŒã®ãã¹ãŠãæ£åžžã§ãããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®äž¡æ¹ã«ããªã¯ãšã¹ãã®æ£ãããœãŒã¹ããã
null
ãã
null
ã¯ãããŸããïŒãªã¯ãšã¹ããããŒã«ã«ããŒãžããéä¿¡ãããŠããªãå ŽåïŒã ãã©ãŠã¶ãã転éäžã®ãªã¯ãšã¹ãã®ãœãŒã¹ã
null
ãªã£ããšæ³å®ããçç±ã¯å®å šã«ç解äžèœã§ãã , .
cã , , Fiddler- (
Vary
Origin
), . , , ( ), â , : Chrome Firefox , IE11 . , .
dãäžéšã®ããŒãžã§ã¯ãããã¯ããŒã¯ã¬ããã¯å¥ã®ãã¯ãããžãŒã§ããã³ã³ãã³ãã»ãã¥ãªãã£ããªã·ãŒã®ããã«åäœãæåŠããŸãã Firefox ã¯
XMLHttpRequest
ãå³å¯ãªããŒãž
CSP
ïŒTwitterãGitHabãªã©ïŒã§ããã¯ããŒã¯ã¬ãããå®è¡ãããªãå Žåã§ããããã¯ããŒã¯ã¬ããããŸã£ããå®è¡ãããªããã°ãä¿®æ£ããŸãããä»ã®ãã©ãŠã¶ã§
CSP
ã¯ãã¯ãã¹ãã¡ã€ã³ãªã¯ãšã¹ãã®éå§ã劚ããããå ŽåããããŸãããã®åé¡ã¯ã2ã€ã®æé ã§è§£æ±ºã§ããŸãïŒãããèš±å¯ãããã©ãŠã¶ãŒã§CSPãç¡å¹ã«ããããªãå Žå-ããã³ãããæ ¹æ¬çãªæ¹æ³ã§ãïŒïŒ
-Content-Security-PolicyããããŒãäžæçã«åé€ããå¥ã®Fiddleraæ¡ä»¶ãäœæããŸãïŒæ¿å ¥ãå¿ èŠã§ãïŒäžèšã®ãããã¯ã®åŸïŒïŒ
if (/[?&]tempnocsp=1\b/i.test(oSession.PathAndQuery)) { oSession.oResponse.headers.Remove('Content-Security-Policy'); oSession.oResponse.headers.Remove('X-Content-Security-Policy'); }
â , query-
tempnocsp=1
URL ( , ; , , â Fiddler-). :
javascript:(function(l) { if (!/[?&]tempnocsp=1\b/i.test(l.href)) { l.href += (/\?/.test(l.href) ? "&" : "?") + "tempnocsp=1"; } })(location);
, . , . - Fiddler- , Firefox Chrome â . , . Fiddler, â .
VI.
, , . , , , , ( IE). â .
1. , , / .
HEAD
,
Content-Type
,
Last-Modified
Content-Length
. , . , .
responseURL
IE11 ( , , , Edge).
:
Content-Type
Last-Modified
,
Content-Length
. , Chrome :
VM117:1 Refused to get unsafe header "Content-Length"
Fiddler-, CORS: , . , :
if (oSession.RequestMethod == 'HEAD') { if (oSession.oResponse.headers.Exists('Access-Control-Expose-Headers')) { oSession.oResponse.headers['Access-Control-Expose-Headers'] += ', Content-Length'; } else { oSession.oResponse.headers['Access-Control-Expose-Headers'] = 'Content-Length'; } }
, , Fiddler- , :
OnBeforeResponse
if (oSession.oRequest.headers.ExistsAndContains('Accept-Language', ',qya;q=0.001') && oSession.oRequest.headers.Exists('Origin')) { oSession.oResponse.headers['Access-Control-Allow-Origin'] = oSession.oRequest.headers['Origin']; oSession.oResponse.headers['Access-Control-Allow-Credentials'] = 'true'; if (oSession.oRequest.headers.Exists('Access-Control-Request-Method')) { oSession.oResponse.headers['Access-Control-Allow-Methods'] = oSession.oRequest.headers['Access-Control-Request-Method']; } if (oSession.oRequest.headers.Exists('Access-Control-Request-Headers')) { oSession.oResponse.headers['Access-Control-Allow-Headers'] = oSession.oRequest.headers['Access-Control-Request-Headers']; } if (oSession.oResponse.headers.Exists('Vary')) { oSession.oResponse.headers['Vary'] += ', Origin'; } else { oSession.oResponse.headers['Vary'] = 'Origin'; } if (oSession.RequestMethod == 'HEAD') { if (oSession.oResponse.headers.Exists('Access-Control-Expose-Headers')) { oSession.oResponse.headers['Access-Control-Expose-Headers'] += ', Content-Length'; } else { oSession.oResponse.headers['Access-Control-Expose-Headers'] = 'Content-Length'; } } } if (/[?&]tempnocsp=1\b/i.test(oSession.PathAndQuery)) { oSession.oResponse.headers.Remove('Content-Security-Policy'); oSession.oResponse.headers.Remove('X-Content-Security-Policy'); }
, , , â , , :
javascript:(function(url, xhr) { if(!url) {return;} xhr = new XMLHttpRequest(); try {xhr.open('HEAD', url, true);} catch (e) { alert(e.name + ': ' + e.message); return; } xhr.setRequestHeader('Accept-Language', 'en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'); xhr.responseType = 'document'; xhr.timeout = 10000; xhr.withCredentials = true; xhr.onload = function(evt, l) { l = this.getResponseHeader('Content-Length'); alert([ this.responseURL || '?', this.getResponseHeader('Content-Type') || '?', this.getResponseHeader('Last-Modified') || '?', l ? [l + ' B', (l / 1024) .toFixed(3) + ' kB', (l / 1048576) .toFixed(3) + ' MB', (l / 1073741824).toFixed(3) + ' GB'].join(' \u2248 ') : '?' ].join('\n\n') + '\n\n'); }; xhr.ontimeout = xhr.onerror = function(evt) {alert(evt.type.charAt(0).toUpperCase() + evt.type.slice(1) + '.');}; try {xhr.send(null);} catch (e) {alert(e.name + ': ' + e.message); return;} })(document.activeElement.href || prompt('URL:'))
, URL , . , ( IE11 â habrastorage.org/files/5c2/1e7/e48/5c21e7e4838b43b0b4f275d041a4e234.png ) Chrome :

Firefox Nightly :

, â . Chrome
xhr.onerror
:
XMLHttpRequest cannot load file:///... Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.
Firefox
xhr.send()
, , , . :
NS_ERROR_DOM_BAD_URI: Access to restricted URI denied
IE11 ,
xhr.open()
. . IE :
Error: .
2. « »
«Breadcrumbs» , Total Commander, .
Firefox Advanced Locationbar . Chrome Breadcrumb Navigator . IE11, , ( IE Explorer- ).
, , . , , . : ( ), ( ), ( ). , â ,
XMLHttpRequest
. ( â ).
javascript:(function(d, l, throbber, div, url, ar, arl, i, str, el, info_url, info_title){ if (d.activeElement.href) {l = d.activeElement;} else {l = location;} throbber = 'data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7'; div = d.createElement('div'); div.setAttribute('data-breadcrumbs-main', ''); div.appendChild(d.createElement('style')).textContent=[ 'div[data-breadcrumbs-main] {position:fixed; top:0px; left:0; z-index:999999; width:100%; padding:10px !important; background-color:white !important; outline:1px solid black !important; font-size: 12pt !important; text-align: left !important;}', 'div[data-breadcrumbs-main] a {font-size: 12pt !important; text-decoration: underline !important;}', 'div[data-breadcrumbs-main] div {margin-top: 20px!important; color: silver !important;}', 'div[data-breadcrumbs-info-title] {background-repeat: no-repeat !important; background-position: left center !important; padding-left: 20px !important;}', ].join('\n'); url = l.protocol + (/:[/][/]/.test(l.href) ? '//' : ''); div.appendChild(d.createElement('span')).textContent = url; ar = l.hostname.split('.'); arl = ar.length; if(arl > 1) { ar.splice(arl - 2, 2, ar.slice(arl - 2).join('.')); arl--; } for (i = 0; i < arl; i++) { str = ar[i]; if (i > 0) {div.appendChild(d.createElement('span')).textContent = '.';} el = div.appendChild(d.createElement('a')); el.textContent = str; el.href = url + ar.slice(i).join('.'); } url += l.hostname; if(l.port && /:\d+$/.test(l.host)) { div.appendChild(d.createElement('span')).textContent = ':'; el = div.appendChild(d.createElement('a')); el.textContent = l.port; url += ':' + l.port; el.href = url; } div.appendChild(d.createElement('span')).textContent = '/'; url += '/'; if(l.pathname.length > 1){ ar = l.pathname.split('/'); ar.shift(); arl = ar.length; for (i = 0; i < arl; i++) { str = ar[i]; if (i < arl-1) { el = div.appendChild(d.createElement('a')); el.textContent = str; url += str; div.appendChild(d.createElement('span')).textContent = '/'; url += '/'; el.href = url; } else if (str !== '') { el = div.appendChild(d.createElement('a')); el.textContent = str; url += str; el.href = url; } } } if(l.search){ ar = l.search.split('&'); arl = ar.length; ar[0] = ar[0].substring(1); div.appendChild(d.createElement('span')).textContent = '?'; url += '?'; for (i = 0; i < arl; i++) { str = ar[i]; if (i > 0) { div.appendChild(d.createElement('span')).textContent = '&'; url += '&'; } el = div.appendChild(d.createElement('a')); el.textContent = str; url += str; el.href = url; } } if(l.hash){ div.appendChild(d.createElement('span')).textContent = '#'; el = div.appendChild(d.createElement('a')); el.textContent = l.hash.substring(1); url += l.hash; el.href = url; } if (div.querySelector('a:last-of-type').href == location.href) { div.querySelector('a:last-of-type').setAttribute('data-breadcrumbs-doc-title', d.title); } info_url = div.appendChild(d.createElement('div')); info_url.setAttribute('data-breadcrumbs-info-url', ''); info_url.textContent = 'URL'; info_title = div.appendChild(d.createElement('div')); info_title.setAttribute('data-breadcrumbs-info-title', ''); info_title.textContent = 'Title'; div.addEventListener('mouseover', function(evt, h, t){ if (h = evt.target.href) { info_url.textContent = h; if (t = evt.target.getAttribute('data-breadcrumbs-doc-title')) { info_title.textContent = t; } else{getTitle(evt.target);} } }); div.addEventListener('dblclick' /*mouseleave*/, function(){div.parentNode.removeChild(div);}); d.body.appendChild(div); function getTitle(lnk, xhr) { info_title.style.backgroundImage = 'url('+ throbber + ')'; xhr = new XMLHttpRequest(); try {xhr.open('GET', lnk.href, true);} catch (e) { info_title.style.backgroundImage = 'none'; info_title.textContent = e.name + ': ' + e.message; return; } xhr.setRequestHeader('Accept-Language', 'en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'); xhr.responseType = 'document'; xhr.timeout = 10000; xhr.withCredentials = true; xhr.onload = function() { info_title.style.backgroundImage = 'none'; if (this.response && this.response.title) { info_title.textContent = this.response.title; lnk.setAttribute('data-breadcrumbs-doc-title', this.response.title); } else { info_title.textContent = '?'; lnk.setAttribute('data-breadcrumbs-doc-title', '?'); } }; xhr.ontimeout = xhr.onerror = function(evt){ info_title.style.backgroundImage = 'none'; info_title.textContent = evt.type.charAt(0).toUpperCase() + evt.type.slice(1) + '.'; }; try {xhr.send(null);} catch (e) { info_title.style.backgroundImage = 'none'; info_title.textContent = e.name + ': ' + e.message; } } })(document)
( , ) - ,
CORS
. , . , MDN , :

.
IE11 (. ), , UglifyJS :
javascript:(function(e,t,n,a,A,i,r,o,l,p,d,s){function h(e,t){s.style.backgroundImage='url('+n+')',t=new XMLHttpRequest;try{t.open('GET',e.href,!0)}catch(a){return s.style.backgroundImage='none',void(s.textContent=a.name+': '+a.message)}t.setRequestHeader('Accept-Language','en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'),t.responseType='document',t.timeout=1e4,t.withCredentials=!0,t.onload=function(){s.style.backgroundImage='none',this.response&&this.response.title?(s.textContent=this.response.title,e.setAttribute('data-breadcrumbs-doc-title',this.response.title)):(s.textContent='?',e.setAttribute('data-breadcrumbs-doc-title','?'))},t.ontimeout=t.onerror=function(e){s.style.backgroundImage='none',s.textContent=e.type.charAt(0).toUpperCase()+e.type.slice(1)+'.'};try{t.send(null)}catch(a){s.style.backgroundImage='none',s.textContent=a.name+': '+a.message}}for(t=e.activeElement.href?e.activeElement:location,n='data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7',a=e.createElement('div'),a.setAttribute('data-breadcrumbs-main',''),a.appendChild(e.createElement('style')).textContent='div[data-breadcrumbs-main] {position:fixed; top:0px; left:0; z-index:999999; width:100%; padding:10px !important; background-color:white !important; outline:1px solid black !important; font-size: 12pt !important; text-align: left !important;}\ndiv[data-breadcrumbs-main] a {font-size: 12pt !important; text-decoration: underline !important;}\ndiv[data-breadcrumbs-main] div {margin-top: 20px!important; color: silver !important;}\ndiv[data-breadcrumbs-info-title] {background-repeat: no-repeat !important; background-position: left center !important; padding-left: 20px !important;}',A=t.protocol+(/:[\/][\/]/.test(t.href)?'//':''),a.appendChild(e.createElement('span')).textContent=A,i=t.hostname.split('.'),r=i.length,r>1&&(i.splice(r-2,2,i.slice(r-2).join('.')),r--),o=0;r>o;o++)l=i[o],o>0&&(a.appendChild(e.createElement('span')).textContent='.'),p=a.appendChild(e.createElement('a')),p.textContent=l,p.href=A+i.slice(o).join('.');if(A+=t.hostname,t.port&&/:\d+$/.test(t.host)&&(a.appendChild(e.createElement('span')).textContent=':',p=a.appendChild(e.createElement('a')),p.textContent=t.port,A+=':'+t.port,p.href=A),a.appendChild(e.createElement('span')).textContent='/',A+='/',t.pathname.length>1)for(i=t.pathname.split('/'),i.shift(),r=i.length,o=0;r>o;o++)l=i[o],r-1>o?(p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,a.appendChild(e.createElement('span')).textContent='/',A+='/',p.href=A):''!==l&&(p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,p.href=A);if(t.search)for(i=t.search.split('&'),r=i.length,i[0]=i[0].substring(1),a.appendChild(e.createElement('span')).textContent='?',A+='?',o=0;r>o;o++)l=i[o],o>0&&(a.appendChild(e.createElement('span')).textContent='&',A+='&'),p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,p.href=A;t.hash&&(a.appendChild(e.createElement('span')).textContent='#',p=a.appendChild(e.createElement('a')),p.textContent=t.hash.substring(1),A+=t.hash,p.href=A),a.querySelector('a:last-of-type').href==location.href&&a.querySelector('a:last-of-type').setAttribute('data-breadcrumbs-doc-title',e.title),d=a.appendChild(e.createElement('div')),d.setAttribute('data-breadcrumbs-info-url',''),d.textContent='URL',s=a.appendChild(e.createElement('div')),s.setAttribute('data-breadcrumbs-info-title',''),s.textContent='Title',a.addEventListener('mouseover',function(e,t,n){(t=e.target.href)&&(d.textContent=t,(n=e.target.getAttribute('data-breadcrumbs-doc-title'))?s.textContent=n:h(e.target))}),a.addEventListener('dblclick',function(){a.parentNode.removeChild(a)}),e.body.appendChild(a)})(document)
3.ããŒã«ã«ããŒãžã®ããŒã¿ã®éçŽã
次ã®äŸã¯ã1ã€ã®ããŒã«ã«ããŒãžã§ããŸããŸãªæ å ±ãåéããããã®ãã³ãã¬ãŒããšããŠäœ¿çšã§ããŸããã¹ã¯ãªããã®å é ã«ã¯ã
sites
æ°ããã¿ã¹ã¯ãã¢ã°ãªã²ãŒã¿ãŒã«è¿œå ããããã®æå°éã®ããŒã¿ãå«ãéå§ãªããžã§ã¯ãããããŸããå²ãŸããåãªããžã§ã¯ãã«ã¯ã2ã€ã®å¿ é ããŒãå«ãŸããŠããŸããããã¹ããæœåºããèŠçŽ ã®ãµã€ãã¢ãã¬ã¹ãšCSSã»ã¬ã¯ã¿ãŒããŸãã2ã€ã®ãªãã·ã§ã³ã®ããŒãå«ããããšãã§ããŸãïŒå®å šã«ç解ããããã®ãªã³ã¯è¿œè·¡ããŒãžïŒæ å ±èŠæ±ããŒãžãšäžèŽããªãå ŽåïŒããã³æœåºãããããã¹ãã«ãã£ãŠåŠçãããå¿ èŠãããæ£èŠè¡šçŸïŒ2ã€ã®èŠçŽ ã®é å-ãã³ãã¬ãŒããšçœ®ææååã®åœ¢åŒïŒ
ãŠãŒã¶ãŒã¯ãéçºè ã®ã³ââã³ãœãŒã«ã®ã¡ãã¥ãŒé ç®ã䜿çšããŠã»ã¬ã¯ã¿ãŒãã³ããŒããŠè²Œãä»ããããšãã§ããŸãïŒIE11ã§ã¯ãDOMããªãŒã®ããŸããŸãªèŠçŽ ãéžæããããšãã«ããŒãžã³ãŒãã®äžã§æŽæ°ããããæ¢ã«éŠŽæã¿ã®ãããã³ç²ã®ã»ã¬ã¯ã¿ãŒããªã¢ã³ãã®è¡ã®ã¿ãèŠãããšãã§ããŸãïŒã
äŸã®ç°¡ç¥åã®ããã«ãããã¥ã¡ã³ãã«ã¯Habrahabrã®4ã€ã®ã»ã¯ã·ã§ã³ã«åããŠãŒã¶ãŒã®ãããã¡ã€ã«ããŒãžãå«ãŸããã»ã¬ã¯ã¿ãŒã¯ãŠãŒã¶ãŒã«é¢ããæå°éã®æ å ±ãéžæããåãã¿ã€ãã®æ£èŠè¡šçŸã¯èªã¿ãããããããã«ãã©ã°ã¡ã³ãã®1ã€ãæå°åããŸãã
, -. ( , ). , , , .
HTML- :

:
<!doctype html> <html> <head> <meta charset='UTF-8'><title>User Data Aggregation</title> <style> body > div > a {display: inline-block; background-repeat: no-repeat;} body > div > pre, body > div > a {padding: 5px 5px 5px 20px; margin: 0px;} </style> <script> /******************************************************************************/ 'use strict'; /******************************************************************************/ var sites = { 'habrahabr.ru': { checkPageURL: 'http://habrahabr.ru/users/vmb/', keyElementSelectors: '#layout > div.inner > div.user_header > div.karma, #layout > div.inner > div.user_header > div.rating, #layout > div.inner > div.content_left > div.user_profile > div.rating-place, #layout > div.inner > div.sidebar_right > div.block.user_info > div.info', re: [ /(\d+) (\d+ .+)/, '$1 ($2)' ] }, 'geektimes.ru': { checkPageURL: 'http://geektimes.ru/users/vmb/', keyElementSelectors: '#layout > div.inner > div.user_header > div.karma, #layout > div.inner > div.user_header > div.rating, #layout > div.inner > div.content_left > div.user_profile > div.rating-place, #layout > div.inner > div.sidebar_right > div.block.user_info > div.info', re: [ /(\d+) (\d+ .+)/, '$1 ($2)' ] }, 'megamozg.ru': { checkPageURL: 'http://megamozg.ru/users/vmb/', keyElementSelectors: '#layout > div.inner > div.user_header > div.karma, #layout > div.inner > div.user_header > div.rating, #layout > div.inner > div.content_left > div.user_profile > div.rating-place, #layout > div.inner > div.sidebar_right > div.block.user_info > div.info', re: [ /(\d+) (\d+ .+)/, '$1 ($2)' ] }, 'toster.ru': { checkPageURL: 'https://toster.ru/user/vmb', keyElementSelectors: '#js-canvas > div.layout__body > section > div.column_main > main > header > div.page-header__stats > ul > li', }, }; /******************************************************************************/ var throbber = 'data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7'; /******************************************************************************/ document.addEventListener('DOMContentLoaded', init); /******************************************************************************/ function init() { for (var site in sites) { var div = document.body.appendChild(document.createElement('div')); var querier = document.createElement('a'); querier.textContent = site; querier.target = '_blank'; querier.href = sites[site].openPageURL || sites[site].checkPageURL; div.appendChild(querier); } if(!location.hash){getAll();} } /******************************************************************************/ function getAll() { var queriers = document.querySelectorAll('a'); for (var i = 0, querier; querier = queriers[i]; i++) { window.setTimeout(getDoc, i*1000, querier); } } /******************************************************************************/ function getDoc(querier) { querier.style.backgroundImage = 'url('+ throbber + ')'; var site = querier.textContent; var xhr = new XMLHttpRequest(); xhr.open('GET', sites[site].checkPageURL, true); xhr.setRequestHeader('Accept-Language','en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'); xhr.responseType = 'document'; xhr.timeout = 10000; xhr.withCredentials = true; xhr.onload = function() { processDoc(this.response, querier); }; xhr.ontimeout = xhr.onerror = function(evt) { querier.parentNode.appendChild(document.createElement('pre')).textContent = evt.type.charAt(0).toUpperCase() + evt.type.slice(1) + '.'; querier.style.backgroundImage = 'none'; }; xhr.send(null); } /******************************************************************************/ function processDoc(doc, querier) { var site = querier.textContent; var keyElements = doc.querySelectorAll(sites[site].keyElementSelectors); if (keyElements.length) { querier.parentNode.appendChild(document.createElement('pre')).textContent = [].map.call(keyElements, function(el) { el = el.textContent.trim().replace(/\s+/g, ' '); if (sites[site].re) {el = el.replace(sites[site].re[0], sites[site].re[1]);} return el; }).join('\n'); } else { querier.parentNode.appendChild(document.createElement('pre')).textContent = 'Parsing error.'; } querier.style.backgroundImage = 'none'; } /******************************************************************************/ </script> </head> <body></body> </html>
4.
. , ( ) , , .
IMDb ( ): 250 250 . : , , .
ã¹ã¯ãªããã®åé ã§ãèšå®ã«æ £ã芪ããã§ãããªããžã§ã¯ãã«äŒããŸãããããã§ã¯ç°¡åã§ããããŒãžã¢ãã¬ã¹ãšããŒèŠçŽ ã»ã¬ã¯ã¿ãŒã®ã¿ã§ãïŒååãšããŠããããã¯è©äŸ¡èŠçŽ ã«é¢ãã詳现æ å ±ãžã®ãªã³ã¯ã«ãªããŸãïŒã
ã¹ã¯ãªããã¯ããã䜿çšããŠçµæãä¿åããŸãã
localStorage
ãããªã¥ãŒã ã¯ãšãªã®é·ââãå±¥æŽãä¿æããäºå®ãããå Žåã¯ãã䜿çšããŠããŒã¿ã®ä¿åãšååŸãå®è£ ããããšããå§ãããŸã
indexedDB
ã
åãã£ãŒãã«å¯ŸããŠãã¹ã¯ãªããã¯çŸåšã®ãã¥ãŒã¹ã®ãããã¯ãšéå»ã®æ¯èŒã®å±¥æŽã®ãããã¯ãäœæããŸãïŒå±¥æŽãã¿ã³ãã¯ãªã¢ãããããå®å šã«ç¡å¹ã«ãããªãã·ã§ã³ãå«ãèŠåºãã䜿çšããŸã.IMDbã®å Žåããªã¹ãèªäœã倧ãããå€æŽãåžžã«çºçãããããå±¥æŽããªãã«ããŸã-ç¹ã«ã©ã³ãã³ã°èŠçŽ ã®é ã«ããã®ãããªã¹ããŒãªãŒã䜿çšãããšãããŒãžã¯æ¥éã«æé·ããŸãïŒã
ä¿åãããããŒã¿ãæã€ãªããžã§ã¯ãã«ã¯ãè©äŸ¡ã®æ ç»ãžã®ãªã³ã¯ã®é åããã®ååã®é åãéãã®å±¥æŽïŒã¯ãªã¢ãããŠãããç¡å¹åãããŠããªãå ŽåïŒãå±¥æŽãç¶æãããªãã·ã§ã³ãããã³æåŸã®ãã§ãã¯ã®æ¥ä»ãå«ãŸããŸãã
Chromeã§ã®æ¯èŒçµæïŒå±¥æŽããªãã«ããå ŽåïŒã¯æ¬¡ã®ããã«ãªããŸãïŒãã©ã¹ã¯æ°ããã ãŒããŒãå é ããå ¥åããããšãæå³ãããã€ãã¹-ã ãŒããŒãå é ããåé€ããŸãïŒã©ã¡ããéåžžã«çæéã§çºçããããšããããŸã-ãªã¹ãã®æåŸã®èŠçŽ ã¯ç¹ã«äžå®å®ã§ãïŒãç¢å°ã¯äœçœ®ã®ç§»åã瀺ããŸãäžäžïŒã
aãæ ç»ã®å ŽåïŒ

bããã¬ãçªçµã®å ŽåïŒ

ããã§æåŸã®éèŠãªãã€ã³ãã1ã€æããå¿ èŠããããŸãã ChromeãšFirefoxãæäŸãã
localStorage
, IE11 â (, , , Edge). Fiddler . . , , IE11
localStorage
. Fiddler-, «AutoResponder» ( , Fiddler , URL):

:
localhost
(
127.0.0.1
; , , ), IE11; . IE11. , , , , status quo:

, :
<!doctype html> <html> <head> <meta charset='UTF-8'><title>IMDb Charts History</title> <style> body > div > * {padding: 5px 20px 5px 20px; margin: 2px;} body > div > a {display: inline-block; background-repeat: no-repeat; background-position: left center;} body > div > pre {border: 1px solid silver;} body > div > pre:not(:first-of-type) {background-color: gainsboro;} body > div > pre > button {margin: 0px 0px 0px 20px;} </style> <script> /******************************************************************************/ 'use strict'; /******************************************************************************/ var sites = { 'IMDb Top 250': { checkPageURL: 'http://www.imdb.com/chart/top', keyElementsSelector: '#main > div > span > div > div > div.lister > table > tbody > tr > td.titleColumn > a', }, 'IMDb Top 250 TV': { checkPageURL: 'http://www.imdb.com/chart/toptv', keyElementsSelector: '#main > div > span > div > div > div.lister > table > tbody > tr > td.titleColumn > a', }, }; /******************************************************************************/ var netData = JSON.parse(localStorage['IMDbChartsHistory.netData'] || '{}'); var throbber = 'data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7'; /******************************************************************************/ document.addEventListener('DOMContentLoaded', init); /******************************************************************************/ function init() { for (var site in sites) { if(!netData[site]) { netData[site] = {lastEntries: [], lastEntriesTitles: [], history: [], saveHistory: true, lastCheck: ''}; } var div = document.body.appendChild(document.createElement('div')); var watcher = div.appendChild(document.createElement('a')); watcher.textContent = site; watcher.target = '_blank'; watcher.href = sites[site].openPageURL || sites[site].checkPageURL; } localStorage['IMDbChartsHistory.netData'] = JSON.stringify(netData); if(!location.hash){getAll();} } /******************************************************************************/ function getAll() { var watchers = document.querySelectorAll('a'); for (var i = 0, watcher; watcher = watchers[i]; i++) { window.setTimeout(getDoc, i*2000, watcher); } } /******************************************************************************/ function getDoc(watcher) { watcher.style.backgroundImage = 'url('+ throbber + ')'; var site = watcher.textContent; var xhr = new XMLHttpRequest(); xhr.open('GET', sites[site].checkPageURL, true); xhr.setRequestHeader('Accept-Language','en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'); xhr.responseType = 'document'; xhr.timeout = 10000; xhr.withCredentials = true; xhr.onload = function() { processDoc(this.response, watcher); }; xhr.ontimeout = xhr.onerror = function(evt) { watcher.parentNode.appendChild(document.createElement('pre')).textContent = evt.type.charAt(0).toUpperCase() + evt.type.slice(1) + '.'; watcher.style.backgroundImage = 'none'; }; xhr.send(null); } /******************************************************************************/ function processDoc(doc, watcher) { var site = watcher.textContent; var siteData = netData[site]; var keyElements = doc.querySelectorAll(sites[site].keyElementsSelector); var info, news; if (keyElements.length) { var now = new Date(Date.now()).toLocaleString(); var curEntries = [].map.call(keyElements, function(el) { el.search = ''; return el.href; }); var curEntriesTitles = [].map.call(keyElements, function(el) { return el.textContent; }); if (siteData.lastEntries.length) { var added = curEntries.filter(function(el) { return siteData.lastEntries.indexOf(el) == -1; }).map(function(el) { var ci = curEntries.indexOf(el); return '+ ' + (ci + 1) + '\t<a href="' + el + '">' + curEntriesTitles[ci] + '</a>'; }); var removed = siteData.lastEntries.filter(function(el) { return curEntries.indexOf(el) == -1; }).map(function(el) { var li = siteData.lastEntries.indexOf(el); return '- (' + (li + 1) + ')\t<a href="' + el + '">' + siteData.lastEntriesTitles[li] + '</a>'; }); var risen = siteData.lastEntries.filter(function(el, li) { var ci = curEntries.indexOf(el); return ci > -1 && ci < li; }).map(function(el) { var ci = curEntries.indexOf(el); return 'â ' + (siteData.lastEntries.indexOf(el) + 1) + '\tâ\t' + (ci + 1) + '\t<a href="' + el + '">' + curEntriesTitles[ci] + '</a>'; }); var fallen = siteData.lastEntries.filter(function(el, li) { return curEntries.indexOf(el) > li; }).map(function(el) { var ci = curEntries.indexOf(el); return 'â ' + (siteData.lastEntries.indexOf(el) + 1) + '\tâ\t' + (ci + 1) + '\t<a href="' + el + '">' + curEntriesTitles[ci] + '</a>'; }); news = added.length || removed.length || risen.length || fallen.length; info = now + ' (previous check: ' + siteData.lastCheck + ')<hr>' + (news? [added.join('\n'), removed.join('\n'), risen.join('\n'), fallen.join('\n')] .filter(function(el){return el.length;}).join('\n\n') : 'No news.' ); } else { info = now + '<hr>First launch. Data saved (' + curEntries.length + ' entries).'; } watcher.parentNode.appendChild(document.createElement('pre')).innerHTML = info; var historyHeader = watcher.parentNode.appendChild(document.createElement('pre')); var historyOptionLabel = historyHeader.appendChild(document.createElement('label')); var historyOption = historyOptionLabel.appendChild(document.createElement('input')); historyOption.type = 'checkbox'; historyOption.checked = siteData.saveHistory; historyOption.addEventListener('click', toggleHistory); historyOptionLabel.appendChild(document.createTextNode('Save history')); var clearer = historyHeader.appendChild(document.createElement('button')); clearer.type = 'button'; clearer.textContent = 'Clear history'; clearer.disabled = !siteData.history.length; clearer.addEventListener('click', clearHistory); watcher.parentNode.appendChild(document.createElement('pre')).innerHTML = siteData.history.length? siteData.history.join('\n<hr>\n') : 'No history.'; siteData.lastEntries = curEntries; siteData.lastEntriesTitles = curEntriesTitles; if (news && siteData.saveHistory) {siteData.history.unshift(info);} siteData.lastCheck = now; localStorage['IMDbChartsHistory.netData'] = JSON.stringify(netData); } else { watcher.parentNode.appendChild(document.createElement('pre')).textContent = 'Parsing error.'; } watcher.style.backgroundImage = 'none'; } /******************************************************************************/ function toggleHistory(evt) { var site = evt.target.parentNode.parentNode.parentNode.querySelector('a').textContent; var siteData = netData[site]; siteData.saveHistory = evt.target.checked; localStorage['IMDbChartsHistory.netData'] = JSON.stringify(netData); } /******************************************************************************/ function clearHistory(evt) { var site = evt.target.parentNode.parentNode.querySelector('a').textContent; var siteData = netData[site]; siteData.history = []; evt.target.parentNode.parentNode.querySelector('pre:last-of-type').innerHTML = 'History cleared.'; localStorage['IMDbChartsHistory.netData'] = JSON.stringify(netData); evt.target.disabled = true; } /******************************************************************************/ </script> </head> <body></body> </html>
VII. ã¢ããª
1. IE â , HTML-. , IE , :
-
<!doctype html> <html> <head><meta charset="UTF-8"><title>Bookmarklets</title></head> <body style="text-align: center; font-family: monospace; font-size: 12pt;"> <p><a href="javascript:(function(url, xhr) {if(!url) {return;}xhr = new XMLHttpRequest();try {xhr.open('HEAD', url, true);}catch (e) {alert(e.name + ': ' + e.message);return;}xhr.setRequestHeader('Accept-Language', 'en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001');xhr.responseType = 'document';xhr.timeout = 10000;xhr.withCredentials = true;xhr.onload = function(evt, l) {l = this.getResponseHeader('Content-Length');alert([this.responseURL || '?',this.getResponseHeader('Content-Type') || '?',this.getResponseHeader('Last-Modified') || '?',l ?[l + ' B',(l / 1024) .toFixed(3) + ' kB',(l / 1048576) .toFixed(3) + ' MB',(l / 1073741824).toFixed(3) + ' GB'].join(' \u2248 '):'?'].join('\n\n') + '\n\n');};xhr.ontimeout = xhr.onerror = function(evt) {alert(evt.type.charAt(0).toUpperCase() + evt.type.slice(1) + '.');};try {xhr.send(null);}catch (e) {alert(e.name + ': ' + e.message); return;}})(document.activeElement.href || prompt('URL:'))"> </a></p> <p><a href="javascript:(function(e,t,n,a,A,i,r,o,l,p,d,s){function h(e,t){s.style.backgroundImage='url('+n+')',t=new XMLHttpRequest;try{t.open('GET',e.href,!0)}catch(a){return s.style.backgroundImage='none',void(s.textContent=a.name+': '+a.message)}t.setRequestHeader('Accept-Language','en-US,en;q=0.8,ru;q=0.6,uk;q=0.4,qya;q=0.001'),t.responseType='document',t.timeout=1e4,t.withCredentials=!0,t.onload=function(){s.style.backgroundImage='none',this.response&&this.response.title?(s.textContent=this.response.title,e.setAttribute('data-breadcrumbs-doc-title',this.response.title)):(s.textContent='?',e.setAttribute('data-breadcrumbs-doc-title','?'))},t.ontimeout=t.onerror=function(e){s.style.backgroundImage='none',s.textContent=e.type.charAt(0).toUpperCase()+e.type.slice(1)+'.'};try{t.send(null)}catch(a){s.style.backgroundImage='none',s.textContent=a.name+': '+a.message}}for(t=e.activeElement.href?e.activeElement:location,n='data:image/gif;base64,R0lGODlhEAAQAOMIAAAAABoaGjMzM0xMTGZmZoCAgJmZmbKysv///////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgAIACwAAAAAEAAQAAAESBDJiQCgmFqbZwjVhhwH9n3hSJbeSa1sm5GUIHSTYSC2jeu63q0D3PlwCB1lMMgUChgmk/J8LqUIAgFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UKgmFqbpxDV9gAA9n3hSJbeSa1sm5HUMHTTcTy2jeu63q0D3PlwDx2FQMgYDBgmk/J8LqWPQuFRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YSgmFqb5xjV9gQB9n3hSJbeSa1sm5EUQXQTADy2jeu63q0D3PlwDx2lUMgcDhgmk/J8LqUPg+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+cagmFqbJyHV9ggC9n3hSJbeSa1sm5FUUXRTEDy2jeu63q0D3PlwDx3FYMgAABgmk/J8LqWPw+FRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+QihmFqbZynV9gwD9n3hSJbeSa1sm5GUYXSTIDy2jeu63q0D3PlwDx3lcMgEAhgmk/J8LqUPAOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+UqhmFqbpzHV9hAE9n3hSJbeSa1sm5HUcXTTMDy2jeu63q0D3PlwDx0FAMgIBBgmk/J8LqWPQOBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+YyhmFqb5znV9hQF9n3hSJbeSa1sm5EUAHQTQTy2jeu63q0D3PlwDx0lEMgMBhgmk/J8LqUPgeBRhV6z2q0VF94iJ9pOBAAh+QQBCgAPACwAAAAAEAAQAAAESPDJ+c6hmFqbJwDV9hgG9n3hSJbeSa1sm5FUEHRTUTy2jeu63q0D3PlwDx1FIMgQCBgmk/J8LqWPweBRhV6z2q0VF94iJ9pOBAA7',a=e.createElement('div'),a.setAttribute('data-breadcrumbs-main',''),a.appendChild(e.createElement('style')).textContent='div[data-breadcrumbs-main] {position:fixed; top:0px; left:0; z-index:999999; width:100%; padding:10px !important; background-color:white !important; outline:1px solid black !important; font-size: 12pt !important; text-align: left !important;}\ndiv[data-breadcrumbs-main] a {font-size: 12pt !important; text-decoration: underline !important;}\ndiv[data-breadcrumbs-main] div {margin-top: 20px!important; color: silver !important;}\ndiv[data-breadcrumbs-info-title] {background-repeat: no-repeat !important; background-position: left center !important; padding-left: 20px !important;}',A=t.protocol+(/:[\/][\/]/.test(t.href)?'//':''),a.appendChild(e.createElement('span')).textContent=A,i=t.hostname.split('.'),r=i.length,r>1&&(i.splice(r-2,2,i.slice(r-2).join('.')),r--),o=0;r>o;o++)l=i[o],o>0&&(a.appendChild(e.createElement('span')).textContent='.'),p=a.appendChild(e.createElement('a')),p.textContent=l,p.href=A+i.slice(o).join('.');if(A+=t.hostname,t.port&&/:\d+$/.test(t.host)&&(a.appendChild(e.createElement('span')).textContent=':',p=a.appendChild(e.createElement('a')),p.textContent=t.port,A+=':'+t.port,p.href=A),a.appendChild(e.createElement('span')).textContent='/',A+='/',t.pathname.length>1)for(i=t.pathname.split('/'),i.shift(),r=i.length,o=0;r>o;o++)l=i[o],r-1>o?(p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,a.appendChild(e.createElement('span')).textContent='/',A+='/',p.href=A):''!==l&&(p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,p.href=A);if(t.search)for(i=t.search.split('&'),r=i.length,i[0]=i[0].substring(1),a.appendChild(e.createElement('span')).textContent='?',A+='?',o=0;r>o;o++)l=i[o],o>0&&(a.appendChild(e.createElement('span')).textContent='&',A+='&'),p=a.appendChild(e.createElement('a')),p.textContent=l,A+=l,p.href=A;t.hash&&(a.appendChild(e.createElement('span')).textContent='#',p=a.appendChild(e.createElement('a')),p.textContent=t.hash.substring(1),A+=t.hash,p.href=A),a.querySelector('a:last-of-type').href==location.href&&a.querySelector('a:last-of-type').setAttribute('data-breadcrumbs-doc-title',e.title),d=a.appendChild(e.createElement('div')),d.setAttribute('data-breadcrumbs-info-url',''),d.textContent='URL',s=a.appendChild(e.createElement('div')),s.setAttribute('data-breadcrumbs-info-title',''),s.textContent='Title',a.addEventListener('mouseover',function(e,t,n){(t=e.target.href)&&(d.textContent=t,(n=e.target.getAttribute('data-breadcrumbs-doc-title'))?s.textContent=n:h(e.target))}),a.addEventListener('dblclick',function(){a.parentNode.removeChild(a)}),e.body.appendChild(a)})(document)"> </a></p> </body> </html>
2. - , , , ( IE):
Internet Explorer 11ã®ããã¯ããŒã¯ã¬ããïŒã¹ãã¬ãŒãžåœ¢åŒãå¶éãšæé»ã®ã«ãŒã«ãæœãã§ãããã°
ããã¯ããŒã¯ã¬ããïŒXPathãå©çšã§ãããã»ã¬ã¯ã¿ãŒãšDOMããã²ãŒã·ã§ã³ã¡ãœãããååã§ãªãå Žå
ããã¯ããŒã¯ã¬ããçšã®ä¿¡é Œã§ããlocalStorage
ãæž èŽããããšãããããŸããïŒ
PS ä»®æ³ãã·ã³ããã§ãã¯ãããšã2015幎7æ22æ¥ïŒãã¡ã€ã«ããŒãžã§ã³ã«ããïŒã®MS EdgeããŒãžã§ã³11.00.10240.16397ã§ã20.10240.16384.0ïŒèšå®ã®æ å ±ã«ããïŒã§ãããããšã瀺ãããŸã
ãåºæ¬ããã³ãµãŒãããŒãã£ã®Cookieã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠãããããè¿œå ã®èšå®
XMLHttpRequest.withCredentials
ã¯äžèŠã§ãã
bã
null Access-Control-Allow-Origin
ãªãã€ã¬ã¯ãäžã®ãšã©ãŒã¯çºçããªããªããŸããããªãã€ã¬ã¯ãåŸããã¹ãŠãæå³ãããšããã«æ©èœãããã
Origin
éä¿¡ãã
null
ãŸãã
cãããããã£
navigator.languages
ã¯ãŸã å®è£ ãããŠããŸããã
dãããããã£
XMLHttpRequest.responseURL
ã¯ãŸã å®è£ ãããŠããŸããã
eã
localStorage
ããŒã«ã«ããŒãžã®ããŒã«ã«ããŒãžã®ã¹ãã¬ãŒãžã¯ãŸã å®è£ ãããŠããŸããã