Форум сайта python.su
Всем, доброго времени.
помогите разобраться новичку в написании кода)))
задача такая
1) есть список ip адресорв в файле /root/test.txt
2)нужно вытащить из этого спаиска все русские Ip делая запрос на сайт https://ipinfo.io/
3) на сайте есть ограничение по кол-ву запросов для одного токена
4)поэтому я хочу делать запрос сначала с одним токеном - и если нет ошибки продолжать делать с первым
5)как только появляется ошибка хочу продолжить делать запросы со вторым токеном
код ниже и программа делает запросы сначала с первым токеном, если ошибка то со вторым, потом опять с первым и тд
import re from urllib.request import urlopen import urllib.request import urllib.error from json import load with open('/root/test.txt', 'r', encoding='utf-8') as f: lines = f.read() out = set(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', lines)) list_ip = list() for ip in out: try: url = 'https://ipinfo.io/' + ip + '/json'+ '?token=123' res = urlopen(url) data = load(res) except urllib.error.HTTPError as err: print(f'A HTTPError was thrown: {err.code} {err.reason}') url = 'https://ipinfo.io/' + ip + '/json'+ '?token=321' res = urlopen(url) data = load(res) for i in data: if data[i] == 'RU': list_ip.append(data['ip']) print(list_ip)
Отредактировано touch (Авг. 29, 2023 13:23:30)
Офлайн
> помогите разобраться новичку в написании кода)))
Примерно так:
def read_ip(path): with open(path, 'r', encoding='utf-8') as f: lines = f.read() return set(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', lines)) IS_ERR = False def get_data(ip): url = 'https://ipinfo.io/' + ip + '/json?token='+ '123' if IS_ERR else '321' res = urlopen(url) return load(res) list_ip = [] for ip in read_ip("/root/test.txt"): try: data = get_data(ip) except urllib.error.HTTPError as err: IS_ERR = not IS_ERR data = get_data(ip) for i in data: if data[i] == 'RU': list_ip.append(data['ip'])
Офлайн
благодарю!
проверю - отпишусь
Офлайн
получился скрипт
import re from urllib.request import urlopen import urllib.request import urllib.error from json import load def read_ip(path): with open(path, 'r', encoding='utf-8') as f: lines = f.read() return set(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', lines)) IS_ERR = False def get_data1(ip): url = 'http://ipinfo.io/' + ip + '/json?token='+ '123' res = urlopen(url) return load(res) def get_data2(ip): url = 'http://ipinfo.io/' + ip + '/json?token='+ '321' res = urlopen(url) return load(res) list_ip = [] for ip in read_ip("/home/ansible/test.txt"): try: data = get_data1(ip) for i in data: if data[i] == 'RU': list_ip.append(data['ip']) except urllib.error.HTTPError as err: IS_ERR = not IS_ERR data = get_data2(ip) for i in data: if data[i] == 'RU': list_ip.append(data['ip']) print(list_ip)
Офлайн
> все равно проверяет две ссылки
Да, так он будет всё проверять. Разберись зачем нужен флаг IS_ERR
Офлайн
это как раз для меня очень сложно.
опиши пожалуйста логику, что должно происходить или пришли ссылку почитать желательно с примерами
Офлайн
https://github.com/maxmind/GeoIP2-python
Офлайн
> это как раз для меня очень сложно.
Ну там элементарный алгоритм. Если была ошибка меняем флаг на противоположный и в зависимости от этого выбирает токен. Если у тебя больше двух токенов то можно сделать как то так:
def get_data(ip, token): url = 'https://ipinfo.io/' + ip + '/json?token='+ token return load(urlopen(url)) token_list = ("11", "222", "333", "444") token_idx = len(token_list) try: data = get_data(ip, token_list[token_idx%len(token_list)]) except urllib.error.HTTPError as err: token_idx += 1 data = get_data(ip, token_list[token_idx%len(token_list)])
Отредактировано Rodegast (Авг. 30, 2023 18:48:02)
Офлайн
получилось!
благодарю!
итоговый скрипт
import re from urllib.request import urlopen import urllib.request import urllib.error from json import load def read_ip(path): with open(path, 'r', encoding='utf-8') as f: lines = f.read() return set(re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', lines)) def get_data(ip, token): url = 'http://ipinfo.io/' + ip + '/json?token='+ token return load(urlopen(url)) token_list = ("111", "222") token_idx = len(token_list) list_ip = [] for ip in read_ip("/home/ansible/test.txt"): try: data = get_data(ip, token_list[token_idx%len(token_list)]) except urllib.error.HTTPError as err: token_idx += 1 data = get_data(ip, token_list[token_idx%len(token_list)]) for i in data: if data[i] == 'RU': list_ip.append(data['ip']) print(list_ip)
Офлайн