self.load_config()
в самый конец:def __init__(self, window_title=None):
...
self.load_config()
# Ваш код
if __name__ == "__main__":
app = AutoKeylogger(window_title="Notepad++") # Укажите нужное название окна.
app.root.mainloop()
class Villains(Heroes):
def __init__(self):
super().__init__()
parsed_data = json.loads(json_data)
ip_address = parsed_data["data"]["ipAddress"]
ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")
import json
json_data = '''
{
"data": {
"ipAddress": "192.168.1.1",
"abuseConfidenceScore": 85
}
}
'''
parsed_data = json.loads(json_data)
try:
ip_address = parsed_data.get("data", {}).get("ipAddress", "N/A")
score = parsed_data.get("data", {}).get("abuseConfidenceScore", 0)
print(f"IP: {ip_address}, Score: {score}")
except Exception as e:
print(f"Ошибка: {e}")
import requests
token = '...'
headers = {
"Authorization": f"Bearer {token}",
'Content-Type': 'application/x-www-form-urlencoded'
}
# Обязательные параметры (заполните своими значениями):
name = "lol" # Обязательное поле
platform = "windows" # Обязательное поле (например: "windows", "mac", "linux")
browser_type = "anty" # Обязательное поле (например: "chrome", "firefox", "anty")
proxy_type = "http"
proxy_host = "None" # Тут тоже что-то своё надо, видимо, вставлять.
useragent_mode = "manual"
useragent_value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
# Остальные параметры (можно оставить пустыми или заполнить по необходимости):
tags = []
tabs = ""
main_website = ""
webrtc_mode = ""
webrtc_ip_address = ""
canvas_mode = ""
webgl_mode = ""
webgl_info_mode = ""
webgl_info_vendor = ""
webgl_info_renderer = ""
# Заменить webgl2Maximum на ваше. Это всего лишь пример:
webgl_info_webgl2_maximum = r'{\"MAX_SAMPLES\": 8, \"MAX_DRAW_BUFFERS\": 8, \"MAX_TEXTURE_SIZE\": 16384, \"MAX_ELEMENT_INDEX\": 4294967294, \"MAX_VIEWPORT_DIMS\": [16384, 16384], \"MAX_VERTEX_ATTRIBS\": 16, \"MAX_3D_TEXTURE_SIZE\": 2048, \"MAX_VARYING_VECTORS\": 30, \"MAX_ELEMENTS_INDICES\": 2147483647, \"MAX_TEXTURE_LOD_BIAS\": 15, \"MAX_COLOR_ATTACHMENTS\": 8, \"MAX_ELEMENTS_VERTICES\": 2147483647, \"MAX_RENDERBUFFER_SIZE\": 16384, \"MAX_UNIFORM_BLOCK_SIZE\": 65536, \"MAX_VARYING_COMPONENTS\": 120, \"MAX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_ARRAY_TEXTURE_LAYERS\": 2048, \"MAX_PROGRAM_TEXEL_OFFSET\": 7, \"MIN_PROGRAM_TEXEL_OFFSET\": -8, \"MAX_CUBE_MAP_TEXTURE_SIZE\": 16384, \"MAX_VERTEX_UNIFORM_BLOCKS\": 13, \"MAX_VERTEX_UNIFORM_VECTORS\": 4096, \"MAX_COMBINED_UNIFORM_BLOCKS\": 60, \"MAX_FRAGMENT_UNIFORM_BLOCKS\": 13, \"MAX_UNIFORM_BUFFER_BINDINGS\": 72, \"MAX_FRAGMENT_UNIFORM_VECTORS\": 4096, \"MAX_VERTEX_OUTPUT_COMPONENTS\": 124, \"MAX_FRAGMENT_INPUT_COMPONENTS\": 124, \"MAX_VERTEX_UNIFORM_COMPONENTS\": 16384, \"MAX_VERTEX_TEXTURE_IMAGE_UNITS\": 32, \"MAX_FRAGMENT_UNIFORM_COMPONENTS\": 16384, \"UNIFORM_BUFFER_OFFSET_ALIGNMENT\": 256, \"MAX_COMBINED_TEXTURE_IMAGE_UNITS\": 64, \"MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\": 4, \"MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS\": 229376, \"MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\": 4, \"MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\": 128}'
notes_icon = ""
notes_color = ""
notes_style = ""
notes_content = ""
timezone_mode = ""
timezone_value = ""
locale_mode = ""
locale_value = ""
status_id = ""
geolocation_mode = ""
geolocation_latitude = ""
geolocation_longitude = ""
cpu_mode = ""
cpu_value = ""
memory_mode = ""
memory_value = ""
do_not_track = ""
proxy_id = ""
proxy_port = ""
proxy_login = ""
proxy_password = ""
proxy_name = ""
proxy_change_ip_url = ""
# F-строка
payload = f'name={name}&tags%5B%5D={tags}&tabs={tabs}&platform={platform}&mainWebsite={main_website}&useragent%5Bmode%5D={useragent_mode}&useragent%5Bvalue%5D={useragent_value}&webrtc%5Bmode%5D={webrtc_mode}&webrtc%5BipAddress%5D={webrtc_ip_address}&canvas%5Bmode%5D={canvas_mode}&webgl%5Bmode%5D={webgl_mode}&webglInfo%5Bmode%5D={webgl_info_mode}&webglInfo%5Bvendor%5D={webgl_info_vendor}&webglInfo%5Brenderer%5D={webgl_info_renderer}&webglInfo%5Bwebgl2Maximum%5D={webgl_info_webgl2_maximum}&webrtc%3A%20%7Bmode%3A%20%22altered%22%2C%20ipAddress%3A%20null%7D¬es%5Bicon%5D={notes_icon}¬es%5Bcolor%5D={notes_color}¬es%5Bstyle%5D={notes_style}¬es%5Bcontent%5D={notes_content}&timezone%5Bmode%5D={timezone_mode}&timezone%5Bvalue%5D={timezone_value}&locale%5Bmode%5D={locale_mode}&locale%5Bvalue%5D={locale_value}&statusId={status_id}&geolocation%5Bmode%5D={geolocation_mode}&geolocation%5Blatitude%5D={geolocation_latitude}&geolocation%5Blongitude%5D={geolocation_longitude}&cpu%5Bmode%5D={cpu_mode}&cpu%5Bvalue%5D={cpu_value}&memory%5Bmode%5D={memory_mode}&memory%5Bvalue%5D={memory_value}&doNotTrack={do_not_track}&browserType={browser_type}&proxy%5Bid%5D={proxy_id}&proxy%5Btype%5D={proxy_type}&proxy%5Bhost%5D={proxy_host}&proxy%5Bport%5D={proxy_port}&proxy%5Blogin%5D={proxy_login}&proxy%5Bpassword%5D={proxy_password}&proxy%5Bname%5D={proxy_name}&proxy%5BchangeIpUrl%5D={proxy_change_ip_url}'
url = "https://dolphin-anty-api.com/browser_profiles"
response = requests.request("POST", url, headers=headers, data=payload)
print(response.json())
Если же сложность не O(1), то почему? Ведь перемещать ничего не надо.Удаление среза реализовано как проход по удаляемым элементам с вызовом Py_DECREF на каждый.
import time
import matplotlib.pyplot as plt
def test_del_slice_complexity():
sizes = [10 ** 3, 10 ** 4, 10 ** 5, 10 ** 6]
times = []
for n in sizes:
# Создаем список
my_list = [1] * n
# Замеряем время удаления
start_time = time.perf_counter()
del my_list[n // 2:] # Удаляем 50% элементов
end_time = time.perf_counter()
elapsed = end_time - start_time
times.append(elapsed)
print(f"n = {n:>7}: {elapsed:.6f} сек")
# Визуализация результатов
plt.figure(figsize=(10, 5))
plt.plot(sizes, times, 'o-', label='Измеренное время')
plt.plot(sizes, [times[0] * n / sizes[0] for n in sizes], '--', label='Ожидаемое линейное время')
plt.xscale('log')
plt.yscale('log')
plt.xlabel('Размер списка (n)')
plt.ylabel('Время выполнения (сек)')
plt.title('Сложность операции del my_list[n//2:]')
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
test_del_slice_complexity()
logging
с ограничением размера лога параметром maxBytes
, чтобы не изобретать велосипед. я включаю символ "\n" в функции get_nmea_datetime
data=''
и оно может не обнуляться.with
, добавьте логирование и обработку исключений (для себя прежде всего), аннотации и комментарии к коду (для других), тем более, если он будет опубликован. import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)
async def load_extensions():
await bot.load_extension("ticket") # Загружаем Cog без .py
@bot.event
async def on_ready():
print(f"Бот {bot.user} готов!")
await load_extensions()
bot.run("***")
from discord.ext import commands
class TicketsCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.command(name="systicket")
async def systicket(self, ctx):
"""Обработка команды !systicket"""
# логика команды
await ctx.send("Система тикетов работает!") # Пример ответа
async def setup(bot):
await bot.add_cog(TicketsCog(bot)) # Важно: await и новое API discord.py 2.0+
from googleapiclient.discovery import build
from google.oauth2 import service_account
# Укажите путь к скачанному JSON-файлу сервисного аккаунта
SERVICE_ACCOUNT_FILE = 'ваш_сервис_аккаунт_файл.json'
# Настройка доступа
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=['https://www.googleapis.com/auth/spreadsheets'])
service = build('sheets', 'v4', credentials=credentials)
def update_note(spreadsheet_id, sheet_name, cell, note_text):
# Конвертация имени ячейки в индексы:
col = ord(cell[0].upper()) - ord('A')
row = int(cell[1:]) - 1
# Получаем ИД листа:
spreadsheet = service.spreadsheets().get(
spreadsheetId=spreadsheet_id,
fields="sheets(properties(sheetId,title))"
).execute()
sheetId = [sheet['properties']['sheetId'] for sheet in spreadsheet['sheets'] if
sheet['properties']['title'] == sheet_name][0]
print(sheetId)
service.spreadsheets().batchUpdate(
spreadsheetId=spreadsheet_id,
body={
"requests": [{
"updateCells": {
"range": {
"sheetId": sheetId,
"startRowIndex": row,
#"endRowIndex": row + 1,
"startColumnIndex": col,
#"endColumnIndex": col + 1
},
"rows": [{"values": [{"note": note_text}]}],
"fields": "note"
}
}]
}
).execute()
# Использование:
spreadsheetId = 'ваш ид таблицы'
update_note(spreadsheetId, "Лист3", "B3", "Тестовое примечание.")
def read_note(spreadsheet_id, sheet_name, cell) -> str or None:
response = service.spreadsheets().get(
spreadsheetId=spreadsheet_id,
ranges=[f"{sheet_name}!{cell}"],
fields='sheets(data.rowData.values.note)'
).execute()
note = (response
.get('sheets', [{}])[0]
.get('data', [{}])[0]
.get('rowData', [{}])[0]
.get('values', [{}])[0]
.get('note'))
return note
# Использование:
spreadsheetId = 'ваш ид таблицы'
read_note(spreadsheetId, 'Лист3', 'B3')
def get_db_path():
if getattr(sys, 'frozen', False):
# Если запущен из .exe, использовать путь рядом с исполняемым файлом
return os.path.join(os.path.dirname(sys.executable), 'database.db')
else:
# При обычном запуске — рядом с .py файлом
return os.path.join(os.path.dirname(__file__), 'database.db')
pyinstaller --onefile --windowed app.py
pyinstaller --onefile --add-data "database.db;." --windowed app.py
things = ['Thing one','Thing two','Thing three']
nl = '\n'
print(f"I have a list of things:\n{nl.join(things)}")
perf_counter()
из модуля time
.