send_message(...)
reply_markup (telebot.types.InlineKeyboardMarkup or telebot.types.ReplyKeyboardMarkup or telebot.types.ReplyKeyboardRemove or telebot.types.ForceReply) – Additional interface options. A JSON-serialized object for an inline keyboard, custom reply keyboard, instructions to remove reply keyboard or to force a reply from the user.
[клиент] --> [решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[клиент] --> [решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[клиент --> решающий прокси] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
[Генератор и хостинг для PAC-файла]
^
|
[клиентский браузер] --> [реальный прокси] --> [целевой сайт]
\--> [другие сайты]
@bot.callback_query_handler(func=lambda call: True)
dict_data_user = await state.get_data()
list_data_user = [] # сначала список пуст
for k, v in dict_data_user.items(): # начинаем цикл, первая итерация
list_data_user.append(v) # добавляем в список элемент. Длина списка равна 1.
user_id = message.from_user.id
id_product = list_data_user[0] # читаем из списка элемент с индексом 0. ОК, он есть, мы его только что добавили
full_name = list_data_user[1] # откуда бы взяться элементу с индексом 1 в списке из одного элемента?!
index_adress = list_data_user[2]
number_phon = list_data_user[3]
user_db.add_user(id_product=id_product, user_id=user_id, full_name=full_name,
index_adress=index_adress, number_phon=number_phon)
await state.clear()
# словарь, где ключ - строка с названием пунка отправления, а значение - ещё словарь,
# где ключ - строка с названием пункта назначения, а значение - список,
# где элементы - пары строк ("время отправления", "время прибытия")
# Тогда с таким словарём можно будет работать так:
bus_timetable: dict[str, dict[str, list[tuple[str, str]]]] = {
# ты словарь заполняешь по результатам парсинга, ну и то хорошо
# я для примера запишу прямо так
'Владимир' : {
'Муром': [
('8:00', '11:00'),
('9:00', '12:00'),
('10:00', '13:00'),
],
},
}
point_from = 'Владимир'
point_to = 'Муром'
# для примера вывожу в консоль, для бота перепишешь сам
print(f'Автобус из {point_from} в {point_to}')
for departure, arrival in bus_timetable[point_from][point_to]:
print(f'Отходит в {departure}, прибывает в {arrival}')
kbd_from = types.ReplyKeyboardMarkup(resize_keyboard=True)
buttons = [types.KeyboardButton(point_from) for point_from in bus_timetable] # список кнопок
kbd_from.add(*buttons) # если надо добавить все кнопки сразу
@bot.message_handler(content_types=['text'])
def first_message_handler(message):
if message.text in bus_timetable: # назвали известный город? Это пункт отправления
kbd = ... # тут определяешь клавиатуру, опираясь на города в bus_timetable[message.text]
response = bot.reply_to(message, "А теперь назовите пункт назначения", reply_markup=kbd)
# обрати внимание: все параметры после указания функции second_message_handler будут
# переданы в эту функцию при её вызове. А вызвана она будет, когда пользователь ответит.
bot.register_next_step_handler(response, second_message_handler, message.text)
elif ... # нам назвали не город - тут можно проверить другие команды
def second_message_handler(message, point_from):
# а эта функция будет вызвана только когда пользователь уже назвал пункт отправления
# point_from будет содержать название города, отправленное пользователем.
if message.text in bus_timetable[point_from]: # нам назвали допустимый пункт назначения
bus_rides = bus_timetable[point_from][message.text] # список рейсов
... # дальше перебираем список bus_rides и выводим его пользователю
else: # пользователь назвал что-то другое
... # говорим пользователю, что он дурак
AllowTcpForwarding yes
)? Там обновлений не было? Может, несколько конфигов конфликтуют? Например, в autorized_keys
можно прописать no-port-forwarding или restrict.RuntimeError: This Application was not initialized via `Application.initialize`!
image = cv2.imread("image.png")
image = image.astype(numpy.uint32) # смена типа нужна, иначе при сдвиге потеряются разряды
image_clone = (image[..., 0] << 16) | (image[..., 1] << 8) | image[..., 2]
image = cv2.imread("image.png")
image_clone = numpy.zeros(image.shape[:2], numpy.uint32)
# краткие формы операций не создают новый массив, а изменяют существующий по месту
image_clone |= image[..., 0]
image_clone <<= 8
image_clone |= image[..., 1]
image_clone <<= 8
image_clone |= image[..., 2]
discord.gateway.DiscordWebSoсket
, чтобы при отправке пакета identify
устройство/клиент идентифицировалось как 'Discord Android'. from discord.gateway import DiscordWebSocket
class MyDiscordWebSocket(DiscordWebSocket):
async def send_as_json(self, data):
if data.get('op') == self.IDENTIFY:
if data.get('d', {}).get('properties', {}).get('$browser') is not None:
data['d']['properties']['$browser'] = 'Discord Android'
data['d']['properties']['$device'] = 'Discord Android'
return await super().send_as_json(data)
DiscordWebSocket.from_client = MyDiscordWebSocket.from_client
bot.infinity_polling()