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
相关产品推荐
相关产品推荐

