【问题标题】:Python - multiprocessing and monkey patching way safety ? (best monkey patching method may born from my idea)Python - 多处理和猴子修补方式安全吗? (最好的猴子修补方法可能源于我的想法)
【发布时间】:2015-06-03 08:41:54
【问题描述】:

我正在写一个代理软件,这个代理软件支持所有标准领域,但现在最难的问题,“每个域/url的socks代理(如果'???' in self.host: do socks'”没有中断整个脚本使用猴子补丁方法,我必须使用猴子补丁方法,因为它是迄今为止最好的没有任何错误,但是如果我使用该方法,我的代理将使用该袜子服务器下载所有页面,而不仅仅是我的页面只想使用socks代理只是因为简单的猴子补丁方法“socket”改变了整个socket库,让整个socket库使用那个socks代理,以及基于socket库的httplib、urllib。

https://github.com/Anorov/PySocks

import urllib2
import socket
import socks

socks.set_default_proxy(socks.SOCKS5, "localhost")
socket.socket = socks.socksocket

urllib2.urlopen("http://www.somesite.com/") # All requests will pass through the SOCKS proxy

无论如何我都必须使用猴子补丁,该页面中的 opener.open 方法会破坏很多页面,例如永远重定向 30x,TLSv1 错误....但是猴子补丁是“完美的”,没有错误,没有任何东西,只是工作但整个本地代理都将使用 socks 代理,这太过分了,我想每页使用 socks 代理。

在日复一日不停地思考之后,我想到了一些东西,“如果我使用多处理创建一个新的新进程,然后对该进程的猴子补丁套接字,urlopen 像上面一样从域/url 获取内容而不影响我的本地代理主进程并将内容返回到我的主进程并使用该内容显示到我的网络浏览器,这太棒了!”

我的方法几乎是这样的:“我在 127.0.0.1:1111 有一个代理监听并在 127.0.0.1:2222 创建另一个代理监听,端口 2222 的代理将被猴子修补套接字库,使其下载页面使用我的 socks 代理,每次我想使用我的 socks 代理时,我都会将我的 1111 代理与 2222 代理链接起来”。

另外,如果可以使用猴子修补方法,也许我们可以通过猴子修补套接字等来限制带宽,而不会破坏主进程。

我的想法可能是有史以来最伟大的猴子补丁的诞生,请帮助我,如果你能帮助我编写类似演示代码的东西,我将不胜感激。

【问题讨论】:

  • 我觉得这个问题难以理解。如果英语不是您的第一语言(或者即使是),您可能希望有人为您校对和编辑它,以便每个句子都有意义。另外,请阅读help center 上如何提出好问题的指南。
  • 谢谢你,我应该编辑什么以使我的帖子可读?谢谢你。我认为这并不难理解,我尝试重复我的问题以使我的问题更容易理解。简单地说:“使用多处理创建子进程以使用pySocks(猴子修补方法“socket.socket = socks.socksocket”)下载页面的方式创建子进程以伪造我的IP地址并将页面内容返回给我的父进程”跨度>
  • 这可能超出了我在 cmets 中可以为您提供的帮助。您在评论中写的句子比问题中的任何句子都更容易理解。它至少更短。您问题中的第一句话用于整段-太长而无法理解-您将想法串在一起,而不是清楚地说明它们。什么是奇怪的 "(if '???;" 字符集 - 带有不匹配的括号?与其在 cmets 中回答我的问题,我建议尝试用简洁的陈述重写你的问题。阅读this
  • 好的,我现在就回答我自己的问题!
  • 谢谢,我知道了!总有一天我会学习如何写一个更容易理解的问题。

标签: python sockets proxy


【解决方案1】:

这是我对我的问题的回答,谢谢大家:

import multiprocessing as mp
import urllib.request

def foo(q):
    #q.put("123")
    import socks
    import socket
    socks.set_default_proxy(socks.SOCKS5, "localhost", 10080)
    socket.socket = socks.socksocket
    r = urllib.request.urlopen("http://httpbin.org/ip")
    #print("123")
    q.put(r.read())

if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=foo, args=(q,))
    p.start()
    print(q.get())
    p.join()
    r = urllib.request.urlopen("http://httpbin.org/ip")
    print(r.read())

这种方式将创建一个独立的进程和来自该进程的猴子补丁套接字库。

ILDE 的输出:

b'{\n  "origin": "xxx.148.2.18"\n}\n'
b'{\n  "origin": "xx.xxx.113.133"\n}\n'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-12
    • 2021-03-10
    • 1970-01-01
    • 2016-11-27
    • 2015-03-23
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多