1

我有一堆任务要在 cPanel 中自动化。http://videos.cpanel.net/cpanel-api-automation/中描述了一个 cPanel API,但我尝试了我认为对我来说更容易的方法......

  • 基于 Skyronic 在How do I send a HTTP POST value to a (PHP) page using Python?我试过了

    import urllib, urllib2, ssl
    url = 'https://mysite.com:2083/login'
    user_agent = 'Mozilla/5.0 meridia (Windows NT 5.1; U; en)' 
    values = {'name':cpaneluser,
              'pass':cpanelpw}
    headers = {'User-Agent':user_agent}
    data = urllib.urlencode(values)
    req = urllib2.Request(url,data,headers)
    response = urllib2.urlopen(req)
    page = response.read()
    

    呼吁urlopen()正在提高NameError: global name 'HTTPSConnectionV3' is not defined

  • 因此,然后基于http://bugs.python.org/issue11220我尝试在上面的代码之前使用

    import httplib
    class HTTPSConnectionV3(httplib.HTTPSConnection):
        def __init__(self, *args, **kwargs):
            httplib.HTTPSConnection.__init__(self, *args, **kwargs)
    
        def connect(self):
            sock = socket.create_connection((self.host, self.port), self.timeout)
            if self._tunnel_host:
                self.sock = sock
                self._tunnel()
            try:
                self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, \
                                            ssl_version=ssl.PROTOCOL_SSLv3)
            except ssl.SSLError, e:
                print("Trying SSLv3.")
                self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, \
                                            ssl_version=ssl.PROTOCOL_SSLv23)
    
    class HTTPSHandlerV3(urllib2.HTTPSHandler):
        def https_open(self, req):
            return self.do_open(HTTPSConnectionV3, req)
    
    urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3()))
    

    这确实会打印“尝试 SSLv3”并引发URLError: <urlopen error [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol>

  • 最后,这让我来到了https://github.com/kennethreitz/requests/issues/606,gregakespret说他使用 Senthil Kuaran 在http://bugs.python.org/issue11220的解决方案解决了一个类似的问题:

    https_sslv3_handler = urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_SSLv3))
    opener = urllib.request.build_opener(https_sslv3_handler)
    urllib.request.install_opener(opener)
    

    但这引发了AttributeError: 'module' object has no attribute 'request'。并且确实help(urllib)不包括任何提及请求,并import urllib.request导致No module named request.

    我在 Enthought Canopy 发行版中使用 Python 2.7.3。cPanel 站点使用的是自签名证书,我提到它是因为它是一种违规行为,会导致常规浏览器出错,尽管我认为 urllib 和 urllib2 实际上并没有对证书进行身份验证。

    感谢您阅读,如果您有建议或可以帮助我理解问题,更是如此。

  • 4

    1 回答 1

    0

    我会使用请求库。

    我是 OP,自从我发布这个已经有一段时间了。我已经使用 requests 库解决了其他相关任务(使用 Instructure 的 Canvas API 的 POST),并发现使用 urllib/urllib2 的代码现在更短更甜了。

    有人刚刚提出了这个问题,让我看到没有人回答它。我的回答对我的 OP 来说并不重要,但这是我建议的方向,自发布以来已经解决了相关问题。

    至于这个问题,我通过在运行 cPanel 的服务器上的 BASH 中编写脚本解决了这个问题。这只是确定要调用哪些 cPanel 脚本的问题。但我没有让它通过 cPanel Web API 运行。

    于 2014-05-20T23:41:06.190 回答