Requests: Lier une IP particulière

Créé le 27 janv. 2012  ·  15Commentaires  ·  Source: psf/requests

Ce serait formidable de pouvoir lier une IP particulière comme adresse source (pour les hôtes avec plusieurs adresses IP).

Commentaire le plus utile

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.

Tous les 15 commentaires

Intéressant. Comment envisagez-vous l'utilisation ?

^ shazow/urllib3#9

Le but est d'écrire un crawler en utilisant une IP associée à un pays particulier. Mais je ne sais pas comment il serait utilisé au niveau de l'API.

Ne pourriez-vous pas simplement envoyer une requête à une adresse IP avec un en-tête Host ?

Non, car il s'agit d'avoir l'IP spécifique dans le journal du serveur Web (à inverser vers un pays particulier à l'aide d'outils comme GeoIP).

Je ne suis pas.

>>> requests.get('http://184.106.67.239', headers={'host': 'ci.kennethreitz.com'})
<Response [200]>
import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.

Je pense que c'est hors de portée.

Pour les personnes intéressées par cela, vous voudrez peut-être jeter un œil à HttpConnectionPool d'urlib3, en particulier où les nouvelles httplib/http.client HttpConnections sont lancées afin que vous puissiez passer source_address. Si vous faites cela, vous pouvez continuer à l'exposer dans le modèle de demande de la demande et l'utiliser comme vous le souhaitez.

Pour ceux qui arrivent ici de google, vous voudrez suivre ceci : https://github.com/shazow/urllib3/issues/9#issuecomment -15871420

Cela devrait être rouvert - ce n'est pas hors de portée, et c'est tout à fait nécessaire lorsque vous travaillez avec des hôtes à l'intérieur d'un VPN.

En fonction des spécificités des espaces d'adressage du réseau actuel et distant, il faut souvent envoyer des requêtes depuis l'IP lié à l'interface configurée par le VPN. Ou apportez des modifications à la table de routage. Cela s'applique au moins à l'utilisation de NetExtender sur un Mac.

De nombreux programmes de mise en réseau tels que ssh et curl prennent en charge la définition de l'interface à utiliser / la liaison à l'IP d'une interface.

@petri Votre affirmation selon laquelle ce n'est pas hors de portée est incorrecte, étant donné que la portée du projet Requests est entièrement définie par Kenneth. =)

Plus précisément, nous le considérons comme étant hors de portée du projet de requêtes principales. Cependant, vous pouvez toujours le faire, et ce n'est même pas très difficile. Cette discussion explique comment le faire.

Nice - Je n'étais pas au courant de ce genre de mécanisme dans les demandes. Merci!

import socket
import urllib2
true_socket = socket.socket

def make_bound_socket(source_ip):
    def bound_socket(*a, **k):
        sock = true_socket(*a, **k)
        sock.bind((source_ip, 0))
        return sock
    return bound_socket

socket.socket = make_bound_socket('<some source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

socket.socket = make_bound_socket('<some other source ip>')
print urllib2.urlopen('http://httpbin.org/ip').read()

Si le trafic sortant des deux numéros d'adresse IP source passe par deux numéros d'adresse IP publics différents, vous devriez voir ces numéros publics différents dans le champ d'origine de la réponse.

Je voulais juste que vous sachiez que j'ai parcouru Internet pendant une éternité et que c'était la seule solution qui a fonctionné pour moi.

Cette page vous a été utile?
0 / 5 - 0 notes