Requests: 特定のIPをバインドする

作成日 2012年01月27日  ·  15コメント  ·  ソース: psf/requests

特定のIPを送信元アドレスとしてバインドできると便利です(複数のIPアドレスを持つホストの場合)。

最も参考になるコメント

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

2つの送信元IP番号から発信されるトラフィックが2つの異なるパブリックIP番号を経由する場合、応答の発信元フィールドにこれらの異なるパブリック番号が表示されます。

全てのコメント15件

面白い。 どのように使用法を想像しますか?

^ shazow / urllib3#9

目標は、特定の国に関連付けられたIPを使用してクローラーを作成することです。 しかし、APIレベルでどのように使用されるかはわかりません。

特定のHostヘッダーを持つIPにリクエストを送信するだけではいけませんか?

いいえ、Webサーバーログに特定のIPが含まれているためです(GeoIPなどのツールを使用して特定の国に戻されます)。

私はフォローしません。

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

2つの送信元IP番号から発信されるトラフィックが2つの異なるパブリックIP番号を経由する場合、応答の発信元フィールドにこれらの異なるパブリック番号が表示されます。

これは範囲外だと思います。

これにまだ興味がある人は、urlib3のHttpConnectionPoolを確認することをお勧めします。特に、source_addressを渡すことができるように新しいhttplib / http.clientHttpConnectionsがスピンアップされている場合はそうです。 そうすれば、リクエストのリクエストモデルでこれを公開し続け、必要に応じて使用できます。

グーグルからここに到着する人のために、あなたはこれに従うことを望むでしょう: https

これは再度開く必要があります-範囲外ではなく、VPN内のホストを操作する場合は非常に必要です。

現在のネットワークとリモートネットワークのアドレス空間の詳細によっては、VPNによって設定されたインターフェイスにバインドされたIPから要求を送信しなければならないことがよくあります。 または、ルーティングテーブルに変更を加えます。 これは、少なくともMacでNetExtenderを使用する場合に当てはまります。

sshやcurlなどの多くのネットワークプログラムは、使用するインターフェイスの設定/インターフェイスのIPへのバインドをサポートしています。

@petri Requestsプロジェクトのスコープが完全にケネスによって定義されていることを考えると、これがスコープ外ではないというあなたの主張は正しくありません。 =)

具体的には、コアリクエストプロジェクトの範囲外であると考えています。 しかし、それでもそれは可能であり、それほど難しいことでもありません。 このディスカッションでは、その方法について説明します。

ニース-リクエストでそのようなメカニズムを認識していませんでした。 ありがとう!

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

2つの送信元IP番号から発信されるトラフィックが2つの異なるパブリックIP番号を経由する場合、応答の発信元フィールドにこれらの異なるパブリック番号が表示されます。

私がずっとインターネットを精査してきたことをあなたに知ってもらいたかったのですが、これが私のために働いた唯一の解決策でした。

https://toolbelt.readthedocs.io/en/latest/adapters.html#sourceaddressadapterが存在し、ハッキングがはるかに少ない

このページは役に立ちましたか?
0 / 5 - 0 評価