import xml.etree.ElementTree as ET
import zipfile
from google.oauth2.service_account import Credentials
from googleapiclient.discovery import build
import pandas as pd
# Настройки:
CREDENTIALS_FILE = 'GoogleSheetsCredentional.json'
FILE_ID = '18c2nnuVKZ-ndfklC6x9Sv9e84PFKc' # из URL таблицы
SCHEMA = './/{http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing}'
# Аутентификация и скачивание:
creds = Credentials.from_service_account_file(CREDENTIALS_FILE, scopes=['https://www.googleapis.com/auth/drive'])
drive_service = build('drive', 'v3', credentials=creds)
# Скачиваем как Excel:
content = drive_service.files().export_media(
mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', fileId=FILE_ID).execute()
# Сохраняем временный файл:
with open('temp.xlsx', 'wb') as f:
f.write(content)
# Извлекаем данные и картинки:
df = pd.read_excel('temp.xlsx')
with zipfile.ZipFile('temp.xlsx', 'r') as z:
# Парсим drawing.xml - потому что порядок картинок может быть не тот что ожидается...
drawing_data = z.read('xl/drawings/drawing1.xml')
root = ET.fromstring(drawing_data)
file_names = []
# Извлекаем картинки:
for anchor in root.findall(f'{SCHEMA}oneCellAnchor'):
image_name = anchor.find(f'{SCHEMA}cNvPr').get('name')
file_names.append(image_name)
z.extract(f'xl/media/{image_name}', 'images')
df['image'] = pd.Series(file_names)
print(df)
С помощью Fleet удобно работать над кодом вместе с коллегами в реальном времени. IDE не только поддерживает совместное редактирование кода, но и позволяет использовать общий терминал, заниматься отладкой и исследованием кода, выполнять код-ревью и многое другое — все это без дополнительной настройки.
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email_mail_ru():
smtp_server = "smtp.mail.ru"
smtp_port = 587 # или 465 для SSL.
username = "*****@mail.ru" # Анонимный ящик.
password = "****************" # Пароль от приложения.
# Создаем сообщение:
msg = MIMEMultipart()
msg['From'] = username
msg['To'] = "************@mail.ru"
msg['Subject'] = "Тестовое письмо с Mail.ru"
# Текст письма:
body = """тест"""
msg.attach(MIMEText(body, 'plain', 'utf-8'))
try:
# Подключаемся к серверу:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(username, password)
# Отправляем письмо:
server.sendmail(username, "*********@yahoo.com", msg.as_string())
print("Письмо успешно отправлено через Mail.ru!")
except Exception as e:
print(f"Ошибка при отправке: {e}")
finally:
server.quit()
send_email_mail_ru() pip install pyOpenSSL cryptography idna certifi urllib3[secure] requests[security]import urllib3.contrib.pyopenssl # активирует pyOpenSSL для urllib3
urllib3.contrib.pyopenssl.inject_into_urllib3()
import requests
url = "https://www.wildberries.ru/webapi/product/339182812/data?subject=104&kind=1&brand=311487279&lang=ru"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"Accept": "*/*",
"Referer": "https://www.wildberries.ru/catalog/339182812/detail.aspx",
"X-Requested-With": "XMLHttpRequest",
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.text)>>>200
>>>{"resultState":0,"value":{"data":{"brandAndSubjectUrl":"/brands/311...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.pypyinstaller --onefile --add-data "database.db;." --windowed app.py