• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Python Фармим промокоды для DeliveryClub

SnoupS

Участник
Сообщения
10
Реакции
10
0 руб.
Telegram
Последнее редактирование:

earxow

Местный
Сообщения
293
Реакции
161
0 руб.
Telegram
на сколько % ?
 

vimen

Местный
Сообщения
185
Реакции
141
0 руб.
Для тех кто проголодался:

Скрытое содержимое
подскажи как готовый код на линуксе запустить?
если правильно понимаю, надо создать файлик и запихать туда код.
потом скомпилить? если да, то при попытке компила вижу :
Bash:
/usr/bin/ld:delivery: file format not recognized; treating as linker script
/usr/bin/ld:delivery:1: syntax error
collect2: error: ld returned 1 exit status
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
подскажи как готовый код на линуксе запустить?
установить питон на машину, поставить все зависимости, те модули которых нет в стандартной сборке питона, ну и запустить в терминале скрипт.
 

vimen

Местный
Сообщения
185
Реакции
141
0 руб.
установить питон на машину, поставить все зависимости, те модули которых нет в стандартной сборке питона, ну и запустить в терминале скрипт.
питон стоит, но вот какие модули и зависимости ставить?
 

SnoupS

Участник
Сообщения
10
Реакции
10
0 руб.
Telegram

vimen

Местный
Сообщения
185
Реакции
141
0 руб.
Bash:
print(f' PROMOCODE: {promocode} | IP: {ip}')
                                          ^
SyntaxError: invalid syntax
пишет при запуске.
кто проверял вообще?
 

PARAMEDIC

CodeLab

PARAMEDIC

CodeLab
Профи
Сообщения
536
Реакции
781
1000 руб.
Telegram
Доброго времени суток!
Сегодня я расскажу как написать скрипт на Python 3.6, который будет собирать 35% промокоды для DeliveryClub.


Итак, у нас есть сайт, где раздают одноразовые промокоды для DeliveryClub: https://dtf.ru/cheatsconsole/check?value=food
Нам нужно сделать запрос по этому адресу и получить json(словарь в Python) с нашим промокодом.


Используемые библиотеки:
  • requests
  • json
  • time
  • bs4
  • fake_useragent
  • socks
  • socket



1. Наш первый запрос

Доступ к веб-страницам позволяет получать модуль requests. Подключим его.
За компанию подгрузим ещё json, чтобы получить ответ в виде словаря.


Python:
import requests
import json

def req():
    url = 'https://dtf.ru/cheatsconsole/check?value=food'
    response = requests.get(url)
    # Обращаемся к сайту, пока не придет ответ
    while response.status_code != 200:
        response = requests.get(url)
    # Возвращаем ответ в виде json
    return response.json()

if __name__ == '__main__':
    print(request())

A2bVhRvJKoPsvjUPTQ56uaZELjjYSGm1tXCGAumQnQAc7BEjDJXvRAHHnJLuCPy6RC_2S5pqYqCwUiyy30v7TGVgtoXQUNGCmYRx4ksz5rpCb0iqGfKGOgdUSSijFMav-GF2o3Q
В ключе data находится еще один словарь с ключом promocode, он то нам и нужен, а точнее его содержимое!




2. Достаем промокод из словаря

Напишем функцию для парса значения ключа promocode.
И добавим проверку на существование этого ключа!


Python:
def parse_response(response):
    # Проверка существования promocode в data
    if "promocode" in response["data"].keys():
        # Добавляем значение ключа promocode в переменную
        promocode = response["data"]["promocode"]
        return promocode
    else:
        return None

Обновим ifmain:

Python:
if __name__ == '__main__':
    promocode = parse_response(req())
    print(promocode)

Запускаем и видим нашу первую проблему, что у нас не нашлось промокода.
(Вселенная бесконечна, а промокоды нет) При повторных запросах будет показывать тот же промокод либо, вообще ничего.




3. Меняем User-Agent

Попробуем выяснить, почему так происходит. Для этого проверим, как выглядел финальный запрос,
отправленный нами на сервер, а конкретнее — как выглядел наш User-Agent в глазах сервера. Добавим в функцию запроса пару строк:


Python:
def req():
    url = 'https://dtf.ru/cheatsconsole/check?value=food'
    response = requests.get(url)
 
    for key, value in response.request.headers.items():
        print(key+': '+value)
     
    # Обращаемся к сайту, пока не придет ответ
    while response.status_code != 200:
        response = requests.get(url)
    # Возвращаем ответ в виде json
    return response.json()

User-Agent: python-requests/2.20.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Похоже, мы дали понять серверу, что мы сидим на питоне и используем библиотеку requests под версией 2.20.1.
Скорее всего, это вызвало у сервера некоторые подозрения относительно наших благих намерений и он не решил отдать нам свой промокод.


