使用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界面和主函数的完整脚本:
- 创建
proxy_addon.py文件,仅编写mitmproxy插件所需的钩子函数:
# proxy_addon.py def request(flow): # 处理请求的逻辑 print(f"捕获请求: {flow.request.url}") def response(flow): # 处理响应的逻辑 print(f"捕获响应: {flow.response.status_code}")
- 修改主程序中调用mitmdump的参数,指向这个独立插件脚本:
# 替换原mitmdump调用行 mitmdump(['--scripts', 'proxy_addon.py', '--set', 'block_global=false'])
方案2:在当前脚本中添加加载判断
通过__name__判断脚本的运行场景,仅在作为主程序执行时启动curses界面,同时确保mitmproxy加载时只暴露合法的插件对象:
- 在脚本末尾添加主程序启动入口:
if __name__ == '__main__': import curses curses.wrapper(main)
- 将
ColorTable的定义或其他非插件相关代码,放到main函数内部或通过__name__判断包裹,避免被mitmproxy扫描到:
def main(stdscr): # 仅在主程序运行时定义ColorTable class ColorTable: # 类定义 pass # 剩余主程序逻辑...
内容的提问来源于stack exchange,提问作者raspberry400
相关产品推荐
相关产品推荐

