Детали для грабали( тырить домены с гугла )

Discussion in 'PHP' started by randomword0x3f52, 4 Nov 2016.

  1. randomword0x3f52

    Joined:
    15 Oct 2016
    Messages:
    30
    Likes Received:
    25
    Reputations:
    9
    Выкладываю куски, с описанием того где и как они будут использоваться в грабле, для тыра доменов с гугловой выдачи. Куски легко понять и применять для других изделий.

    Мотивы: Заметил что гугол нормально воспринимает тебя, когда ты за тором, если у тебя исполняются js и брозер уникальный, а не типовой торнутый. Парсить страницы удобней по DOM дереву. Грузить динамичекие страницы так же удобней брозером. Вместе с vnc можно эмитировать поведение пользователя. Вообщем много плюсов и один минус: Делать адон для лисицы - та ещё камасутра.

    Раньше я пользовался хромом, но однажды захотелось сохранить фильмец, а в нём это делать просто пипец. Запустил firefox и прям за две секунды вытянул урл( теперь у меня офлайн коллекция фильмов и порнороликов ). Дальше, понадобилось однажды заменить юзер агент и ось( что бы не сверкать линуксовостью ). Хром агента меняет, а ось никак, в фоксе всё без проблем. Ещё подметил такую фигню что noscript работает лучше по блокировке js чем стандартные хромовые. Последнее что удерживало на хроме - mhtml. Но и здесь нашелся адон который сохраняет страницу целиком. А окончательно меня убедил CacheViewer. Стал я думать, раз такая гибкость, надо юзать лисицу.

    Я выбрал firefox 38.8 ESR по двум причинам:
    1) Она умет работать со старыми адонами.
    2) Менее привередлива к ресурсам.
    Заметил что старый noscript не поддерживается в 45, а новый в торе работает не так как раньше( нахер такое новьё ). Мощь старых возможностей просто поражает. Граблю я планирую запускать на VDS c 512RAM поэтому пункт 2 важен.


    Запускал так. ( Как установить jpm https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm )
    jpm run
    Если так запускать, то в терминале видно console.log() и ошибки.

    Первое что понадобится это кнопка запуска.
    Code:
    //index.js
    var
     { Hotkey } = require( "sdk/hotkeys" )
    ,notifications = require( "sdk/notifications" )
    ,старт = Hotkey
    	( { 
    	combo : "accel-shift-1",
    	onPress : function(  )
    		{
    		notifications.notify( { title : "ГРАБЛЯ", text : "Стартанула!" } );
    		}
    	} )
    ;
    
    Ещё понадобится обмен данными с локальным сервером.( Глядеть в терминал )
    Code:
    //index.js
    var
     урл = "[URL]http://localhost/index.php[/URL]"
    ,Request = require( "sdk/request" ).Request
    ;
    function дай( урл )
    	{
    	if( typeof( урл ) == 'string' )
    		{
    		var запрос = Request
    			({
    			 url : урл
    			,overrideMimeType: "text/plain; charset=utf-8"
    			,onComplete : function( response )
    				{
    				console.log( response.text );
    				}
    			});
        	запрос.get();
        	return( true );
        	}
        return( false );
    	}
    дай( урл );
    function прими( урл, данные )
    	{
    	if( typeof( урл ) == 'string'
    	 && typeof( данные ) == 'string' )
    		{
    		var заброс = Request
    			({
    			 url : урл
    			,content : данные
    			,contentType : "text/plain"
    			});
    		заброс.post();
    		return( true );
    		}
    	return( false );
    	}
    прими( урл, "????????" );
    
    Code:
    //index.php
    <?php
    if( isset( $_SERVER[ 'REQUEST_METHOD' ] ) )
    	{
    	if( $_SERVER[ 'REQUEST_METHOD' ] == 'GET' )
    		{
    		echo( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
    		exit( 0 );
    		}
    	if( $_SERVER[ 'REQUEST_METHOD' ] == 'POST' )
    		{
    		$fd = fopen( "php://input", "r" );
    		$данные = "";
    		while( !feof( $fd ) )
    			{
    			$данные .= fread( $fd, 0x10000 );
    			}
    		file_put_contents( "../data.txt", $данные, FILE_APPEND );
    		exit( 0 );
    		}
    	}
    
    Ещё нужно уметь запустить скрипт внутри страницы и получить от неё данные.
    Code:
    //index.js
    var
     урл = '[URL]http://localhost/index.php[/URL]'
    ,tabs = require( "sdk/tabs" )
    ,tab = undefined
    ;
    tab = tabs.activeTab;
    tab.url = урл;
    tab.on( 'ready', function( tab )
    	{
    	var
    	 скрипт = { contentScriptFile : 'content.js' }
    	,worker = undefined
    	;
    	worker = tab.attach( скрипт );
    	worker.port.on( 'наружу', function( сообщение )
    		{
    		console.log( сообщение );
    		} );
    	});
    
    Code:
    //data/content.js
    alert("Грабля внутри.");
    self.port.emit( 'наружу', 'Сработало!' );
    
    Code:
    <!doctype html>
    <!-- index.php -->
    <html>
    	<head>
    		<meta http-equiv="Content Type" content="text/html; charset=utf-8" />
    		<title>ТЕСТЕР</title>
    	</head>
    	<body>
    <h1>ТЕСТОВАЯ СТРАНИЦА!</h1>
    	</body>
    </html>
    
    Теперь надо выдернуть с гугловой страницы информацию.
    Code:
    //index.js
    var
    tabs = require( "sdk/tabs" )
    ,tab = undefined
    ;
    tab = tabs.activeTab;
    tab.on( 'ready', function( tab )
    	{
    	var
    	 скрипт = { contentScriptFile : 'content.js' }
    	;
    	tab.attach( скрипт );
    	});
    
    Code:
    //data/content.js
    var
     урл = ''
    ,урлы = []
    ,след = ''
    ,текст = ''
    ,cites = []
    ,a = undefined
    ,l = 0
    ,i = 0
    ,re = /^$/
    ,ret = null
    ;
    урл = document.documentURI;
    re = /^(https\:\/\/www\.google\.[a-z]+)\/search\?.+$/;
    ret = re.exec( урл );
    if( ret != null )
    	{
    	текст += "урл: " + урл + "\n";
    	cites = document.getElementsByTagName( 'cite' );
    	l = cites.length;
    	for( i = 0; i < l; i++ )
    		{
    		if( typeof( cites[ i ].className ) == 'string'
    		 && cites[ i ].className == '_Rm' )
    			{
    			урлы.push( cites[ i ].textContent );
    			текст += i.toString() + ") " + cites[ i ].textContent + "\n";
    			}
    		}
    	a = document.getElementById( 'pnnext' );
    	след = ret[ 1 ] + a.getAttributeNode( 'href' ).value;
    	текст += "следующая: " + след;
    	alert( текст );
    	}
    
    Это не вся грабля, а её лучшая половина.( Всей грабли ещё нет )
    Центральные узлы созданы, осталась переферия.
     
    #1 randomword0x3f52, 4 Nov 2016
    Last edited: 5 Nov 2016