Requests: Bindung einer bestimmten IP

Erstellt am 27. Jan. 2012  ·  15Kommentare  ·  Quelle: psf/requests

Es wäre großartig, eine bestimmte IP als Quelladresse binden zu können (für Hosts mit mehreren IP-Adressen).

Hilfreichster Kommentar

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()

Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.

Alle 15 Kommentare

Interessant. Wie stellen Sie sich die Nutzung vor?

^ shazow/urllib3#9

Das Ziel besteht darin, einen Crawler zu schreiben, der eine IP verwendet, die einem bestimmten Land zugeordnet ist. Aber ich weiß nicht, wie es auf API-Ebene verwendet werden würde.

Könnten Sie nicht einfach eine Anfrage an eine IP mit einem bestimmten Host Header senden?

Nein, denn es muss die spezifische IP im Webserver-Log enthalten sein (um mit Tools wie GeoIP auf ein bestimmtes Land zurückgesetzt zu werden).

Ich folge nicht.

>>> 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()

Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.

Ich denke, das ist außerhalb des Rahmens.

Für Leute, die immer noch daran interessiert sind, möchten Sie vielleicht einen Blick auf den HttpConnectionPool von urlib3 werfen, insbesondere dort, wo neue httplib/http.client HttpConnections erstellt werden, damit Sie source_address übergeben können. Wenn Sie dies tun, können Sie dies weiterhin im Anfragemodell der Anfrage anzeigen und nach Belieben verwenden.

Für diejenigen, die von Google hierher kommen, sollten Sie diesem folgen: https://github.com/shazow/urllib3/issues/9#issuecomment -15871420

Dies sollte erneut geöffnet werden - es ist nicht außerhalb des Umfangs und es ist durchaus notwendig, wenn Sie mit Hosts innerhalb eines VPN arbeiten.

Abhängig von den Besonderheiten der Adressräume des aktuellen & entfernten Netzwerks muss man oft Anfragen von der IP an die vom VPN eingerichtete Schnittstelle senden. Oder nehmen Sie Änderungen an der Routing-Tabelle vor. Dies gilt zumindest für die Verwendung von NetExtender auf einem Mac.

Viele Netzwerkprogramme wie ssh und curl unterstützen die Einstellung der Schnittstelle zur Verwendung / Bindung an die IP einer Schnittstelle.

@petri Ihre Behauptung, dass dies nicht außerhalb des Umfangs liegt, ist falsch, da der Umfang des Requests-Projekts vollständig von Kenneth definiert wird. =)

Konkret sehen wir es als außerhalb des Rahmens für das Kernanfragen-Projekt an. Sie können es jedoch immer noch tun, und es ist nicht einmal sehr schwer. In dieser Diskussion wird beschrieben, wie es geht.

Schön - mir war dieser Mechanismus bei Anfragen nicht bekannt. Vielen Dank!

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()

Wenn der von den beiden Quell-IP-Nummern ausgehende Verkehr über zwei verschiedene öffentliche IP-Nummern ausgeht, sollten diese verschiedenen öffentlichen Nummern im Ursprungsfeld der Antwort angezeigt werden.

Ich wollte Sie nur wissen lassen, dass ich schon ewig das Internet durchforste und dies die einzige Lösung war, die für mich funktionierte.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen