Найти - Пользователи
Полная версия: выбор переменной try except
Начало » Python для новичков » выбор переменной try except
1
touch
Всем, доброго времени.
помогите разобраться новичку в написании кода)))
задача такая
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)
Rodegast
> помогите разобраться новичку в написании кода)))

Примерно так:
 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'])
touch
благодарю!
проверю - отпишусь
touch
получился скрипт
 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)
но все равно проверяет две ссылки
ansible@git ~ $ sudo tshark -i enp0s3 host 34.117.59.81 | grep “HTTP/1.1”
Running as user “root” and group “root”. This could be dangerous.
Capturing on ‘enp0s3’
** (tshark:2055) 19:07:04.404995 – Capture started.
** (tshark:2055) 19:07:04.405054 – File: “/tmp/wireshark_enp0s39VV791.pcapng”
0.052269797 192.168.255.192 → 34.117.59.81 HTTP 217 GET /12.12.12.122/json?token=123 HTTP/1.1
0.265346248 192.168.255.192 → 34.117.59.81 HTTP 217 GET /12.12.12.122/json?token=321 HTTP/1.1
0.478489984 192.168.255.192 → 34.117.59.81 HTTP 218 GET /32.120.113.26/json?token=123 HTTP/1.1
0.691696492 192.168.255.192 → 34.117.59.81 HTTP 218 GET /32.120.113.26/json?token=321 HTTP/1.1
0.905419499 192.168.255.192 → 34.117.59.81 HTTP 218 GET /32.120.113.22/json?token=123 HTTP/1.1
1.121558027 192.168.255.192 → 34.117.59.81 HTTP 218 GET /32.120.113.22/json?token=321 HTTP/1.1
1.343355310 192.168.255.192 → 34.117.59.81 HTTP 212 GET /8.8.8.8/json?token=123 HTTP/1.1
1.557292005 192.168.255.192 → 34.117.59.81 HTTP 212 GET /8.8.8.8/json?token=321 HTTP/1.1
Rodegast
> все равно проверяет две ссылки

Да, так он будет всё проверять. Разберись зачем нужен флаг IS_ERR
touch
это как раз для меня очень сложно.
опиши пожалуйста логику, что должно происходить или пришли ссылку почитать желательно с примерами
ZerG
https://github.com/maxmind/GeoIP2-python
Rodegast
> это как раз для меня очень сложно.

Ну там элементарный алгоритм. Если была ошибка меняем флаг на противоположный и в зависимости от этого выбирает токен. Если у тебя больше двух токенов то можно сделать как то так:
 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)])
touch
получилось!
благодарю!
итоговый скрипт
 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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB