Автоматизация процесса работы в CPA

Автоматизация процесса

Как это работает?

Для начала, если вы не читали статью ДиректАдверт и 25 кадр, то обязательно прочитайте, нам ведь нужно знать для чего весь этот сыр-бор.

from grab import Grab, UploadFile # (1)
import os, re, random, time

with open('accounts.txt') as f: accounts = f.read().splitlines() # (2)
teasers_count = [0]
all_bl, texts_bl, pics_bl = [], [], []

  1. (1) — Для работы будем использовать специальную библиотеку Grab, как по мне это самая удобная библиотека для решения подобных задач на сегодняшний день. Раньше я пользовался исключительно urllib и urllib2 и считал себя крутым, а зря. Так же импортируем другие необходимые для работы модули.
  2. (2) — Аккаунты для работы, раньше я использовал несколько аккаунтов, сейчас только 1. Переменная teasers_count создана для удобства, она будет считать количество уже имеющихся тизеров на аккаунте и поэтому каждому новому тизеру будет приписываться правильный номер. Остальные переменные используются в качестве блек-листа.

@timer
def main():
    url = 'http://www.directadvert.ru/login/'

    for account in accounts:
        BOT = DA(url, account.split(':')[0], account.split(':')[1])
        BOT.DA_Run() # Запускаем бота

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

class DA(object): # Класс запуска бота

    def __init__(self, url, login, pwd):
        self.url = url
        self.login = login
        self.pwd = pwd

    def DA_Run(self):
        teasers_num = 0; path = os.getcwd()
        dirs = filter(lambda dir: os.path.isdir(dir), os.listdir('.')) # Папки с тизерами
        g = self.Login() # Сначала авторизуемся в системе

  # ——————————— Добавляем 5 тизеров
        while teasers_num < 7: # Загружаем по 5 тизеров
            g.go('http://www.directadvert.ru/ad_add/'); time.sleep(1) # Нажимаем кнопку "Добавить объявление"
            dir, full_text, pic, image_filename = False, False, False, False

            while not dir: # До тех пор пока не выбрали директорию
                dir = random.choice(dirs)
                if dir in all_bl: dir = False; continue # Не берем директорию из блека
                os.chdir(path + slash + dir); print u"Создаем тизер из директории — %s" % dir
                pics = filter(lambda pic: pic.split('.')[-1] == 'jpg' or pic.split('.')[-1] == 'png', os.listdir('.')) # Картинки для тизеров

            while not full_text: # До тех пор пока не выбрали текст
                with open('text.txt') as f: texts = f.read().splitlines() # Тексты для тизеров
                full_text = random.choice(texts) # Берем рандомный текст
                title = full_text.split(':')[0].decode('cp1251').encode('utf-8')
                text = ':'.join(full_text.split(':')[1:]).decode('cp1251').encode('utf-8')

            while not pic and not image_filename: # До тех пор пока не выбрали и не загрузили картинку
                try:
                    pic = random.choice(pics)
                    g.go('http://www.directadvert.ru/load_img/', multipart_post={'MAX_FILE_SIZE' : '500000', 'is_banner' : '0', 'imgfile' : UploadFile(pic)}); time.sleep(random.uniform(3, 10)) # Загружаем картинку
                    image_filename = re.findall(r'.value = '(.+?)'', g.response.body, re.S)[0] # Получаем номер картинки
                except Exception as err:
                    if re.search(r'слишком маленького размера'.decode('cp1251').encode('utf-8'), g.response.body): print u"Возникла ошибка при загрузке картинки — картинка слишком маленькая, пробуем заного …
"; time.sleep(5)
                    else: print u"Возникла ошибка при загрузке картинки — %s, пробуем заного …
" % str(err); time.sleep(5)

            try:
                print u"Создаем объявление: Тайтл — %s