К счастью, никто нам не мешает притвориться человечными и пустить пыль в глаза сервера при помощи генерации фейкового юзер-агента.
Библиотек, которые справляются с такой задачей, существует очень и очень много, лично мне больше всего нравится fake-useragent.
При вызове метода из различных кусочков будет генерироваться рандомное сочетание операционной системы, спецификаций и версии браузера, которые можно передавать в запрос:


Python:
# Подгружаем один из методов этой библиотеки
from fake_useragent import UserAgent

Исправим функцию req:
Python:
def req():
    url = 'https://dtf.ru/cheatsconsole/check?value=food'
    response = requests.get(url, headers={'User-Agent': UserAgent().chrome})
    # Обращаемся к сайту, пока не придет ответ
    while response.status_code != 200:
        response = requests.get(url, headers={'User-Agent': UserAgent().chrome})
    # Возвращаем ответ в виде json
    return response.json()

Но этого будет недостаточно, нужно менять IP!



4. Меняем IP

Конечно, как вариант можно было бы использовать прокси-сервера, тогда мы бы имели в запасе некоторое количество разных IP адресов, которые можно было бы менять.
Однако в этом подходе есть пара проблем: первая — нужно где-то раздобыть эти прокси, вторая — а что если ограниченного числа адресов нам не хватит и нужно больше?


В таком случае лучше всего нам подойдет Tor.
Для начала полюбуемся на свой ip-адрес. Для этого напишем функцию, которая делает get-запрос к сайту и возвращает наш IP. Подключив библиотеку bs4:


Python:
def check_ip():
    ip = requests.get('http://checkip.dyndns.org').content
    soup = BeautifulSoup(ip, 'html.parser')
    return soup.find('body').text[20:]

Заменить свой IP через Tor можно двумя путями. Простой — через браузер, а сложный — через небольшие махинации с настройками.
Скачаем браузерный tor, чтобы лёгкий путь был совсем прост. Теперь запускаем свежескачанный браузер и оставляем его открытым.
Менять IP нам поможет библиотека PySocks. Конечно же, её нужно установить, скопировав в терминал pip3 install PySocks.
Браузер Тор по умолчанию использует порт номер 9150. В питоне при помощи библиотек socks и socket (импортируем их) можно задать дефолтный порт для подключения.
В результате текущая сессия будет использовать именно этот порт при отправке любого запроса, а значит – запросы будут посылаться из-под запущенного тора.


Добавим пару строк в начало ifmain:
Python:
socks.set_default_proxy(socks.SOCKS5, "localhost", 9150)
socket.socket = socks.socksocket
Запускаем функцию check_ip и видим наш новый IP!

Тор-браузер меняет IP каждые 10 минут. Нам нужно менять адрес каждый запрос.
Для этого в папке, куда был установлен Tor найдём файл с настройками под названием torrc (на окнах он лежит по адресу \Browser\TorBrowser\Data\Tor\torrc) и отредактируем его.
Добавив эти строки:

CircuitBuildTimeout 10
LearnCircuitBuildTimeout 0
MaxCircuitDirtiness 10
Минимально возможный период для обновления IP составляет 10 секунд так что нам придется засыпать и делать проверку на новый адрес.



5. Последние штрихи

Импортируем последнюю на сегодня библиотеку time.
Добавим в наш код функцию записи промокода в файл и основную функцию.


Python:
def record_promocode(promocode):
    # Открываем txt на дозапись
    with open('promocode.txt', mode='a', encoding='utf-8') as f:
        # записываем промокод в файл
        f.write(promocode + '\n')

     
def main():
    socks.set_default_proxy(socks.SOCKS5, "localhost", 9150)
    socket.socket = socks.socksocket
    # Предыдущий IP и промокод
    previous_ip = ''
    previous_promocode = ''
    while True:
        ip = check_ip()
        # Если IP другой
        if ip != previous_ip:
            # Делаем запрос
            promocode = parse_response(req())
            # Помечаем IP старым
            previous_ip = ip
            # Если промокод существует и такого промокода не было раньше
            if promocode != None and promocode != previous_promocode:
                # Записываем промокод в файл
                record_promocode(promocode)
                # Помечаем промокод старым
                previous_promocode = promocode
                # Выводим данные в консоль
                print(f' PROMOCODE: {promocode} | IP: {ip}')
                # Засыпаем на 10 секунд
                time.sleep(10)
        else:
            # Иначе спим 2 секунды
            time.sleep(2)



Весь код с основными пояснениями:
Код:
import requests
import json
import time

