VirusTotal Python scan_file()报错Unclosed client session

博客讨论了在使用VirusTotalApi3.0进行恶意文件检测时遇到的Unclosedclientsession错误。作者详细分析了问题原因,指出在调用scan_file()函数并等待检测完成时,由于没有正确关闭aiohttp.ClientSession(),导致了该错误。为解决此问题,提出了修改scan_file_async()函数,在返回结果前添加关闭ClientSession的代码,以此避免资源泄漏。其他类似函数也可参照此方法修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要对指定文件做恶意性检测,项目中选择使用的VirusTotal Api 3.0,但是在调用vt库中的scan_file()函数时,发现会报错Unclosed client session。

调用代码片段如下:

private_key = vtapi_key
vt_client = vt.Client(private_key)

with open(file, 'rb') as f:
    analysis = vt_client.scan_file(f, wait_for_completion=True)

报错截图如下:

翻看scan_file()源码发现,wait_for_completion=True实际是通过每20s检查一下VirusTotal服务器端是否完成了文件检测实现的。在客户端和服务器之间的通信全由aiohttp库实现,当服务端返回status == 'completed'之后,就直接将检测结果返回,而没有关闭aiohttp.ClientSession()的实例。

修复方法(在以下代码块中标注):修改scan_file_async()函数,在return前关闭ClientSession。

async def scan_file_async(self, file, wait_for_completion=False):

    if not isinstance(file, io.IOBase):
      raise TypeError(f'Expected a file to be a file object, got {type(file)}')

    part = aiohttp.get_payload(file)
    filename = file.name if hasattr(file, 'name') else 'unknown'
    disposition = f'form-data; name="file"; filename="{filename}"'
    part.headers['Content-Disposition'] = disposition
    form_data = aiohttp.MultipartWriter('form-data')
    form_data.append_payload(part)

    upload_url = await self.get_data_async('/files/upload_url')
    response = ClientResponse(
        await self._get_session().post(
          upload_url, data=form_data, proxy=self._proxy))

    analysis = await self._response_to_object(response)

    if wait_for_completion:
      analysis = await self._wait_for_analysis_completion(analysis)

    # 加入以下这句代码
    await self._session.close()

    return analysis

其他 scan_***_async() 如果报类似错误应该可以同理解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值