Текст — %s
ID картинки — %s" % (title.decode('utf-8'), text.decode('utf-8'), image_filename)
                g.go('http://www.directadvert.ru/ad_add/', multipart_post={'action' : 'add', 'id' : '', 'is_banner' : '0', 'image_filename' : image_filename, 'title' : title, 'announce' : text, 'url' : 'http://site.ru/?sub=DirectAdvert_%s' % (teasers_count[0] + 1), 'price_buy' : '2', 'group_id' : '0', 'group_name' : '', 'action_url' : '', 'x' : str(random.randint(10, 150)), 'y' : str(random.randint(10, 150))}); time.sleep(random.uniform(3, 10)) # Создаем объявление
                teaser_id = re.findall(r'colTeaser"><a name="(.+?)"', g.response.body, re.S)[0].replace('ad', '') # ID Созданного объявления
                print u"Создали объявление, его ID — %s
" % teaser_id; teasers_count[0] += 1; texts_bl.append(full_text); pics_bl.append(pic); all_bl.append(dir); os.chdir(path); teasers_num += 1
                with open('teaser_ids.txt', 'a') as f: f.write('%s
' % teaser_id); time.sleep(5) # Записываем ID тизера в файл и спим 5 секунд
            except Exception as err: print u"Возникла ошибка при создании тизера — %s, спим 15 секунд …" % str(err); time.sleep(15)
  # ———————————

    def Login(self): # Метод авторизации в системе
        g = Grab()
        g.go(self.url); time.sleep(1)

        while not re.search(r'У вас на счёте'.decode('cp1251').encode('utf-8'), g.response.body, re.I): # До тех пор пока не вошли в систему
            try: g.go('http://www.directadvert.ru/login', post={'action' : 'login', 'login' : self.login, 'password' : self.pwd, 'x' : str(random.randint(10, 150)), 'y' : str(random.randint(10, 150))}); time.sleep(1) # Входим в систему
            except Exception as err: print u"Возникла ошибка — %s, спим немного и продолжаем …" % str(err); time.sleep(10)

        try: 
            teasers_count[0] = len(re.findall(r'colTeaser"><a name="(.+?)"', g.response.body, re.S)) # Количество текущих тизеров на аккаунте
            print u"Успешно авторизовались в системе, сейчас на аккаунте — %i тизеров, начинаем добавлять тизеры …
" % teasers_count[0]; return g.clone()
        except: print u"Успешно авторизовались в системе, тизеров на аккануте нет, начинаем добавлять тизеры …
"; return g.clone()

Класс загрузки тизеров собственной персоны. Можно было бы прикрутить многопоточность унаследовав threading.Thread, но так как мы работаем с 1 аккаунтом, то смысла в этом нет. В методе DA_Run мы в начале получаем все папки с тизерами, кстати в каждой папке должна быть картинка и текст. Затем авторизуемся в системе методом Login с заранее известными параметрами из __init__. Так же после авторизации определяем сколько у нас тизеров на аккаунте.

Далее переходим на страницу загрузки тизеров, выбираем такую директорию, которую раньше еще не использовали, потому что дубли модерацию не пройдут. Потом из выбранной директории выбираем картинку, заголовок и текст объявления. После этих манипуляций мы загружаем картинку на сервер с помощью опции библиотеки Grab — multipart_post, получаем её ID, и затем создаем объявление с выбранными ранее параметрами. Сайт естественно ставите свой. Параметры x и y — это координаты клика мыши на экране, можно взять любые. Попутно обрабатываем все ошибки которые возникают крайне редко, в конце записываем ID созданного тизера в файл — для статистики.

По поводу обхода фильтра массовой загрузки. Тут все просто, если вы заметили, то после каждого шага у меня расставлены timeout's — они то и не дают системе определить кто загружает тизеры, бот или человек. Весь код бота вы можете посмотреть вот тут.

На этом у меня все, скоро будут новые темы, новые фишки, подписывайтесь на блог, не пропустите интересные посты!

Отправить ответ

Оставьте первый комментарий!

Notify of
avatar
wpDiscuz