from typing import NamedTuple
class Result(NamedTuple):
text: str # текст запроса
success: bool # успешен ли запрос
status: str # статус
async def check_text(text: str) -> Result:
url = f'https://сайт.com/?query={text}'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status != 200:
return Result(text=text, success=False, status='Не удалось определить результат')
html = await response.text()
soup = BeautifulSoup(html, 'html.parser')
status_element = soup.find('div', class_='table-block')
if not status_element:
return Result(text=text, success=False, status='Не удалось определить результат')
status_text = status_element.get_text().strip()
# тебе нужно будет решить, когда запрос был успешен (True), а когда нет (False)
if "ok" in status_text:
return Result(text=text, success=True, status='Можно')
elif "no" in status_text:
return Result(text=text, success=False, status='Данный вариант недоступен')
elif "no1" in status_text:
return Result(text=text, success=True, status='Можно под заказ')
else:
return Result(text=text, success=False, status='Неизвестно')
result = await check_text(text)
if result.success:
... # реагируем на успешный запрос
logger.info('%s: %s', result.text, result.status)
else:
... # реагируем на неудачный запрос
logger.info('%s: %s', result.text, result.status)
Cookies in Firefox are stored in an SQLite format database found in the file cookies.sqlite in the currently-active user profile directory (exact path is system-dependent).
%APPDATA%\Mozilla\Firefox\Profiles
, в ней каждый подкаталог - профиль браузера, часто один, но может быть несколько. Внутри подкаталога лежит файл cookies.sqlite
.os.path.expandvars()
(и модуля os.path
в целом), файл открыть стандартным модулем sqlite3
, а дальше смотри что внутри таблицы moz_cookies
.open_text = 'текст' # открытый текст
# letters - именно строка, одна позиция - один символ
letters = ''.join(['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф',
'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'])
key = 5 # ключ к шифру - величина сдвига. Может быть >0 или <0
# генерируем таблицы подстановки
encrypt_table = str.maketrans(letters, letters[key:]+letters[:key]) # для шифрования
decrypt_table = str.maketrans(letters, letters[-key:]+letters[:-key]) # для дешифрования
cypher_text = open_text.translate(encrypt_table)
restored_text = cypher_text.translate(decrypt_table)
print(open_text)
print(cypher_text)
print(restored_text)
import typing as tp
Func = tp.Callable[[], None] # функция без апарметров, возвращает None
class FuncMap:
def __init__(self):
self.map: tp.Dict[str, Func] = dict()
def register(self, key: str) -> tp.Callable[[Func], Func]:
def decorate(f: Func) -> Func:
self.map[key] = f
return f
return decorate
def get(self, key: str) -> Func:
return self.map[key]
def run(self, key: str):
return self.map[key]()
# а вот так этот класс используется
fmap = FuncMap()
@fmap.register('11')
def test():
print('This is test()')
fmap.run('11')
elif user_data[5] == '<:939223290105454632:1164940159050059786>':
...
elif user_data[5] == '<:939195860317773856:1164153649296048148>':
...
elif user_data[5] == '<:939223290105454632:1164940159050059786>': # Добавлено условие для железной кирки
...
x = 1
if x == 0:
print('Ноль!')
elif x == 1:
print('Один!')
elif x == 2:
print('Два!')
elif x == 1:
print('Раз!')
x = 1
if x == 0:
print('Ноль!')
elif x == 1:
print('Раз!')
elif x == 2:
print('Два!')
schedule(event_handler, path, recursive=False)
Schedules watching a path and calls appropriate methods specified in the given event handler in response to file system events.
Parameters:
event_handler (watchdog.events.FileSystemEventHandler or a subclass) – An event handler instance that has appropriate event handling methods which will be called by the observer in response to file system events.
path (str) – Directory path that will be monitored.
recursive (bool) – True if events will be emitted for sub-directories traversed recursively; False otherwise.
Returns:
An ObservedWatch object instance representing a watch.
for line in data:
делай цикл вручную, например так:while True:
line = data.readline()
if not line:
break
... # тут выполняем дальнейшие операции
Программа доходит до строки print(mydoubler(11)). Чтобы напечать результат выполнения функции mydoubler, программа вызывает эту функцию с аргументом 11, для этого программа идёт к строке mydoubler = myfunc(2).
def
, определяющий функцию myfunc
. После этого в текущей области видимости программы появляется переменная myfunc
, хранящая ссылку на объект-функцию.mydoubler = myfunc(2)
. Происходит вызов функции myfunc
, при этом ей передаётся объект-число 2 как параметр. Внутри локальной области видимости myfunc
теперь есть имя a
, ссылающееся на объект-число 2. В ходе выполнения создаётся лямбда-функция, которая ссылается на этот параметр. myfunc
, myfunc
завершает выполнение. Поскольку лямбда-функция продолжает существовать (мы её вернули), а она ссылается на объект-число 2, то этот объект тоже продолжает существовать.mydoubler
в текущей области видимости. Это позволяет её продолжать существовать (её не собирает сборщик мусора), ну и позволяет её вызвать по этому имени.mytripler = myfunc(3)
, это бы создало новую, отдельную лямбда-функцию, совершенно независимую от mydoubler
, и ссылающуюся на объект-число 3. (\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})
. Пример:import re
r = re.compile(r'(\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})')
m = r.match("1-2345/678/0099")
print(m.groups()) # выведет ('1-2345/678/', '99')
(\d{9})
import re
r = re.compile(r'(\d{9})')
m = r.match("123456789")
print(m.groups()) # выведет ('123456789', )
search_results = googlesearch.search(query, num_results=3)
внутри ask(), и обработать полученные результаты - невелико повторение. Я бы сделал именно так.# Messageable - это что-то, чему можно послать текстовое сообщение. Это может быть канал, пользователь, контекст команды...
async def search_and_reply(query: str, ctx: discord.abc.Messageable) -> None:
try:
search_results = googlesearch.search(query, num_results=3)
if search_results:
await ctx.send("Результаты поиска в Google:")
for result in search_results:
await ctx.send(result)
else:
await ctx.send("Ничего не найдено.")
except Exception as e:
await ctx.send(f"Произошла ошибка при выполнении поиска: {str(e)}")
await search_and_reply(query, ctx)
, но будет брать на себя регистрацию как обработчика команды, проверку ролей и кулдаунов, и прочую мишуру, которой не место внутри search_and_reply(). Тогда ask() может просто сделать аналогичный вызов await search_and_reply(query, channel)
в нужный момент, не беспокоясь о специфике дискорд-обработчика, так как search_and_reply() таковым не является.