welcomecenterbot/bot/api.py
2024-01-06 14:25:35 +03:00

279 lines
10 KiB
Python

import aiohttp
import json
from bot.config import BOT_TOKEN, WEBHOOK
import logging
# Create a logger instance
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
apiBase = f"https://api.telegram.org/bot{BOT_TOKEN}/"
async def register_webhook():
async with aiohttp.ClientSession() as session:
async with session.get(apiBase + f"setWebhook?url={WEBHOOK}") as response:
data = await response.json()
logger.info("Webhook registration response: %s", data)
return data
# https://core.telegram.org/bots/api#sendmessage
async def send_message(cid: str, body, reply_to=None, reply_markup=None):
if not body:
return
url = apiBase + f"sendMessage"
params = {"chat_id": cid, "text": body, "parse_mode": "HTML"}
if reply_to:
params["reply_to_message_id"] = reply_to
if reply_markup:
params["reply_markup"] = json.dumps(reply_markup)
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Message sent to %s: %s", cid, data)
return data
# https://core.telegram.org/bots/api#sendchataction
async def send_chataction(cid: str, action: str):
url = apiBase + f"sendChatAction"
params = {"chat_id": cid, "action": action}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Chat action sent to %s: %s", cid, data)
return data
# https://core.telegram.org/bots/api#forwardmessage
async def forward_message(cid, mid, to_chat_id):
url = apiBase + f"forwardMessage"
params = {"chat_id": to_chat_id, "from_chat_id": cid, "message_id": mid}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Message forwarded from %s to %s: %s", cid, to_chat_id, data)
return data
# https://core.telegram.org/bots/api#deletemessage
async def delete_message(cid: str, mid: str):
url = apiBase + f"deleteMessage"
params = {"chat_id": cid, "message_id": mid}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
return data
# https://core.telegram.org/bots/api#sendphoto
async def send_photo(
cid: str, file_id: str, caption="", reply_to=None, reply_markup=None
):
url = apiBase + f"sendPhoto"
params = {
"chat_id": cid,
"photo": file_id,
"caption": caption,
"parse_mode": "HTML",
}
if reply_to:
params["reply_to_message_id"] = reply_to
if reply_markup:
params["reply_markup"] = json.dumps(reply_markup)
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Photo sent to %s: %s", cid, data)
return data
# https://core.telegram.org/bots/api#banchatmember
async def ban_member(chat_id, user_id, until_date=None):
url = apiBase + f"banChatMember"
params = {"chat_id": chat_id, "user_id": user_id}
if until_date:
params["until_date"] = until_date
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member banned from %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#unbanchatmember
async def unban_member(chat_id, user_id):
url = apiBase + f"unbanChatMember"
params = {"chat_id": chat_id, "user_id": user_id, "only_if_banned": 1}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member unbanned from %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#addchatmember
async def add_member(chat_id, user_id):
url = apiBase + f"addChatMember"
params = {"chat_id": chat_id, "user_id": user_id}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member added to %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#restrictchatmember
async def mute_member(chat_id, member_id):
url = apiBase + f"restrictChatMember"
params = {
"chat_id": chat_id,
"user_id": member_id,
"permissions": json.dumps({"can_send_messages": False}),
"use_independent_chat_permissions": 1,
}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member muted in %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#restrictchatmember
async def unmute_member(chat_id, member_id, chat_permissions=None):
if not chat_permissions:
chat_permissions = json.dumps(
{
"can_send_messages": True,
"can_send_photos": True,
"can_send_other_messages": True,
"can_send_polls": True,
"can_add_web_page_previews": True,
"can_send_audios": True,
"can_invite_users": True,
"can_send_voice_notes": True,
"can_send_video_notes": True,
"can_send_videos": True,
"can_send_documents": True,
}
)
url = apiBase + f"restrictChatMember"
params = {
"chat_id": chat_id,
"user_id": member_id,
"permissions": chat_permissions,
"use_independent_chat_permissions": 1,
}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member unmuted in %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#approvechatjoinrequest
async def approve_chat_join_request(chat_id, user_id):
url = apiBase + f"approveChatJoinRequest"
params = {"chat_id": chat_id, "user_id": user_id}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Chat join request approved in %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#senddocument
async def send_document(chat_id, data="", filename="chart.svg"):
url = apiBase + "sendDocument"
params = {"chat_id": chat_id}
filedata = aiohttp.FormData()
filedata.add_field("document", data, filename=filename)
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params, data=filedata) as response:
if response.status != 200:
error_text = await response.text()
print(f"Error sending document: {response.status} - {error_text}")
return None
try:
return await response.json()
except ValueError as e:
print(f"Error decoding JSON: {e}")
return None
# https://core.telegram.org/bots/api#getchatadministrators
async def get_chat_administrators(chat_id):
url = apiBase + f"getChatAdministrators"
params = {"chat_id": chat_id}
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
data = await response.json()
logger.info("Chat administrators retrieved for %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#getchatmember
async def get_member(chat_id, member_id):
url = apiBase + f"getChatMember"
params = {"chat_id": chat_id, "user_id": member_id}
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
data = await response.json()
logger.info("Chat member retrieved for %s: %s", chat_id, data)
return data
# https://core.telegram.org/bots/api#getuserprofilephotos
async def get_userphotos(user_id):
url = apiBase + f"getUserProfilePhotos"
params = {"user_id": user_id}
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
data = await response.json()
logger.info("User profile photos retrieved for %s: %s", user_id, data)
return data
# https://core.telegram.org/bots/api#editmessagereplymarkup
async def edit_replymarkup(cid, mid, reply_markup):
url = apiBase + f"editMessageReplyMarkup"
params = {
"chat_id": cid,
"message_id": mid,
"reply_markup": json.dumps(reply_markup),
}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Reply markup edited for message %s in %s: %s", mid, cid, data)
return data
# https://core.telegram.org/bots/api#getchat
async def get_chat(cid):
url = apiBase + f"getChat"
params = {"chat_id": cid}
async with aiohttp.ClientSession() as session:
async with session.get(url, params=params) as response:
data = await response.json()
logger.info("Chat retrieved for %s: %s", cid, data)
return data
# https://core.telegram.org/bots/api#banchatmember
async def kick_member(chat_id, member_id):
url = apiBase + f"banChatMember"
params = {"chat_id": chat_id, "user_id": member_id}
async with aiohttp.ClientSession() as session:
async with session.post(url, params=params) as response:
data = await response.json()
logger.info("Member kicked from %s: %s", chat_id, data)
return data