You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用mitmproxy HTTP模块时触发TypeError报错求助

解决mitmproxy调用时出现的TypeError: is not a callable object错误

问题场景

编写的网络分析工具代码中,通过--proxy参数调用mitmproxy的mitmdump启用HTTPS解密功能时,触发错误导致程序退出,相关代码及报错信息如下:

主程序代码

def main(stdscr):
    try:
        parser = argparse.ArgumentParser(description='NetSour Network Analyzer')
        parser.add_argument('--proxy', action='store_true', help='Enable HTTPS decryption (BETA)')
        args = parser.parse_args()
        if args.proxy:
            print("WARNING: HTTPS decryption is in BETA. Use at your own risk.")
            from mitmproxy.tools.main import mitmdump
            mitmdump(['--scripts', __file__, '--set', 'block_global=false'])
            return
        if is_root():
            stdscr.addstr(0, 0, "[+] You are root.")
        else:
            stdscr.addstr(0, 0, "[-] You are not root.")
        stdscr.addstr(1, 0, "[+] Enter the interface name: ")
        curses.echo()
        interface = stdscr.getstr().decode()
        curses.noecho()

        packet_queue = Queue()
        sniff_thread = Thread(target=sniff_packets, args=(packet_queue, interface))
        sniff_thread.daemon = True
        sniff_thread.start()
        
        stdscr.addstr(3, 0, "[+] Starting NetSour...")
        stdscr.refresh()
        time.sleep(1)
        
        display_packets(stdscr, packet_queue)
    except Exception as e:
        print(f"Error in main function: {str(e)}")

报错信息

return _signature_from_callable(obj, sigcls=cls,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/inspect.py", line 2447, in _signature_from_callable

raise TypeError('{!r} is not a callable object'.format(obj))
TypeError: <ColorTable> is not a callable object
                                                                                         [19:36:20.886] HTTP(S) proxy listening at *:8080.
Error logged during startup, exiting...

错误原因

当使用mitmdump(['--scripts', __file__, ...])加载当前脚本时,mitmproxy会扫描脚本内的所有对象,尝试识别符合插件接口的可调用对象(如钩子函数、特定类)。脚本中存在的ColorTable对象(未在提供的代码片段中显示,但报错明确指向)并非mitmproxy插件所需的可调用钩子,导致inspect模块在尝试获取其签名时抛出类型错误。

解决方案

方案1:拆分插件与主程序逻辑

将mitmproxy插件逻辑单独拆分到独立脚本中,避免mitmdump加载包含curses界面和主函数的完整脚本:

  1. 创建proxy_addon.py文件,仅编写mitmproxy插件所需的钩子函数:
# proxy_addon.py
def request(flow):
    # 处理请求的逻辑
    print(f"捕获请求: {flow.request.url}")

def response(flow):
    # 处理响应的逻辑
    print(f"捕获响应: {flow.response.status_code}")
  1. 修改主程序中调用mitmdump的参数,指向这个独立插件脚本:
# 替换原mitmdump调用行
mitmdump(['--scripts', 'proxy_addon.py', '--set', 'block_global=false'])

方案2:在当前脚本中添加加载判断

通过__name__判断脚本的运行场景,仅在作为主程序执行时启动curses界面,同时确保mitmproxy加载时只暴露合法的插件对象:

  1. 在脚本末尾添加主程序启动入口:
if __name__ == '__main__':
    import curses
    curses.wrapper(main)
  1. 将ColorTable的定义或其他非插件相关代码,放到main函数内部或通过__name__判断包裹,避免被mitmproxy扫描到:
def main(stdscr):
    # 仅在主程序运行时定义ColorTable
    class ColorTable:
        # 类定义
        pass
    # 剩余主程序逻辑...

内容的提问来源于stack exchange,提问作者raspberry400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:52:44