Skip to content

Instantly share code, notes, and snippets.

@fufuok
Last active July 10, 2023 06:33
Show Gist options
  • Save fufuok/79d54036b0d25032da955f2991ed142b to your computer and use it in GitHub Desktop.
Save fufuok/79d54036b0d25032da955f2991ed142b to your computer and use it in GitHub Desktop.
python3 requests bind source IP request. 绑定接口IP(源IP)请求URL.
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
demo-requests-bind-src-ip.py
~~~~~~~~
:author: Fufu, 2022/12/28
"""
import socket
import sys
import requests
class BindSrcIP:
def __init__(self, ip: str):
self.src_ip = ip
self.socket = socket.socket
def __enter__(self):
def src_socket(*args, **kwargs):
s = self.socket(*args, **kwargs)
s.bind((self.src_ip, 0))
return s
socket.socket = src_socket
def __exit__(self, type, value, trace):
socket.socket = self.socket
if __name__ == '__main__':
src_ip = sys.argv[1] if len(sys.argv) > 1 else '0.0.0.0'
with BindSrcIP(src_ip):
r = requests.get('https://ipinfo.io')
print(r.text)
@fufuok
Copy link
Author

fufuok commented Jul 10, 2023

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
    xycurl.py
    ~~~~~~~~
    指定源 IP 请求 ipinfo.io / myip.ipip.net

    e.g.::

        python3 xycurl.py
        ./xycurl.py
        ./xycurl.py 11.65.58.1
        ./xycurl.py 11.65.58.1 ipinfo.io
        ./xycurl.py 11.65.58.1 open-ip.ff.com:8080

    :author: Fufu, 2022/7/13
    :update: Fufu, 2023/2/23 支持指定带端口的接口地址
"""
import json
import sys
from http.client import HTTPConnection


def curl(host, port, src_addr, *, timeout=5):
    try:
        client = HTTPConnection(host, port, source_address=src_addr, timeout=timeout)
        client.request('GET', '/')
        resp = client.getresponse()
        print('>>>', resp.status, resp.reason)
        data = resp.read()
        client.close()
    except Exception as e:
        print('>>>', e)
        return

    try:
        print('>>>', json.loads(data))
    except Exception:
        try:
            print('>>>', data.decode('utf-8'))
        except Exception:
            print('>>>', data)


if __name__ == '__main__':
    s = (sys.argv[1], 0) if len(sys.argv) > 1 else None
    h = sys.argv[2] if len(sys.argv) > 2 else 'ipinfo.io'
    p = 80
    if ':' in h and '[' not in h:
        h, p = h.rsplit(':', 1)
    curl(h, p, s)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment