当前位置:论坛首页 > 第三方应用 > Linux面板插件

【已回应】宝塔api,python添加网站报500错误

发表在 第三方应用2020-4-11 15:09 [复制链接] 4 5416

有个问题,请教下各位大神,我在用python去添加网站的时候总是报500错误,其他像获取系统信息,获取LOG日志等都正常的,不知道哪里搞错了,请假下。python文件如下,python本版:3.7.0
  1. #coding: utf-8
  2. # +-------------------------------------------------------------------
  3. # | 宝塔Linux面板
  4. # +-------------------------------------------------------------------
  5. # | Copyright (c) 2015-2099 宝塔软件() All rights reserved.
  6. # +-------------------------------------------------------------------
  7. # | Author: 黄文良 <>
  8. # +-------------------------------------------------------------------

  9. #------------------------------
  10. # API-Demo of Python
  11. #------------------------------
  12. import time,hashlib,sys,os,json
  13. class bt_api:
  14.     __BT_KEY = '***'
  15.     __BT_PANEL = '***'

  16.     #如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
  17.     def __init__(self,bt_panel = None,bt_key = None):
  18.         if bt_panel:
  19.             self.__BT_PANEL = bt_panel
  20.             self.__BT_KEY = bt_key


  21.     #取面板日志
  22.     def get_logs(self):
  23.         #拼接URL地址
  24.         url = self.__BT_PANEL + '/data?action=getData'

  25.         #准备POST数据
  26.         p_data = self.__get_key_data()  #取签名
  27.         p_data['table'] = 'logs'
  28.         p_data['limit'] = 10
  29.         p_data['tojs'] = 'test'

  30.         #请求面板接口
  31.         result = self.__http_post_cookie(url,p_data)

  32.         #解析JSON数据
  33.         return json.loads(result)


  34.     #添加FTP
  35.     def add_ftp(self):
  36.         #拼接URL地址
  37.         url = self.__BT_PANEL + '/ftp?action=AddUser'

  38.         #准备POST数据
  39.         p_data = self.__get_key_data()  #取签名
  40.         p_data['ftp_username'] = 'test02'
  41.         p_data['ftp_password'] = 'n22TfaDwt4nBaA7X'
  42.         p_data['path'] = '/www/wwwroot/jianzhanha.com'
  43.         p_data['ps'] = 'test'

  44.         #请求面板接口
  45.         result = self.__http_post_cookie(url,p_data)

  46.         #解析JSON数据
  47.         return json.loads(result)





  48.     #取系统状态
  49.     def sysstatus(self):
  50.         #拼接URL地址
  51.         url = self.__BT_PANEL + '/system?action=GetSystemTotal'

  52.         #准备POST数据
  53.         p_data = self.__get_key_data()  #取签名
  54.         #请求面板接口
  55.         result = self.__http_post_cookie(url,p_data)

  56.         #解析JSON数据
  57.         return json.loads(result)
  58.     #获取磁盘信息
  59.     def diskinfo(self):
  60.         #拼接URL地址
  61.         url = self.__BT_PANEL + '/system?action=GetDiskInfo'

  62.         #准备POST数据
  63.         p_data = self.__get_key_data()  #取签名
  64.         #请求面板接口
  65.         result = self.__http_post_cookie(url,p_data)

  66.         #解析JSON数据
  67.         return json.loads(result)


  68.     def addsite(self):
  69.         #拼接URL地址
  70.         url = self.__BT_PANEL + '/site?action=AddSite'

  71.         #准备POST数据
  72.         p_data = self.__get_key_data()  #取签名

  73.         p_data['webname'] = {'domain':'test.com','domainlist':[],'count':0}
  74.         p_data['path'] = '/www/wwwroot/test.com'
  75.         p_data['type_id'] = 0
  76.         p_data['type'] = 'PHP'
  77.         p_data['version'] = 72
  78.         p_data['port'] = 80
  79.         p_data['ps'] = 'test'
  80.         p_data['ftp'] = False
  81.         p_data['ftp_username'] = 'testtest'
  82.         p_data['ftp_password'] = 'testtest'
  83.         p_data['sql'] = 'MySQL'
  84.         p_data['codeing'] = 'utf8'
  85.         p_data['datauser'] = 'testtest'
  86.         p_data['datapassword'] = 'testtesttesttest'
  87.         #请求面板接口
  88.         result = self.__http_post_cookie(url,p_data)

  89.         #解析JSON数据
  90.         return json.loads(result)

  91.     #计算MD5
  92.     def __get_md5(self,s):
  93.         m = hashlib.md5()
  94.         m.update(s.encode('utf-8'))
  95.         return m.hexdigest()

  96.     #构造带有签名的关联数组
  97.     def __get_key_data(self):
  98.         now_time = int(time.time())
  99.         p_data = {
  100.                     'request_token':self.__get_md5(str(now_time) + '' + self.__get_md5(self.__BT_KEY)),
  101.                     'request_time':now_time
  102.                  }
  103.         return p_data


  104.     #发送POST请求并保存Cookie
  105.     #@url 被请求的URL地址(必需)
  106.     #@data POST参数,可以是字符串或字典(必需)
  107.     #@timeout 超时时间默认1800秒
  108.     #return string
  109.     def __http_post_cookie(self,url,p_data,timeout=18000):
  110.         cookie_file = './' + self.__get_md5(self.__BT_PANEL) + '.cookie'
  111.         with open(cookie_file,"a") as file:
  112.             file.write("# Netscape HTTP Cookie File\n")
  113.         if sys.version_info[0] == 2:
  114.             #Python2
  115.             import urllib,urllib2,ssl,cookielib

  116.             #创建cookie对象
  117.             cookie_obj = cookielib.MozillaCookieJar(cookie_file)

  118.             #加载已保存的cookie
  119.             if os.path.exists(cookie_file):cookie_obj.load(cookie_file,ignore_discard=True,ignore_expires=True)

  120.             ssl._create_default_https_context = ssl._create_unverified_context

  121.             data = urllib.urlencode(p_data)
  122.             req = urllib2.Request(url, data)
  123.             opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_obj))
  124.             response = opener.open(req,timeout=timeout)

  125.             #保存cookie
  126.             cookie_obj.save(ignore_discard=True, ignore_expires=True)
  127.             return response.read()
  128.         else:
  129.             #Python3
  130.             import urllib.request,ssl,http.cookiejar
  131.             cookie_obj = http.cookiejar.MozillaCookieJar(cookie_file)
  132.             if os.path.exists(cookie_file):
  133.                 cookie_obj.load(cookie_file,ignore_discard=True,ignore_expires=True)
  134.             # cookie_obj.load(cookie_file,ignore_discard=True,ignore_expires=True)
  135.             handler = urllib.request.HTTPCookieProcessor(cookie_obj)
  136.             data = urllib.parse.urlencode(p_data).encode('utf-8')
  137.             print(data)
  138.             req = urllib.request.Request(url, data)
  139.             opener = urllib.request.build_opener(handler)
  140.             response = opener.open(req,timeout = timeout)
  141.             cookie_obj.save(ignore_discard=True, ignore_expires=True)
  142.             result = response.read()
  143.             if type(result) == bytes: result = result.decode('utf-8')
  144.             return result


  145. if __name__ == '__main__':
  146.     #实例化宝塔API对象
  147.     my_api = bt_api()
  148.     domain = 'test.laojihost.com'
  149.     username = str(domain)[0-15]
  150.     # 调用get_logs方法
  151.     r_data = my_api.get_logs()
  152.     # r_sys = my_api.sysstatus()
  153.     # r_disk = my_api.diskinfo()
  154.     r_add_site = my_api.addsite()
  155.     r_add_ftp = my_api.add_ftp()
  156.     #打印响应数据
  157.     print(r_data)
  158.     # print(r_sys)
  159.     # print(r_disk)
  160.     # print(r_add_site)
  161.     print(r_add_ftp)
