Статья Беспалевная автоматизация накрутки рекламы на сайте

2.jpg

Доброй ночи дамы и господа. Недавно была тема на форуме, про то, как можно зарабатывать в интернете. Так вот сегодня хочу показать один из достаточно эффективных способов подзаработать неплохие деньги на рекламе на сайте.


[0] - Немного теории


Данный способ, в плохом его виде, для использования, давно крутится в интернете. Я и мой друг решили его автоматизировать и заставить зарабатывать его для нас деньги, и чтобы делал он это при минимальном нашем участии.

И тут возникает вопрос, как сделать, чтобы:
  • Не палила рекламная сеть
  • Сделать автоматизированным, чтобы работала сама по себе

Поизучив, как рекламные сети рассчитывают клики, показы и все такое и на основе найденной информации в интернете, пришли к тому, что хватает всего то лишь менять соксы, уже просто при подмене соксов, рекламная сеть не палит. Но для большей надежности, мы стали еще менять и User-agents. И тут уже, вероятность, что тебя спалят, ничтожно мала, только если будешь боршить.


[1] - Вектор атаки

Какие рекламные сети мы сейчас используем и где пока все успешно проходит. На данный момент, у меня несколько сайтов, и на информационных сайтах висят реклама от гугла и киносайты, где висит реклама от Adforce. Хотел все показать на примере одного сайта, но подумав решил все-таки не палить сайт, кто-то может бросить кто-то жалобу и все)).

Проблем еще не возникало, только в Адсенсе, где-то 20% не считает, в остальном все ок. Ниже скрин 1го киносайта с Adforce.

1.jpg



[2] - Техническая сторона

Как я уже выше писал, мы в итоге нашли способ для автоматизации, барабанная дробь – это Selenium + Python + PHP (Для парсинга и чекинга соксов).

Про Selenium ( ) подробнее читать тут –

Вкратце объясню, как работает код. Парсер парсит соксы с определнного сайта, куда они выкладываются постоянно, после чего файл с соксами скармливаем Питон, где обрабатывается и по очереди, подставляя, каждый соксы заходит на сайт, не просто открывает сайт и заходит, а вбивает ключевое слово в поисковике, оттуда переходит на сайт, где еще шастает по 2-3 статьям и наконец кликает, цикл прошел успешно, и все повторяется заново, пока не закончатся соксы.

Ну и код соответственно выглядит такие образом. Все это в процессе разработки, так что, если у кого есть идеи прошу написать ниже:
Код:
import time
from random import choice
from random import uniform
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import ElementNotVisibleException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import requests


def pref_data():
    sokcs = ''
    with open('socks.txt', 'r') as f:
        socks = f.read()

    socks = socks.split('\n')
    r_ua = requests.get('http://site.ru/parser/useragents.html')
    ua = r_ua.text.split('\n')
  
    #r_socks = requests.get('http://site.ru/parser/socks5.html')
    #socks = r_socks.text.split('\n')

    return socks, ua
  

def set_pref(ua, socks):
    socks = socks.split(':')
    socks_ip = socks[0]
    socks_port = int(socks[1])

    profile = webdriver.FirefoxProfile()

    profile.set_preference("network.proxy.type", 1)
    profile.set_preference("network.proxy.socks", socks_ip)
    profile.set_preference("network.proxy.socks_port", socks_port)
    profile.set_preference("network.proxy.socks_version", 5)
    profile.update_preferences()

    #profile.set_preference("general.useragent.override", ua)
    #profile.update_preferences()
    return profile

def init_driver(profile):
    driver = webdriver.Firefox(profile) #profile
    driver.wait = WebDriverWait(driver, 20)
    return driver

def browse():
    try:
        driver.get("https://www.google.com/")
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, "q")))
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, "btnK")))
        box.send_keys("Ключевое слово")
        try:
            button.click()
        except ElementNotVisibleException:
            button = driver.wait.until(EC.visibility_of_element_located(
                (By.NAME, "btnG")))
            button.click()
    except:
        return 0
    driver.implicitly_wait(60) #неявное ожидание по умолчанию
    step = "step 1/7 "
    print(step)
    try:
        driver.get(driver.find_element_by_xpath("//a[contains(text(),'Site')]").get_attribute('href'))
        time.sleep(7)
        links = ["След Сокола (1968)","Волк (2009)", "Выбор короля (2016)", "Меч короля Артура (2017)", "Прибытие (2016)"]
      
        time.sleep(6)
        link = driver.find_element_by_link_text(choice(links))
        time.sleep(3)
        link.click()
        time.sleep(8)
        step = "step 2/7 "
        print(step)
        down = driver.find_element_by_tag_name('body')
        down.send_keys(Keys.END)
        time.sleep(15)
      
        #=========================================================== действие с баннерами
        X = [800] #[370, 950]
        Y = [400] #[414, 245]
        banners = 0
      
        actions = ActionChains(driver)
      
        time.sleep(5)
        actions.move_by_offset(X[banners], Y[banners]).click().perform()
        step = "step 3/7 "
        print(step)
        time.sleep(15)
      
        scroll_win = "window.scrollTo(0, {} );".format(int(uniform(50, 200)))
        driver.execute_script(scroll_win)
        time.sleep(25)
        h = 0
        step = "step 4/7 "
        print(step)
        for i in driver.window_handles:
            h +=1
          
            step = "step 5/7 " + "h = " + str(h)
            print(step)
        if h > 0:
            time.sleep(10)

            actions = ActionChains(driver)
            actions.move_by_offset(int(uniform(30, 400)), int(uniform(20,280))).click().perform()
            step = "step 6/7 "
            print(step)
            time.sleep(8)

            scroll_win = "window.scrollTo(0, {} );".format(int(uniform(50, 500)))
            driver.execute_script(scroll_win)
            step = "step 7/7 "
            print(step)
            time.sleep(6)

        #============================================================сохранение логов
        log_str = ""
        log_str = '\t' + "good - " + step + str(time.asctime() )+ '\n'
        with open('log.txt', 'a') as f:
            f.write(log_str)         
      
        time.sleep(10)
        #________________________________________________________
    except Exception as inst:
        print(inst)
        print("bad-----")
        log_str = ""
        log_str = '\t' + "bad - " + step + str(time.asctime() )+ '\n'
        with open('log.txt', 'a') as f:
            f.write(log_str) 


