GeekProxy и MailerLite
В MailerLite нет поля для прокси. Ни в приложении, ни в API. Зато есть белый список IP у API-токенов, и именно там пригодится статический адрес GeekProxy: скрипты ходят в API с одного фиксированного IP, а токен отбрасывает всё остальное. В гайде: curl, Python requests, официальный SDK и работа с несколькими клиентскими аккаунтами из отдельных профилей браузера.
Что нужно: активный план GeekProxy со статическим IP и данные прокси из кабинета. Настройка занимает минут десять.
Получить прокси1 Перед началом
Сразу договоримся, что прокси здесь может, а что нет. Рассылки MailerLite уходят с его собственных серверов, и никакой прокси с вашей стороны IP отправителя не меняет. Прокси стоит перед вашим трафиком в сторону MailerLite. Реальных задач у него три:
- Скрипт или сервер, который обращается к
connect.mailerlite.comи обязан приходить всегда с одного адреса, потому что токен ограничен этим адресом - Ваша сессия в браузере, когда вы заходите в клиентский аккаунт MailerLite с выделенного IP
- Проверка лендинга или формы из другой страны. Тут ничего специфичного для MailerLite нет
Главная из них первая. Если токен говорит «только эти IP», ротируемый резидентский выход отвалится на втором же запросе. Нужен адрес, который не двигается.
Что понадобится
- Активный план GeekProxy со статическим IP (ISP или датацентр)
- Данные прокси из кабинета: хост, порт, логин, пароль
- Аккаунт MailerLite, прошедший онбординг. Новые аккаунты сначала проходят одобрение, до этого API мало полезен
- curl либо Python 3.8 или новее с
requests
- Поле Откуда взять
- Протокол HTTP / SOCKS5
- Хост IP или имя шлюза из кабинета
- Порт из кабинета
- Логин из кабинета
- Пароль из кабинета
2 Где взять данные прокси
- Войдите в кабинет GeekProxy
- Откройте план. У планов с оплатой за IP (ISP, датацентр) список адресов, порт, логин и пароль лежат прямо на карточке, а кнопка Export отдаёт весь список текстом
- Запишите сам IP выхода. На статическом плане хост, к которому вы подключаетесь, и есть адрес, который видит мир. Его вы и впишете в MailerLite
Резидентские планы показывают хост шлюза и собирают строку логина в Options. Для сценария с браузером они годятся, но выход со временем меняется, а это ровно то, чего белый список не переживёт.
3 Токен с ограничением по IP
Токены живут на странице Integrations. Путь по справке MailerLite:
- Откройте Integrations в левом меню
- В блоке MailerLite API нажмите Use
- Нажмите Generate new token и назовите токен
- В Choose IP restrictions выберите вариант с белым списком и впишите статический IP GeekProxy. Диалог объясняет суть одной строкой: «Only requests coming from these specified IP addresses will be accepted»
- Нажмите Create token, скопируйте ключ или нажмите Download. Второй раз его не покажут
Вписывайте IP, с которого выходит прокси, а не IP офиса. Если сначала ограничить токен, а скрипт пустить через прокси потом, первый же вызов отобьётся, и вы десять минут будете искать ошибку в коде.
4 Запросы к API через прокси
Базовый URL https://connect.mailerlite.com/api, авторизация через Bearer-токен в заголовке Authorization. В curl весь маршрут через GeekProxy задаёт один флаг:
curl -x http://LOGIN:PASSWORD@IP:PORT \
-H "Authorization: Bearer $MAILERLITE_TOKEN" \
https://connect.mailerlite.com/api/subscribers
Хотите SOCKS5? Поменяйте схему на socks5h://, тогда имя хоста резолвит прокси. С обычным socks5:// резолвит ваш DNS. Здесь это редко мешает, но лишний повод ошибиться.
Python requests
Передавайте словарь proxies в каждый вызов. На session.proxies не полагайтесь: документация requests прямо предупреждает, что прокси из окружения его перекрывают, и забытый https_proxy на сервере тихо уведёт запросы не туда.
import os, requests
PROXY = "http://LOGIN:PASSWORD@IP:PORT"
proxies = {"http": PROXY, "https": PROXY}
headers = {"Authorization": f"Bearer {os.environ['MAILERLITE_TOKEN']}"}
r = requests.get("https://connect.mailerlite.com/api/subscribers",
headers=headers, proxies=proxies, timeout=(5, 30))
print(r.status_code)
if r.status_code == 429:
print("лимит, повтор через", r.headers.get("Retry-After"), "сек")
Ветка с 429 здесь не для красоты. Общий лимит MailerLite 120 запросов в минуту, эндпоинты импорта получают 5 в минуту, а на перебор приходит HTTP 429 с заголовком Retry-After. Прокси тут ничего не меняет.
Официальный Python SDK
У SDK (python -m pip install mailerlite) опции прокси в документации нет вообще. README упоминает requests.HTTPError и «стандартные исключения requests», то есть транспорт у него requests, а requests читает HTTPS_PROXY из окружения всегда, когда аргумент proxies не передан. Экспортируйте переменную и работайте с клиентом как обычно:
export HTTPS_PROXY="http://LOGIN:PASSWORD@IP:PORT" python -m pip install mailerlite
import mailerlite as MailerLite
client = MailerLite.Client({'api_key': 'your-api-key'})
# все вызовы теперь уходят через статический IP GeekProxy
5 Несколько аккаунтов, отдельные профили
Сначала официальный путь. Агентству не нужны отдельные IP, чтобы вести несколько аккаунтов MailerLite. Нажмите стрелку рядом с именем аккаунта слева вверху, выберите Switch account или New account, назовите, сохраните. Клиент может добавить вас пользователем на тот же email, под которым вы входите, и его аккаунт появится у вас на странице Switch account. План и оплата у каждого аккаунта свои.
Отдельные IP нужны, когда логины не связаны. Скажем, фрилансеру выдали пароль от клиентского аккаунта вместо того, чтобы добавить пользователем. Тогда каждой сессии лучше приходить с постоянного адреса подходящей страны. Рецепт простой: профиль браузера на клиента, у каждого свой статический IP GeekProxy.
- Firefox хранит настройки прокси на уровне профиля и умеет SOCKS с удалённым DNS, так что профиль на клиента там самый простой вариант
- Chrome по умолчанию берёт прокси из системы. Отдельный прокси на окно означает запуск с флагом
--proxy-server="http://IP:PORT"и отдельной папкой профиля - SOCKS5 с логином и паролем не работает ни в Chromium-браузерах, ни в Firefox. Берите HTTP с логином и паролем или SOCKS5 с авторизацией по белому списку IP в плане GeekProxy
6 Проверка работы
Два вызова, строго по порядку. Сначала curl -x http://LOGIN:PASSWORD@IP:PORT https://ipinfo.io/json. В JSON должен быть IP прокси, тот самый, что вы вписали в диалог токена. Потом повторите запрос subscribers из раздела 4. Ответ 200 с JSON означает, что токен, IP и прокси договорились.
Теперь тот же запрос без -x. Его должны отбить. Если с домашнего IP всё прошло, ограничение просто не сохранилось.
7 Какой продукт GeekProxy подходит
Всё, что касается токена с ограничением по IP, просит статический ISP или выделенный датацентр IPv4: один адрес на весь срок плана и никакого счётчика трафика на JSON-вызовах. Сессии браузера под клиентов тянутся туда же, ISP статика, если за каждым логином хочется видеть домашнюю сеть. Residential Turbo и Residential Flex ротируются по замыслу, а sticky-сессия Flex живёт максимум 120 минут. На рабочий день в одном аккаунте не хватит. Почтовые порты тут ни при чём, MailerLite шлёт со своих серверов.
8 Частые проблемы
Запросы отбиваются сразу после включения ограничения по IP
IP в токене не совпадает с IP выхода прокси. Проверьте через https://ipinfo.io/json сквозь прокси и сравните посимвольно. На резидентском плане это ожидаемо: выход уехал.
HTTP 429
Лимит, 120 запросов в минуту на аккаунт. Прочитайте Retry-After и подождите столько. Второй прокси вторую квоту не даёт, лимит висит на аккаунте токена.
requests не замечает прокси
Вы задали session.proxies, а переменная окружения победила. Передавайте proxies= в каждый вызов или поставьте сессии trust_env = False.
В SDK некуда вписать прокси
Верно, и не надо. Экспортируйте HTTPS_PROXY до запуска Python. Схему не забудьте: впереди http://, иначе requests напомнит, что URL прокси обязан содержать схему.
Аккаунт на проверке
MailerLite перечисляет причины: много отказов, жалоб на спам или отписок, базы, похожие на купленные или спарсенные, импорт, зацепивший внутренний фильтр, странные платежи. «Вход с нового IP» в этом списке нет. Если попросят информацию, ответьте в течение 30 дней.
Статический IP для MailerLite
ISP и датацентр-адреса, которые не меняются, HTTP и SOCKS5, выдача за секунды.
Заказать