复制代码


运行报错如下:
  1. Traceback (most recent call last):
  2.   File "demo.py", line 191, in <module>
  3.     r_add_site = my_api.addsite()
  4.   File "demo.py", line 113, in addsite
  5.     result = self.__http_post_cookie(url,p_data)
  6.   File "demo.py", line 175, in __http_post_cookie
  7.     response = opener.open(req,timeout = timeout)
  8.   File "/usr/local/python3/lib/python3.7/urllib/request.py", line 531, in open
  9.     response = meth(req, response)
  10.   File "/usr/local/python3/lib/python3.7/urllib/request.py", line 641, in http_response
  11.     'http', request, response, code, msg, hdrs)
  12.   File "/usr/local/python3/lib/python3.7/urllib/request.py", line 569, in error
  13.     return self._call_chain(*args)
  14.   File "/usr/local/python3/lib/python3.7/urllib/request.py", line 503, in _call_chain
  15.     result = func(*args)
  16.   File "/usr/local/python3/lib/python3.7/urllib/request.py", line 649, in http_error_default
  17.     raise HTTPError(req.full_url, code, msg, hdrs, fp)
  18. urllib.error.HTTPError: HTTP Error 500: INTERNAL SERVER ERROR
复制代码



使用道具 举报 只看该作者 回复
发表于 2020-4-11 16:42:28 | 显示全部楼层
471729998
加开发群问阿良
使用道具 举报 回复 支持 反对
发表于 2020-4-11 16:45:18 | 显示全部楼层
大炮运维V587 发表于 2020-4-11 16:42
471729998
加开发群问阿良

好的,谢谢
使用道具 举报 回复 支持 反对
发表于 2020-4-15 17:05:51 | 显示全部楼层
@宝塔用户_cetjla  你好 你的这个问题解决了吗
使用道具 举报 回复 支持 反对
发表于 2020-8-7 15:17:43 | 显示全部楼层
addsite中数据提交格式:
    def addsite(self):
        # 拼接URL地址
        url = self.__BT_PANEL + '/site?action=AddSite'

        # 准备POST数据
        p_data = self.__get_key_data()  # 取签名
        # p_data['tojs'] = 'test'
        # p_data={}
        p_data['webname'] = json.dumps({'domain': '', 'domainlist': [''], 'count': 0})  
        p_data['path'] = '/www/wwwroot/abc.com'
        p_data['type_id'] = '0'
        p_data['type'] = 'PHP'
        p_data['version'] = '00'
        p_data['port'] = '80'
        p_data['ps'] = 'test'
        p_data['ftp'] = "False"
        p_data['ftp_username'] = 'testtest'
        p_data['ftp_password'] = 'testtest'
        p_data['sql'] = "FALSE"
        p_data['codeing'] = 'utf8'
        p_data['datauser'] = 'testtest'
        p_data['datapassword'] = 'testtesttesttest'
        # 请求面板接口
        result = self.__http_post_cookie(url, p_data)

        # 解析JSON数据
        return json.loads(result)
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

立即付费处理

工作时间:09:00至24:00

快速回复 返回顶部 返回列表