Я пытаюсь перехватить пакеты на основе параметров, отправленных через разногласия, а затем отправить файл захвата на канал, где был вызван бот. У меня проблемы с захватом части пакета, что, как я полагаю, вызвано функцией Sniff PyShark, использующей asyncio.
Я пробовал много вещей, в том числе ставил мою функцию сниффинга как асинхронную, использовал .get_event_loop (), использовал функцию ожидания ажиотажа и т. Д. Я довольно потерян и разочарован. Вот часть кода, который я пробовал:
import sharkBot
import asyncio
from discord.ext import commands
import discord
TOKEN = '<Bot Token Here>'
bot = commands.Bot(command_prefix='!')
shark = sharkBot.sharkBot()
@bot.command()
async def cap (ctx, *args):
#Create dictionary for storing values
values = {}
params = {'p' : 'packet_count', 'o' : 'output_file', 't' : 'tshark_path'}
#Add values to dictionary
for arg in args:
arg = arg.replace('-', '')
value = arg[arg.find("(")+1:arg.find(")")]
sep = '('
arg = arg.split(sep, 1)[0]
command = params.get(arg, "Invalid Command")
values[command] = value
#Sniff packet based on values
packets = asyncio.get_event_loop().run_until_complete(packetCap(values))
await ctx.send(packets)
def packetCap(values):
capture = shark.capturePacketsByCount(**values)
return capture
bot.run(TOKEN)
CapturePacketsByCount (** значения):
def capturePacketsByCount(self, interface="en0", packet_count=100, tshark_path="/<PATH NAME>", output_file=None):
#capture specified number of packets
self.capture = pyshark.LiveCapture(tshark_path=tshark_path, interface=interface, output_file=output_file)
self.capture.sniff(packet_count=packet_count)
self.caplen = len(self.capture)
#capture packets for given amount of time
return self.capture
Я также попытался заменить последние две строки в шапке следующими фрагментами:
packets = await shark.capturePacketsByCount(**values)
await ctx.send(packets)
Я также попытался сделать асинхронные функции packetCap и capturePacketsByCount.
Я получаю ошибку:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 79, in wrapped
ret = await coro(*args, **kwargs)
File "bot2.py", line 23, in cap
x = asyncio.get_event_loop().run_until_complete(packetCap(values))
File "bot2.py", line 26, in packetCap
x = shark.capturePacketsByCount(**values)
File "/Users/cooldude/Projects/PySharkStuff/PySharkBot/sharkBot.py", line 12, in capturePacketsByCount
self.capture.sniff(packet_count=packet_count)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyshark/capture/capture.py", line 133, in load_packets
self.apply_on_packets(keep_packet, timeout=timeout)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyshark/capture/capture.py", line 248, in apply_on_packets
return self.eventloop.run_until_complete(coro)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py", line 455, in run_until_complete
self.run_forever()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py", line 412, in run_forever
'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/bot.py", line 859, in invoke
await ctx.command.invoke(ctx)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 725, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/discord/ext/commands/core.py", line 88, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: RuntimeError: Cannot run the event loop while another loop is running
Спасибо за любую помощь, которую вы можете оказать мне.