from fake_useragent import UserAgent
from bs4 import BeautifulSoup

import socks
import socket


def check_ip():
    ip = requests.get('http://checkip.dyndns.org').content
    soup = BeautifulSoup(ip, 'html.parser')
    return soup.find('body').text[20:]


def req():
    url = 'https://dtf.ru/cheatsconsole/check?value=food'
    response = requests.get(url, headers={'User-Agent': UserAgent().chrome})
    # Обращаемся к сайту, пока не придет ответ
    while response.status_code != 200:
        response = requests.get(url, headers={'User-Agent': UserAgent().chrome})
    # Возвращаем ответ в виде json
    return response.json()


def parse_response(response):
    # Проверка существования promocode в data
    if "promocode" in response["data"].keys():
        # Добавляем значение ключа promocode в переменную
        promocode = response["data"]["promocode"]
        return promocode
    else:
        return None


def record_promocode(promocode):
    # Открываем txt на дозапись
    with open('promocode.txt', mode='a', encoding='utf-8') as f:
        # записываем промокод в файл
        f.write(promocode + '\n')


def main():
    socks.set_default_proxy(socks.SOCKS5, "localhost", 9150)
    socket.socket = socks.socksocket
    # Предыдущий IP и промокод
    previous_ip = ''
    previous_promocode = ''
    while True:
        ip = check_ip()
        # Если IP другой
        if ip != previous_ip:
            # Делаем запрос
            promocode = parse_response(req())
            # Помечаем IP старым
            previous_ip = ip
            # Если промокод существует и такого промокода не было раньше
            if promocode != None and promocode != previous_promocode:
                # Записываем промокод в файл
                record_promocode(promocode)
                # Помечаем промокод старым
                previous_promocode = promocode
                # Выводим данные в консоль
                print(f' PROMOCODE: {promocode} | IP: {ip}')
                # Засыпаем на 10 секунд
                time.sleep(10)
        else:
            # Иначе спим 2 секунды
            time.sleep(2)


if __name__ == '__main__':
    main()
Годнота.ТС спасибо
 

BotHub

Разработчик ботов

BotHub

Разработчик ботов
Резидент
Сообщения
285
Реакции
420
0 руб.
Telegram
Bash:
print(f' PROMOCODE: {promocode} | IP: {ip}')
                                          ^
SyntaxError: invalid syntax
пишет при запуске.
кто проверял вообще?
код написан на python 3. Причём по умолчанию в сборке линукс стоит уже питон. Но второй версии. Он используется системой, его удалять не надо. Нужно поставить ещё и третий питон. И запускать через указание на какой версии написан код. т. е для запуска скрипта писать python3 main. py ну и зависимости тоже ставить через pip3 install requests к примеру.
 

vimen

Местный
Сообщения
185
Реакции
141
0 руб.
код написан на python 3. Причём по умолчанию в сборке линукс стоит уже питон. Но второй версии. Он используется системой, его удалять не надо. Нужно поставить ещё и третий питон. И запускать через указание на какой версии написан код. т. е для запуска скрипта писать python3 main. py ну и зависимости тоже ставить через pip3 install requests к примеру.
да, да. знаю, пробовал. всё равно точно такая же ошибка.
ладно, сам разберусь.
 

HeavenlyBlow

Участник
Сообщения
19
Реакции
5
0 руб.
да, да. знаю, пробовал. всё равно точно такая же ошибка.
ладно, сам разберусь.
Можете переписать на:

print("Promocode: "+ promocode + " IP: " + ip)

Это равносильно тому что написано у ТС, но в упрощённой форме.
[automerge]1547574268[/automerge]
Основной код можно не хило ускорить используя: async + aiohttp + lxml. Тогда он будет жарить.
 
Последнее редактирование:

SnoupS

Участник
Сообщения
10
Реакции
10
0 руб.
Telegram
Можете переписать на:

print("Promocode: "+ promocode + " IP: " + ip)

Это равносильно тому что написано у ТС, но в упрощённой форме.
[automerge]1547574268[/automerge]
Можно не хило ускорить используя: async + aiohttp + lxml. Тогда он будет жарить.
Там нечего ускорять, стоят паузы, потому что IP меняется только раз в ~10 секунд. (сильно не ускоришь)
Можно попробовать запилить через библиотеку TorCrawler смену IP по вызову функции. Тогда не придется ждать смену IP адреса.
 

HeavenlyBlow

Участник
Сообщения
19
Реакции
5
0 руб.
У меня есть самописный парсер, он собирает с одного сайтика около 27к прокси и чекает + fake-useragent и купоны высосет на раз. Чет теперь захотел это реализовать)
 
Сверху Снизу