pip3 list | grep -i telegram
pip3 install --user --force-reinstall python-telegram-bot
Потому что не нужно смешивать мгнопоточный код с асинхронным. Используйте либо одну библиотеку, либо другую.
from asyncio import set_event_loop, new_event_loop
set_event_loop(new_event_loop())
from mysql.connector import MySQLConnection, Error
from sys import exit
conn = {}
def connect(host, database, user, password):
global conn
try:
conn = MySQLConnection(
host=host,
database = database,
user = user,
password = password
)
if conn.is_connected(): print('Connected to DB.')
except Error as e:
print('Failed to connect to DB. Exception caught:')
print(e)
exit()
def request(req, data=None):
global conn
cursor = conn.cursor(buffered=True)
try:
cursor.execute(req, data)
conn.commit()
data = cursor.fetchall()
cursor.close()
return data
except Error as err:
print(err)
return []
for b_ in b:
string = ""
for i in b_:
string = string + i + " "
print(string)
Петров Петр Петрович Стационар Хирург +7(888)888-88-88
Иванов Иван Иванович Поликлиника +7(777)777-77-77 доб.0000 Ivan.Ivanov@mail.ru
from haversine import haversine
from re import match
from pprint import pprint
def num_decimal_places(number):
return len(
(str(number) if '.' in str(number) \
else str(number) + '.').rstrip('0').split('.')[-1]
)
def go_to_metr(x, y, name_coordinate):
required_dist = 1
l = 0
r = min(180, 90-y)
while r-l > 1e-10:
m=(r+l)/2
dist = (
(haversine((x,y),(x,y+m))/1000)
) if name_coordinate == "y" else (
(haversine((x,y),(x+m,y))/1000)
)
if dist > required_dist:
r = m
else:
l = m
step = float(int(l))
numb_digit = 1
for _ in range(
num_decimal_places(y if name_coordinate == "y" else x)
):
numb_digit *= 10
step = step/numb_digit
finally_coordinate = x+step if name_coordinate == "x" else y+step
return finally_coordinate
def go_to_radius(init_x, init_y, radius):
array_coord_x = []
array_coord_y = []
for coordinate in ["x", "y"]:
local_coord = init_x if coordinate == "x" else init_y
init_coord = init_y if coordinate == "x" else init_x
array_coord = array_coord_x if coordinate == "x" else array_coord_y
for _ in range(radius):
local_coord = go_to_metr(
local_coord if coordinate == "x" else init_coord,
init_coord if coordinate == "x" else local_coord, coordinate)
array_coord.append(
(
(local_coord, init_coord)
) if coordinate == "x" else (
(init_coord, local_coord)
)
)
array_coord_all = []
for numb, _ in enumerate(range(len(array_coord_x))):
array_coord_all.append((array_coord_x[numb][0], array_coord_y[numb][1]))
return {
"coords_x": array_coord_x, "coords_y": array_coord_y,
"coords_all": array_coord_all
}
pprint(go_to_radius(55.880707, 37.55513, 5))
{'coords_all': [(55.880715, 37.55529),
(55.880723, 37.55545),
(55.880731000000004, 37.55561),
(55.88073100000001, 37.55577),
(55.88073100000009, 37.555930000000004)],
'coords_x': [(55.880715, 37.55513),
(55.880723, 37.55513),
(55.880731000000004, 37.55513),
(55.88073100000001, 37.55513),
(55.88073100000009, 37.55513)],
'coords_y': [(55.880707, 37.55529),
(55.880707, 37.55545),
(55.880707, 37.55561),
(55.880707, 37.55577),
(55.880707, 37.555930000000004)]}
asyncio.set_event_loop(asyncio.new_event_loop())
user_id = 123456 # айди пользователя кому будем отправлять
chat_id = -123456 # айди чата куда будем писать
# отправляем сообщение в чат
message_markup = InlineKeyboardMarkup()
message_markup.row_width = 1
message_markup.add(
InlineKeyboardButton(
"Принять",
callback_data="success_" + str(user_id)
),
InlineKeyboardButton(
"Отклонить",
callback_data="unsuccess_" + str(user_id)
))
bot.send_message(
chat_id=chat_id,
text="Новая заявка",
reply_markup=message_markup,
parse_mode="Html"
)
# принимаем кал-бек информацию от кнопки
def clb_handler(x):
bot.answer_callback_query(x.id)
if x.message.chat.id == x.from_user.id:
cb_data = x.data.split("_")
if len(cb_data) == 2:
user_id = cb_data[1]
msg = "спасибо, ваша заявка обработана" if cb_data[0] == "success" else "спасибо, но, ваша заявка была отклонена."
bot.send_message(
chat_id=user_id,
text=msg,
parse_mode="Html"
)
# запускаем бота
def start_polling():
while True:
try:
# ставим что прослушивать ответы на кнопки будет функция clb_handler()
@bot.callback_query_handler(func=lambda call: True)
def callback_query(x):
clb_handler(x)
bot.polling(
none_stop=True,
interval=0,
timeout=60
)
except Exception as e:
print(e)
time.sleep(5)
tb = threading.Thread(
target = start_polling,
args = ()
)
tb.start()