if __name__ == "__main__":
    socks, ua = pref_data()
    l = len(socks)-1
    print(l, socks)
    step = "000"

    log_str = ""
    log_str = "<<< Start " + "soks = "+ str(l) + " --Date-- " + str(time.asctime() ) + '\n'
    with open('log.txt', 'a') as f:
        f.write(log_str)

    for count in range(l):
        try:
            profile = set_pref(ua[count], socks[count])
            driver = init_driver(profile)
            browse()
            #print("good+++++")
            time.sleep(3)
        except Exception as inst:
            print(inst)
        finally:
          
            driver.quit()
            time.sleep(10)

А с помощью это кода, парсим и чекаем соксики )):
PHP:
//    TODO: Парсер и Чекер Socks5

require 'phpQuery.php';

$file = 'socks5.html';
$proxyList = [];

$url = 'https://www.socks-proxy.net/';
$html = file_get_contents($url);

$doc = phpQuery::NewDocument($html);

foreach ($doc->find('table tbody tr') as $one_tbl) {
    $one_tbl = pq($one_tbl);
    $ip = $one_tbl->find('td:eq(0)')->text();
    $port = $one_tbl->find('td:eq(1)')->text();

    $socks = $ip . ':' . $port;

    //if (check('https://www.google.ru/', $socks))
        $proxyList[] = $socks;
}

//    запись в файл
if ($fp = fopen($file, "w")) {
    for ($i = 0; $i < count($proxyList); $i++)
        fwrite($fp, $proxyList[$i] . PHP_EOL);
    fclose($fp);
}

echo '<pre>';
print_r($proxyList);
echo '</pre>';

Чекер в парсере работает не совсем корректно, можете предложить варианты реализации. Невалидных сейчас, исключает селениум сам, но там на проверку время тратится зря. Все это дело, работает не так быстро, как хотелось бы, но пока то что есть. Если не хотите, чтобы это происходило у вас на компе, тогда берем VPS на винде или линухе, только чтобы с рабочим столом была. И запускаем все это дело там, чтобы работала себе на фоне.

На этом у меня всем. Всем много денет!
 
Последнее редактирование:
V

Valkiria

Я пока ещё только поверхностно ознакомилась с содержанием статьи.
Но уже на этом этапе возник вопрос: не легче автоматизацию всего процесса выполнить при помощи ZennoPostera ?
 

r0hack

DAG
Platinum
29.09.2017
522
1 088
BIT
0
Я пока ещё только поверхностно ознакомилась с содержанием статьи.
Но уже на этом этапе возник вопрос: не легче автоматизацию всего процесса выполнить при помощи ZennoPostera ?
Не особо знаком с этой программой, но насколько мне известно она не сможет все это выполнять. Ну и зачем искать легкие пути )
[doublepost=1513728957,1513727673][/doublepost]Я даже кажется пробовал с помощью Зенно все это реализовать, но не помню, не получилось или описанный выше метод все - таки оказался эффективнее. Вспомнил, потому что брал Зенно на складчине и да если кому нужен, полноценный и с бонусами воть:

upload_2017-12-20_3-5-22.png
 

r0hack

DAG
Platinum
29.09.2017
522
1 088
BIT
0
а что делать если соксы кончились?
Ну во первых боршить не стоит с кликами, особенно с адсенс, может спалить, в день максимум 30 кликов.
А с адфорсом можно побольше, откуда а граблю соксы, за раз парсится 80 штук, и больше этого просто не нужно было)).
А если нужно еще, то можно и со второй страницы парсит и с других сайтов еще парсить, плюс они же обновляются, как часто не знаю, но в сутки 1 раз точно.
[doublepost=1513861230,1513861182][/doublepost]
в день максимум 30 кликов.
И это посещаемость зависит, если посещаемость 50 чел и 30 кликов, то это уже как-то палевно... ну вы поняли
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!