package Ġedu . is istan . f aken ews . sc rapper Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġorg . openqa . selenium . Javascript Executor Ċ import Ġjava . net . Server Socket Ċ import Ġorg . openqa . selenium . WebDriver Ċ import Ġorg . openqa . selenium . firefox . Firefox Binary Ċ import Ġorg . openqa . selenium . firefox . Firefox Driver Ċ import Ġorg . openqa . selenium . firefox . Firefox Options Ċ import Ġorg . openqa . selenium . firefox . Firefox Profile Ċ import Ġorg . openqa . selenium . support . ui . WebDriver Wait Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . lang . StringBuilder Ċ import Ġjava . net . Socket Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . util . concurrent . Semaphore Ċ import Ġkotlin . system . exit Process ĊĊ Ċ fun Ġinit Firefox With Sc rapper Extension (): ĠWebDriver Ġ{ ĊĠĠĠ Ġval Ġbin Ġ= ĠSystem . getProperty (" screenshot . bin ") ĊĠĠĠ Ġval Ġdriver Bin Ġ= ĠSystem . getProperty (" screenshot . driver ") ĊĠĠĠ Ġval Ġdebugger Port Ġ= Ġget Free Port () ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġbin Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedu . is istan . f aken ews . web crawler . LOGGER . error (" Property Ġscreenshot . bin Ġis Ġnot Ġdefined ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdriver Bin Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedu . is istan . f aken ews . web crawler . LOGGER . error (" Property Ġscreenshot . driver Ġis Ġnot Ġdefined ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ ĠSystem . setProperty (" webdriver . ge cko . driver ", Ġdriver Bin ) ĊĠĠĠ Ġval Ġff Binary Ġ= ĠFirefox Binary ( File ( bin )) ĊĊĠĠĠ Ġval Ġfo Ġ= ĠFirefox Options () ĊĠĠĠ Ġ// fo . set Head less ( true ) ĊĠĠĠ Ġfo . add Arguments ("- start - debugger - server ", Ġdebugger Port . toString ()) ĊĠĠĠ Ġfo . profile Ġ= ĠFirefox Profile () ĊĠĠĠ Ġfo . profile . set Preference (" devtools . debugger . remote - enabled ", Ġtrue ) ĊĠĠĠ Ġfo . profile . set Preference (" devtools . debugger . prompt - connection ", Ġfalse ) ĊĠĠĠ Ġfo . profile . set Preference (" devtools . chrome . enabled ", Ġtrue ) ĊĠĠĠ Ġfo . binary Ġ= Ġff Binary ĊĠĠĠ Ġval Ġdriver Ġ= ĠFirefox Driver ( fo ) ĊĊĠĠĠ ĠWebDriver Wait ( driver , Ġ 1 0 ) ĊĊĠĠĠ Ġval Ġextension File Ġ= ĠFile ( System . getProperty (" tweet er Sc rapper . extensions ", Ġ" no - file ")) ĊĠĠĠ Ġif Ġ(! extension File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOGGER . error (" Extension Ġdirectory Ġ${ extension File . absolute Path } Ġnot Ġfound . ĠCheck Ġtweet er Sc rapper . extension Ġconfiguration ") ĊĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġload Extension ( extension File . absolute Path , Ġdebugger Port ) ĊĠĠĠ Ġreturn Ġdriver Ċ } Ċ Ċ private Ġfun Ġget Free Port (): ĠInt Ġ{ ĊĠĠĠ Ġval Ġserver Ġ= ĠServer Socket ( 0 ) ĊĠĠĠ Ġval Ġport Ġ= Ġserver . local Port ĊĠĠĠ Ġserver . close () ĊĠĠĠ Ġreturn Ġport Ċ } Ċ Ċ private Ġclass ĠRead Messages ( val Ġi is : ĠInputStream , Ġval Ġcallback : Ġ( String )-> Unit ): ĠRunnable Ġ{ ĊĠĠĠ Ġvar Ġexception : ĠException ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsep Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġi is . read ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠString ( bytes . slice Array ( 0 Ġuntil Ġlen )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsep Ġ= Ġmsg . indexOf (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġmsg . substring ( 0 Ġuntil Ġsep ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( msg . length Ġ- Ġsep Ġ- Ġ 1 ) Ġ== Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . exception Ġ= Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( sb . length Ġ- Ġsep Ġ- Ġ 1 ) Ġ== Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . callback ( sb . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġthrow Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( exception !! ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġload Extension ( path : ĠString , Ġport : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġsocket Ġ= ĠSocket (" localhost ", port ) ĊĠĠĠ Ġval Ġready Ġ= ĠSem aphore ( 0 ) ĊĊĠĠĠ Ġval Ġi is Ġ= Ġsocket . getInputStream () ĊĠĠĠ Ġval Ġo os Ġ= Ġsocket . get OutputStream () ĊĊĠĠĠ Ġvar Ġmsg Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtarget : ĠString ĊĠĠĠ Ġval Ġreader Ġ= ĠRead Messages ( i is ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmsg ++ ĊĠĠĠĠĠĠĠ Ġ// println ( it ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( msg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write (" 3 0 :{ \" to \":\" root \",\" type \":\" getRoot \" }". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo os . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsep Ġ= Ġit . indexOf (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġval Ġparsed Ġ= Ġgson . fromJson ( it . substring ( sep Ġ+ Ġ 1 ), ĠMap :: class . java ) Ġas ĠMap < String , ĠString > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġparsed [" addons Actor "] Ġ?: Ġerror (" Addon ĠActor Ġunavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug (" Firefox Ġaddon Ġactor : Ġ{}", Ġtarget ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Map Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" to " Ġto Ġtarget , Ġ" type " Ġto Ġ" install Temporary Addon ", Ġ" addon Path " Ġto Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġgson . toJson ( payload Map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write ("${ payload . length }: $ payload ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo os . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠThread ( reader ). start () ĊĠĠĠ Ġready . acquire () ĊĠĠĠ Ġreader . throw Exception () Ċ } ĊĊ Ċ fun Ġwindow Inner Height ( javascript Executor : ĠJavascript Executor ): ĠLong Ġ{ ĊĠĠĠ Ġreturn Ġjavascript Executor . execute Script (" return Ġwindow . innerHeight ") Ġas ĠLong Ċ } Ċ Ċ fun Ġwindow Scroll Y ( javascript Executor : ĠJavascript Executor ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġo Ġ= Ġjavascript Executor . execute Script (" return Ġwindow . scroll Y ") ĊĠĠĠ Ġif Ġ( o Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġo . to Long () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġo Ġas ĠLong Ċ } Ċ Ċ fun Ġwindow Scroll To ( javascript Executor : ĠJavascript Executor , Ġx : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġo Ġ= Ġjavascript Executor . execute Script (" return Ġwindow . scrollTo ($ x ,$ y )") Ċ }