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

Maltego本地转换执行报错:ParseError at [row,col];[1,1] Message: Content is not allowed in prolog 问题排查求助

Maltego本地转换报错:ParseError at [row,col];[1,1] Message: Content is not allowed in prolog

哈哈,这个坑我当初刚写Maltego本地转换时也踩过!这个错误的核心原因很简单:Maltego要求本地转换的输出必须是符合它规范的XML格式,但你现在直接打印了姓名列表,这是纯文本,完全不符合XML的解析要求。

XML解析器看到你的输出(比如直接打印的John Smith),在XML的prolog(也就是开头的<?xml version="1.0"?>声明之前)就遇到了非XML内容,所以直接抛出了这个解析错误。

解决方法:输出Maltego兼容的XML格式

你有两种方式来修正这个问题,推荐用官方库来简化开发:

方式1:使用Maltego官方的maltego-trx库(推荐)

这个库会帮你自动处理XML的生成,不用手动拼接格式,不容易出错。

首先确保你已经安装了库:

pip install maltego-trx

然后修改你的代码如下:

from maltego_trx.entities import Person
from maltego_trx.transform import DiscoverableTransform

class NameFromCSV(DiscoverableTransform):
    @staticmethod
    def create_entities(request, response):
        # 获取Maltego传递过来的手机号输入
        search_phone = request.Value.strip()
        matching_names = []
        
        with open("phone_to_names.csv") as f:
            for ln in f.readlines():
                # 跳过空行避免出错
                if not ln.strip():
                    continue
                phone, name, age = ln.split(",", 2)
                if phone.strip() == search_phone:
                    # 为每个匹配的姓名创建Person实体
                    person_entity = response.addEntity(Person, name.strip())
                    # 还可以给实体添加额外属性,比如年龄
                    person_entity.addProperty(fieldName="age", displayName="Age", value=age.strip())

if __name__ == "__main__":
    from maltego_trx.registry import register_transform_classes
    from maltego_trx.server import app_server

    # 注册转换类
    register_transform_classes([NameFromCSV])
    # 启动本地转换服务(Maltego会连接这个服务)
    app_server.run(port=8080)

之后在Maltego中配置本地转换时,选择这个脚本作为转换即可,库会自动生成符合要求的XML响应。

方式2:手动拼接XML格式(不推荐,容易出错)

如果你不想用官方库,也可以手动构建符合Maltego规范的XML输出:

import sys

def get_names(search_phone):
    matching_names = []
    with open("phone_to_names.csv") as f:
        for ln in f.readlines():
            if not ln.strip():
                continue
            phone, name, age = ln.split(",", 2)
            if phone.strip() == search_phone.strip():
                matching_names.append(name.strip())
    return matching_names

if __name__ == "__main__":
    # 从命令行获取Maltego传递的手机号参数
    search_phone = sys.argv[1].strip() if len(sys.argv) > 1 else ""
    names = get_names(search_phone)
    
    # 严格按照Maltego的XML格式构建输出
    xml_response = '<?xml version="1.0" encoding="UTF-8"?>\n'
    xml_response += '<MaltegoMessage>\n'
    xml_response += '  <MaltegoTransformResponseMessage>\n'
    xml_response += '    <Entities>\n'
    for name in names:
        xml_response += f'      <Entity Type="Person">\n'
        xml_response += f'        <Value>{name}</Value>\n'
        xml_response += '      </Entity>\n'
    xml_response += '    </Entities>\n'
    xml_response += '  </MaltegoTransformResponseMessage>\n'
    xml_response += '</MaltegoMessage>'
    
    print(xml_response)

额外注意事项

  • 确保你的phone_to_names.csv文件路径正确,Maltego运行转换时能访问到它(最好把CSV和脚本放在同一目录,或者使用绝对路径)。
  • 检查CSV文件的内容,避免空行或者格式错误的行,防止split操作抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:47:49