Приветствую, уважаемые форумчане! Сегодня хотел бы рассмотреть тему использования большого кол-ва API ключей в Shodan для того чтобы избавится от лимита на запросы по одному ключу. Раз мы собираемся использовать много ключей, нам потребуется много аккаунтов. Код авторега: autoreg.py import random import pymailtm import requests import string import bs4 mailtm = pymailtm.MailTm() account = mailtm.get_account() login = ''.join(random.choice(string.ascii_letters) for i in range(20)) req = requests.get('https://account.shodan.io/register') cookie = req.headers['set-cookie'] soup = bs4.BeautifulSoup(req.text, 'lxml') csrf = soup.select_one('input[name=csrf_token]')['value'] print('CSRF Token received!') loginpass = login+':123123123' reg = requests.post('https://account.shodan.io/register', f"username={login}&password=123123123&password_confirm=123123123&email={account.address}&csrf_token={csrf}", headers={'Cookie':cookie}) if 'Check your email inbox to activate the account!' in reg.text: print('Account registered!') print('Waiting for activation link...') message = account.wait_for_message() requests.get(message.text[25:]) print('Activation successful!') print(loginpass) with open('accs.txt', 'a') as file: file.write(loginpass + '\n') else: print('Err!') Python import random import pymailtm import requests import string import bs4 mailtm = pymailtm.MailTm() account = mailtm.get_account() login = ''.join(random.choice(string.ascii_letters) for i in range(20)) req = requests.get('https://account.shodan.io/register') cookie = req.headers['set-cookie'] soup = bs4.BeautifulSoup(req.text, 'lxml') csrf = soup.select_one('input[name=csrf_token]')['value'] print('CSRF Token received!') loginpass = login+':123123123' reg = requests.post('https://account.shodan.io/register', f"username={login}&password=123123123&password_confirm=123123123&email={account.address}&csrf_token={csrf}", headers={'Cookie':cookie}) if 'Check your email inbox to activate the account!' in reg.text: print('Account registered!') print('Waiting for activation link...') message = account.wait_for_message() requests.get(message.text[25:]) print('Activation successful!') print(loginpass) with open('accs.txt', 'a') as file: file.write(loginpass + '\n') else: print('Err!') Код при одном запуске регает один акк на временную почту, данные записывает в accs.txt. Код авторега не мой, нашел его на просторах интернета, наверное позже я сделаю доработаю его, сделаю поддержку ****** при запросах+добавлю генерацию большого кол-ва акков за раз. Затем надо будет со всех аккаунтов извлечь их API ключ, для этого используем джентельменский набор любого парсера, а именно requests, fake_headers, bs4. Извлекаем данные из файла accs.txt, по очереди входим в каждый аккаунт, перед этим создав сессию. Используя данные в сессии, с другой страницы забираем наш ключ, код записывает его в api.txt. Наверное даже ежику понятно что shodan такую активность не любит. С одного айпи мне удается забрать ключ с трех аккаунтов, дальше Shodan отправляет ip во временнный бан. Сколько длится бан - хз. Но я думаю вы догадываетесь как это решается, просто добавляем вагон и маленькую тележку ******. Код, достающий API ключ: api.py import requests from bs4 import BeautifulSoup from fake_headers import Headers head = Headers() ACCS_FILE = "accs.txt" API_FILE = "api.txt" LOGIN_URL = "https://account.shodan.io/login" DASHBOARD_URL = "https://account.shodan.io" """ Условия пользования Shodan запрещают использование мулти-акков для обхода ограничений на api, потому рекомендую использовать ******, к примеру тут стоит ****** от vless *** клиента nekobox """ proxies = { "https":"127.0.0.1:2080" } def find_api(page): soup = BeautifulSoup(page, 'lxml') api_div = soup.find("div", class_="api-key") return api_div.text.strip() def main(): with open(ACCS_FILE, "r") as file: accounts = [line.strip().split(":") for line in file.readlines()] with open(API_FILE, 'w') as api_file: for a in accounts: #a[0] - логин, a[1]-пароль session = requests.Session() headers=head.generate() response = session.get(LOGIN_URL, headers=headers, proxies=proxies) soup = BeautifulSoup(response.text, 'html.parser') csrfblock = soup.find("input", {'name':"csrf_token"}) csrf = csrfblock['value'] if csrfblock else '' data = { 'username': a[0], 'password': a[1], 'grant_type':'password', 'continue':'https://www.shodan.io/dashboard', 'csrf_token': csrf } session.post("https://account.shodan.io/login", headers=headers, data=data, proxies=proxies) response_api=session.get("https://account.shodan.io", headers=headers, proxies=proxies) api_key=find_api(response_api.text) if api_key: api_file.write(f"{api_key}\n") else: continue if __name__ == "__main__": main() Python import requests from bs4 import BeautifulSoup from fake_headers import Headers head = Headers() ACCS_FILE = "accs.txt" API_FILE = "api.txt" LOGIN_URL = "https://account.shodan.io/login" DASHBOARD_URL = "https://account.shodan.io" """ Условия пользования Shodan запрещают использование мулти-акков для обхода ограничений на api, потому рекомендую использовать ******, к примеру тут стоит ****** от vless *** клиента nekobox """ proxies = { "https":"127.0.0.1:2080" } def find_api(page): soup = BeautifulSoup(page, 'lxml') api_div = soup.find("div", class_="api-key") return api_div.text.strip() def main(): with open(ACCS_FILE, "r") as file: accounts = [line.strip().split(":") for line in file.readlines()] with open(API_FILE, 'w') as api_file: for a in accounts: #a[0] - логин, a[1]-пароль session = requests.Session() headers=head.generate() response = session.get(LOGIN_URL, headers=headers, proxies=proxies) soup = BeautifulSoup(response.text, 'html.parser') csrfblock = soup.find("input", {'name':"csrf_token"}) csrf = csrfblock['value'] if csrfblock else '' data = { 'username': a[0], 'password': a[1], 'grant_type':'password', 'continue':'https://www.shodan.io/dashboard', 'csrf_token': csrf } session.post("https://account.shodan.io/login", headers=headers, data=data, proxies=proxies) response_api=session.get("https://account.shodan.io", headers=headers, proxies=proxies) api_key=find_api(response_api.text) if api_key: api_file.write(f"{api_key}\n") else: continue if __name__ == "__main__": main() Далее я написал модуль, в котором есть функция, возвращающая случайный ключ из api.txt Код с функцией, возвращающей случайный ключ: get_key.py import random def get_key(): with open("api.txt", 'r') as file: return random.choice(file.readlines()) Python import random def get_key(): with open("api.txt", 'r') as file: return random.choice(file.readlines()) Вот пример использования: example.py import shodan from get_key import get_key API_KEY = get_key() #достаем случайный ключ и делаем запрос api = shodan.Shodan(API_KEY) try: ip_info = api.host("1.1.1.1") print(f"IP: {ip_info['ip_str']}") print(f"Организация: {ip_info.get('org', 'Неизвестно')}") print(f"Страна: {ip_info.get('country_name', 'Неизвестно')}") print(f"Открытые порты: {ip_info['ports']}") except shodan.APIError as e: print(f"Ошибка API Shodan: {e}") Python import shodan from get_key import get_key API_KEY = get_key() #достаем случайный ключ и делаем запрос api = shodan.Shodan(API_KEY) try: ip_info = api.host("1.1.1.1") print(f"IP: {ip_info['ip_str']}") print(f"Организация: {ip_info.get('org', 'Неизвестно')}") print(f"Страна: {ip_info.get('country_name', 'Неизвестно')}") print(f"Открытые порты: {ip_info['ports']}") except shodan.APIError as e: print(f"Ошибка API Shodan: {e}") Я не получил никаких проблем на маленьком количестве api которые у меня были, но идея брать каждый раз случайный ключ из файла мне не очень нравится. Я хотел написать код так чтобы он выдавал один и тот же ключ пока на нем не закончатся лимиты. То есть сначала выжимаем досуха один ключ и идем за другим, с точки зрения самого Shodan это более нормальное поведение, чем для каждого нового запроса с одного ip, брать новый ключ. Для того чтобы такое сделать, нужно было знать лимиты на бесплатном api, а я их в сети не нашел, считать, просто делая запросы очень долго, так как у API есть ограничение 1 запрос в секунду. Если у кого есть идеи как сделать функцию, выдающую ключ, более нормальной пишите, я буду очень рад если насоветует что-нибудь. На этом все, всем пока.
слушай, а получттся сделать чекер аккаунтов шодан? чтоб выводил инфу о нем либо вытаскивал апи кей ключ, у меня 10к лог и пас шодан акков
usrnet, а почему нет, там нет никакой капчи, более того можно без проксей чекать - достаточно соблюдать рейт лимиты