![Logo](https://i.imgur.com/CMnA5Sh.jpeg "Logo")
## ``zlapi`` - Zalo API (Unofficial) for Python
[![Project version](https://img.shields.io/badge/pypi-v1.0.2-blue.svg "Project version")](https://pypi.org/project/zlapi/1.0.2)
[![Supported python versions: >= 3. and pypy](https://badgen.net/badge/python/>=3.,pypy?list=| "Supported python versions: >= 3. and pypy")](zlapi)
[![License: MIT License](https://img.shields.io/badge/license-MIT-lightgreen.svg "License: MIT License")](https://github.com/Its-VrxxDev/zlapi/blob/master/LICENSE)
[![Documentation](https://img.shields.io/badge/docs-stop_updating-red.svg "Documentation")](https://vrxx1337.vercel.app/zlapi/docs/lastest)
### Language
- Sẽ hỗ trợ tài liệu Tiếng Việt sớm nhất có thể. Sài tạm google dịch nhé :)
### What is ``zlapi``?
A powerful and efficient library to interact with Zalo Website.
This is *not* an official API, Zalo has that [over here](https://developers.zalo.me/docs) for chat bots. This library differs by using a normal Zalo account instead (More flexible).
``zlapi`` currently support:
- Custom style for message.
- Sending many types of messages, with files, stickers, mentions, etc.
- Fetching messages, threads and users info.
- Creating groups, setting the group, creating polls, etc.
- Listening for, an reacting to messages and other events in real-time.
- And there are many other things.
- ``async``/``await`` (Updated).
Essentially, everything you need to make an amazing Zalo Bot!
### Caveats
``zlapi`` works by imitating what the browser does, and thereby tricking Zalo into thinking it's accessing the website normally.
However, there's a catch! **Using this library may not comply with Zalo's Terms Of Service**, so be! We are not responsible if your account gets banned or disabled!
### What's New?
This is an updated version for ``zlapi`` to improve features and fix bugs (v1.0.3)
**Improvements**
- Change function [replyMessage]()
**Bugfixes**
- Fixed not getting response from server when listening.
- Fixed the error of login function, not requiring account & password when using cookies.
**Deprecations**
- The old login server has been removed due to lack of funds to maintain the server.
</br>
## Installation
```bash
pip install zlapi
```
If you don't have [pip](https://pip.pypa.io/), [this guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process.
You can also install directly from source, provided you have ``pip>=19.0``:
```bash
pip install git+https://github.com/Its-VrxxDev/zlapi.git
```
</br>
## How to get IMEI and Cookies?
### Download Extension
- [Click Here](https://drive.google.com/file/d/18_-8ruYOVa89JkHdr3muGj3kGWxwt6mc/view?usp=drive_link) to download the extension support getting IMEI & Cookies more conveniently.
### Extension Usage Tutorial
1. Enable the extension downloaded above.
2. Go to [https://chat.zalo.me](https://chat.zalo.me), Sign in to your account.
3. After successfully logging in, go back to extension and get IMEI, Cookies.
> [!TIP]
If you have opened the website ``chat.zalo.me`` but the extension does not have IMEI & Cookies, please click ``Refresh Page``.
#### Windows
[![](https://previews.jumpshare.com/thumb/815bc01b796dd6f1733c957c5af19493968eb06ccf48b6a5036cf7916c0a83965899fb056fe88c29f2bcb2f9f0f5ed5832801eede43aa22e94d5c7bc545ef9448bfbfd14044e807555841b406fdf069aa3acda441ff8675390fa0ff601ff0bcd)](https://jumpshare.com/embed/8SjFyd3EQlCMx1V7N1UQ)
</br>
#### Android
> - Use ``kiwibrowser`` instead of ``chrome`` to be able to use the extension.
> - If you are redirect when accessing ``https://chat.zalo.me``. [Watch this video](https://jumpshare.com/embed/l3LLjAWSAR8KQxvh9dzz)
[![](https://previews.jumpshare.com/thumb/815bc01b796dd6f1733c957c5af194938966297dbb29c75d038ac93e0691be4c741e5e2cbb689c41b8dfebde4ded3316844e23ec82425f377c248f1a57861470e76e9fe268bdf0803c7c14a61c9dc50769f92efb3803e5ae68c46d260d3407db)](https://jumpshare.com/embed/n56jtVQ7pwZDfR5ZtPft)
</br>
## Basic Usage
### Login Account Using Cookies
* ``Normal``/``Async`` code style
```py
# > Normal
# from zlapi import ZaloAPI
# > Async
# from zlapi.Async import ZaloAPI
from zlapi import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("<phone>", "<password>", imei=imei, session_cookies=cookies)
```
</br>
* ``Simple`` code style
```py
from zlapi.simple import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("</>", "</>", imei, cookies, prefix="<your bot prefix>")
```
</br>
### Listen Message, Event, ...
* You can enable thread mode for [On Message](#on-message) function (work with ``requests`` type) with ``thread=True``.
```py
bot.listen(thread=True)
```
* You can customize the reconnect time when listening is interrupted using ``reconnect=...``.
```py
bot.listen(reconnect=5)
```
</br>
* ``Normal``/``Async`` code style
```py
# > Normal
# from zlapi import ZaloAPI
# > Async
# from zlapi.Async import ZaloAPI
from zlapi import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("<phone>", "<password>", imei=imei, session_cookies=cookies)
# client.listen(type="...")
bot.listen()
```
</br>
* ``Simple`` code style
```py
from zlapi.simple import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("</>", "</>", imei, cookies, prefix="<your bot prefix>")
bot.listen()
```
</br>
### Custom On Message Function
``onMessage`` function will be called when receiving a message from ``listen`` function. **So we can handle that message here.**
* ``Normal`` code style
```py
from zlapi import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
class CustomBot(ZaloAPI):
def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
# Handle Message Here
pass
bot = CustomBot("<phone>", "<password>", imei=imei, session_cookies=cookies)
bot.listen()
```
</br>
* ``Async`` code style
```py
from zlapi.Async import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
class CustomBot(ZaloAPI):
async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
# Handle Message Here
pass
bot = CustomBot("<phone>", "<password>", imei=imei, session_cookies=cookies)
bot.listen()
```
</br>
* ``Simple`` code style
```py
from zlapi.simple import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("</>", "</>", imei, cookies, prefix="<bot prefix>")
@bot.event
async def on_message(ctx):
# Handle Message Here
pass
bot.listen()
```
</br>
### Example Handle Message
<details>
<summary><b><i>Normal</b> code style</i></summary>
```py
from zlapi import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
class CustomBot(ZaloAPI):
def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
if not isinstance(message, str):
return
if message == ".hi":
print(f"{author_id} sent message .hi")
bot = CustomBot("<phone>", "<password>", imei=imei, session_cookies=cookies)
bot.listen()
```
> - If the message is not ``string`` do not process this message.
> - If the message is ``.hi`` will print author id of message to terminal.
</br>
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
```py
from zlapi.Async import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
class CustomBot(ZaloAPI):
async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
if not isinstance(message, str):
return
if message == ".hi":
print(f"{author_id} sent message .hi")
bot = CustomBot("<phone>", "<password>", imei=imei, session_cookies=cookies)
bot.listen()
```
> - If the message is not ``string`` do not process this message.
> - If the message is ``.hi`` will print author id of message to terminal.
</br>
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Method 1
```py
from zlapi.simple import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("</>", "</>", imei, cookies, prefix="<bot prefix>")
@bot.event
async def on_message(ctx):
if ctx.message == ".hi":
print(f"{ctx.author_id} sent message .hi")
bot.listen()
```
</br>
- Method 2
```py
from zlapi.simple import ZaloAPI
from zlapi.models import *
imei = "<imei>"
cookies = {} # Cookies Dict
bot = ZaloAPI("</>", "</>", imei, cookies, prefix=".")
@bot.register_handler(commands=["hi"])
async def handle_hi(ctx):
print(f"{ctx.author_id} sent message .hi")
bot.listen()
```
> - ``@bot.register_handler(commands=["hi"])`` is a decoration class used to register a command. When an incoming message matches the bot prefix + registered commands, the message will be processed.
</details>
</br>
<!-- fetchAccountInfo -->
### Fetch Account Information
This function will get the account information you are using in ``zlapi``.
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchAccountInfo()
```
</br>
- Inside Module Function
```py
self.fetchAccountInfo()
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchAccountInfo())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchAccountInfo()
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_account_info())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_account_info()
```
</details>
<!-- END FetchAccountInfo -->
</br>
<!-- fetchPhoneNumber -->
### Fetch Phone Number
This function will get user information using that user phone number.
> [!NOTE]
Can't get information of **hidden phone number** or **locked account**
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchPhoneNumber("<phone number>")
```
</br>
- Inside Module Function
```py
self.fetchPhoneNumber("<phone number>")
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchPhoneNumber("<phone number>"))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchPhoneNumber("<phone number>")
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_phone_number("<phone number>"))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_phone_number("<phone number>")
```
</details>
<!-- END FetchPhoneNumber -->
</br>
<!-- fetchUserInfo -->
### Fetch User Info
This function will get user information using that user ID.
> - In ``Normal``/``Async`` code style you can get user id with author_id argument
> - In ``Simple`` code style you can get user id with ctx.author_id argument
> - Or you can use user id if you already have one
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchUserInfo(<user id>)
```
</br>
- Inside Module Function
```py
self.fetchUserInfo(<user id>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchUserInfo(<user id>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchUserInfo(<user id>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_user_info(<user id>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_user_info(<user id>)
```
</details>
<!-- END FetchUserInfo -->
</br>
<!-- fetchGroupInfo -->
### Fetch Group Info
This function will get group information using that group ID.
> - In ``Normal``/``Async`` code style you can get user id with thread_id argument
> - In ``Simple`` code style you can get user id with ctx.thread_id argument
> - Or you can use group id if you already have one
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchGroupInfo(<group id>)
```
</br>
- Inside Module Function
```py
self.fetchGroupInfo(<group id>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchGroupInfo(<group id>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchGroupInfo(<group id>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_group_info(<group id>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_group_info(<user id>)
```
</details>
<!-- END FetchGroupInfo -->
</br>
<!-- fetchAllFriends -->
### Fetch All Friends
This function will get all the friends information of the account currently using the ``zlapi``.
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchAllFriends()
```
</br>
- Inside Module Function
```py
self.fetchAllFriends()
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchAllFriends())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchAllFriends()
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_all_friends())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_all_friends()
```
</details>
<!-- END FetchAllFriends -->
</br>
<!-- fetchAllGroups -->
### Fetch All Groups
This function will get all the groups id of the account currently using the ``zlapi``.
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.fetchAllGroups()
```
</br>
- Inside Module Function
```py
self.fetchAllGroups()
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetchAllGroups())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.fetchAllGroups()
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.fetch_all_groups())
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.fetch_all_groups()
```
</details>
<!-- END FetchAllGroups -->
</br>
<!-- changeAccountSetting -->
### Change Account Setting
This function will change setting of the account currently using the ``zlapi``.
> - Args:
> - name (str): The new account name
> - dob (str): Date of birth wants to change (format: year-month-day)
> - gender (int | str): Gender wants to change (0 = Male, 1 = Female)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeAccountSetting(<name>, <dob>, <gender>)
```
</br>
- Inside Module Function
```py
self.changeAccountSetting(<name>, <dob>, <gender>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeAccountSetting(<name>, <dob>, <gender>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeAccountSetting(<name>, <dob>, <gender>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_account_setting(<name>, <dob>, <gender>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_account_setting(<name>, <dob>, <gender>)
```
</details>
<!-- END changeAccountSetting -->
</br>
<!-- changeAccountAvatar -->
### Change Account Avatar
This function will upload/change avatar of the account currently using the ``zlapi``.
> - Args:
> - filePath (str): A path to the image to upload/change avatar
> - size (int): Avatar image size (default = auto)
> - width (int): Width of avatar image
> - height (int): height of avatar image
> - language (int | str): Zalo Website language ? (idk)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeAccountAvatar(<filePath>)
```
</br>
- Inside Module Function
```py
self.changeAccountAvatar(<filePath>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeAccountAvatar(<filePath>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeAccountAvatar(<filePath>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_account_avatar(<filePath>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_account_avatar(<filePath>)
```
</details>
<!-- END changeAccountAvatar -->
</br>
<!-- sendFriendRequest -->
### Send Friend Request
This function will send friend request to a user by ID.
> - Args:
> - userId (int | str): User ID to send friend request
> - msg (str): Friend request message
> - language (str): Response language or Zalo interface language
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendFriendRequest(<userId>, <msg>)
```
</br>
- Inside Module Function
```py
self.sendFriendRequest(<userId>, <msg>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendFriendRequest(<userId>, <msg>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendFriendRequest(<userId>, <msg>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_friend_request(<userId>, <msg>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_friend_request(<userId>, <msg>)
```
</details>
<!-- END sendFriendRequest -->
</br>
<!-- acceptFriendRequest -->
### Accept Friend Request
This function will accept friend request from user by ID.
> - Args:
> - userId (int | str): User ID to accept friend request
> - language (str): Response language or Zalo interface language
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.acceptFriendRequest(<userId>)
```
</br>
- Inside Module Function
```py
self.acceptFriendRequest(<userId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.acceptFriendRequest(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.acceptFriendRequest(<userId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.accept_friend_request(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.accept_friend_request(<userId>)
```
</details>
<!-- END acceptFriendRequest -->
</br>
<!-- blockViewFeed -->
### Block View Feed
This function will Block/Unblock friend view feed by ID.
> - Args:
> - userId (int | str): User ID to block/unblock view feed
> - isBlockFeed (int): Block/Unblock friend view feed (1 = True | 0 = False)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.blockViewFeed(<userId>, <isBlockFeed>)
```
</br>
- Inside Module Function
```py
self.blockViewFeed(<userId>, <isBlockFeed>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.blockViewFeed(<userId>, <isBlockFeed>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.blockViewFeed(<userId>, <isBlockFeed>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.block_view_feed(<userId>, <isBlockFeed>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.block_view_feed(<userId>, <isBlockFeed>)
```
</details>
<!-- END blockViewFeed -->
</br>
<!-- blockUser -->
### Block User
This function will block user by ID.
> - Args:
> - userId (int | str): User ID to block
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.blockUser(<userId>)
```
</br>
- Inside Module Function
```py
self.blockUser(<userId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.blockUser(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.blockUser(<userId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.block_user(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.block_user(<userId>)
```
</details>
<!-- END blockUser -->
</br>
<!-- unblockUser -->
### Unblock User
This function will unblock user by ID.
> - Args:
> - userId (int | str): User ID to unblock
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.unblockUser(<userId>)
```
</br>
- Inside Module Function
```py
self.unblockUser(<userId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unblockUser(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.unblockUser(<userId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unblock_user(<userId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.unblock_user(<userId>)
```
</details>
<!-- END unblockUser -->
</br>
<!-- createGroup -->
### Create Group
This function will Create a new group.
> - Args:
> - name (str): The new group name
> - description (str): Description of the new group
> - members (str | list): List/String member IDs add to new group
> - nameChanged (int - auto): Will use default name if disabled (0), else (1)
> - createLink (int - default): Create a group link? Default = 1 (True)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.createGroup(<name>, <description>, <members>)
```
</br>
- Inside Module Function
```py
self.createGroup(<name>, <description>, <members>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.createGroup(<name>, <description>, <members>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.createGroup(<name>, <description>, <members>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.create_group(<name>, <description>, <members>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.create_group(<name>, <description>, <members>)
```
</details>
<!-- END createGroup -->
</br>
<!-- changeGroupAvatar -->
### Change Group Avatar
This function will Upload/Change group avatar by ID.
> - Args:
> - filePath (str): A path to the image to upload/change avatar
> - groupId (int | str): Group ID to upload/change avatar
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeGroupAvatar(<filePath>, <groupId>)
```
</br>
- Inside Module Function
```py
self.changeGroupAvatar(<filePath>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeGroupAvatar(<filePath>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeGroupAvatar(<filePath>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_group_avatar(<filePath>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_group_avatar(<filePath>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group
(If the group does not allow members to upload/change)
<!-- END changeGroupAvatar -->
</br>
<!-- changeGroupName -->
### Change Group Name
This function will Set/Change group name by ID.
> - Args:
> - groupName (str): Group name to change
> - groupId (int | str): Group ID to change name
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeGroupName(<groupName>, <groupId>)
```
</br>
- Inside Module Function
```py
self.changeGroupName(<groupName>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeGroupName(<groupName>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeGroupName(<groupName>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_group_name(<groupName>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_group_name(<groupName>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group
(If the group does not allow members to upload/change)
<!-- END changeGroupName -->
</br>
<!-- changeGroupSetting -->
### Change Group Setting
This function will Update group settings by ID.
> - Args:
> - groupId (int | str): Group ID to update settings
> - defaultMode (str): Default mode of settings
>
> - default: Group default settings
> - anti-raid: Group default settings for anti-raid
>
> - **kwargs: Group settings kwargs, Value: (1 = True, 0 = False)
>
> - blockName: Không cho phép user đổi tên & ảnh đại diện nhóm
> - signAdminMsg: Đánh dấu tin nhắn từ chủ/phó nhóm
> - addMemberOnly: Chỉ thêm members (Khi tắt link tham gia nhóm)
> - setTopicOnly: Cho phép members ghim (tin nhắn, ghi chú, bình chọn)
> - enableMsgHistory: Cho phép new members đọc tin nhắn gần nhất
> - lockCreatePost: Không cho phép members tạo ghi chú, nhắc hẹn
> - lockCreatePoll: Không cho phép members tạo bình chọn
> - joinAppr: Chế độ phê duyệt thành viên
> - bannFeature: Default (No description)
> - dirtyMedia: Default (No description)
> - banDuration: Default (No description)
> - lockSendMsg: Không cho phép members gửi tin nhắn
> - lockViewMember: Không cho phép members xem thành viên nhóm
> - blocked_members: Danh sách members bị chặn
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeGroupSetting(<groupId>, **kwargs)
```
</br>
- Inside Module Function
```py
self.changeGroupSetting(<groupId>, **kwargs)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeGroupSetting(<groupId>, **kwargs))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeGroupSetting(<groupId>, **kwargs)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_group_setting(<groupId>, **kwargs))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_group_setting(<groupId>, **kwargs)
```
</details>
> [!WARNING]
Other settings will default value if not set. See `defaultMode`
<!-- END changeGroupSetting -->
</br>
<!-- changeGroupOwner -->
### Change Group Owner
This function will Change group owner by ID.
> - Args:
> - newAdminId (int | str): members ID to changer owner
> - groupId (int | str): ID of the group to changer owner
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.changeGroupOwner(<newAdminId>, <groupId>)
```
</br>
- Inside Module Function
```py
self.changeGroupOwner(<newAdminId>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.changeGroupOwner(<newAdminId>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.changeGroupOwner(<newAdminId>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.change_group_owner(<newAdminId>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.change_group_owner(<newAdminId>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END changeGroupOwner -->
</br>
<!-- addUsersToGroup -->
### Add Users To Group
This function will Add friends/users to a group.
> - Args:
> - user_ids (str | list): One or more friend/user IDs to add
> - groupId (int | str): Group ID to add friend/user to
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.addUsersToGroup(<user_ids>, <groupId>)
```
</br>
- Inside Module Function
```py
self.addUsersToGroup(<user_ids>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.addUsersToGroup(<user_ids>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.addUsersToGroup(<user_ids>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.add_users_to_group(<user_ids>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.add_users_to_group(<user_ids>, <groupId>)
```
</details>
<!-- END addUsersToGroup -->
</br>
<!-- kickUsersInGroup -->
### Kick Users In Group
This function will Kickout members in group by ID.
> - Args:
> - members (str | list): One or More member IDs to kickout
> - groupId (int | str): Group ID to kick member from
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.kickUsersInGroup(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.kickUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.kickUsersInGroup(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.kickUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.kick_users_in_group(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.kick_users_in_group(<members>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END kickUsersInGroup -->
</br>
<!-- blockUsersInGroup -->
### Block Users In Group
This function will Blocked members in group by ID.
> - Args:
> - members (str | list): One or More member IDs to block
> - groupId (int | str): Group ID to block member from
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.blockUsersInGroup(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.blockUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.blockUsersInGroup(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.blockUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.block_users_in_group(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.block_users_in_group(<members>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END blockUsersInGroup -->
</br>
<!-- unblockUsersInGroup -->
### Unblock Users In Group
This function will Unblock members in group by ID.
> - Args:
> - members (str | list): One or More member IDs to unblock
> - groupId (int | str): Group ID to unblock member from
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.unblockUsersInGroup(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.unblockUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unblockUsersInGroup(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.unblockUsersInGroup(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unblock_users_in_group(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.unblock_users_in_group(<members>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END unblockUsersInGroup -->
</br>
<!-- addGroupAdmins -->
### Add Group Admins
This function will Add admins to the group by ID.
> - Args:
> - members (str | list): One or More member IDs to add
> - groupId (int | str): Group ID to add admins
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.addGroupAdmins(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.addGroupAdmins(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.addGroupAdmins(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.addGroupAdmins(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.add_group_admins(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.add_group_admins(<members>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END addGroupAdmins -->
</br>
<!-- removeGroupAdmins -->
### Remove Group Admins
This function will Remove admins in the group by ID.
> - Args:
> - members (str | list): One or More admin IDs to remove
> - groupId (int | str): Group ID to remove admins
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.removeGroupAdmins(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.removeGroupAdmins(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.removeGroupAdmins(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.removeGroupAdmins(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.remove_group_admins(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.remove_group_admins(<members>, <groupId>)
```
</details>
> [!NOTE]
Client must be the Owner of the group.
<!-- END removeGroupAdmins -->
</br>
<!-- pinGroupMsg -->
### Pin Group Message
This function will Pin message in group by ID.
> - Args:
> - pinMsg (Message): Message Object to pin
> - groupId (int | str): Group ID to pin message
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.pinGroupMsg(<pinMsg>, <groupId>)
```
</br>
- Inside Module Function
```py
self.pinGroupMsg(<pinMsg>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.pinGroupMsg(<pinMsg>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.pinGroupMsg(<pinMsg>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.pin_group_msg(<pinMsg>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.pin_group_msg(<pinMsg>, <groupId>)
```
</details>
<!-- END pinGroupMsg -->
</br>
<!-- unpinGroupMsg -->
### Unpin Group Message
This function will Unpin message in group by ID.
> - Args:
> - pinId (int | str): Pin ID to unpin
> - pinTime (int): Pin start time
> - groupId (int | str): Group ID to unpin message
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)
```
</br>
- Inside Module Function
```py
self.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unpinGroupMsg(<pinId>, <pinTime>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.unpin_group_msg(<pinId>, <pinTime>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.unpin_group_msg(<pinId>, <pinTime>, <groupId>)
```
</details>
<!-- END unpinGroupMsg -->
</br>
<!-- deleteGroupMsg -->
### Delete Group Message
This function will Delete message in group by ID.
> - Args:
> - msgId (int | str): Message ID to delete
> - ownerId (int | str): Owner ID of the message to delete
> - clientMsgId (int | str): Client message ID to delete message
> - groupId (int | str): Group ID to delete message
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)
```
</br>
- Inside Module Function
```py
self.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.delete_group_msg(<msgId>, <onwerId>, <clientMsgId>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.delete_group_msg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)
```
</details>
<!-- END deleteGroupMsg -->
</br>
<!-- viewGroupPending -->
### View Group Pending
This function will Give list of people pending approval in group by ID.
> - Args:
> - groupId (int | str): Group ID to view pending members
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.viewGroupPending(<groupId>)
```
</br>
- Inside Module Function
```py
self.viewGroupPending(<groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.viewGroupPending(<groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.viewGroupPending(<groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.view_group_pending(<groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.view_group_pending(<groupId>)
```
</details>
<!-- END viewGroupPending -->
</br>
<!-- handleGroupPending -->
### Handle Group Pending
This function will Approve/Deny pending users to the group from the group's approval.
> - Args:
> - members (str | list): One or More member IDs to handle
> - groupId (int | str): ID of the group to handle pending members
> - isApprove (bool): Approve/Reject pending members (True | False)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.handleGroupPending(<members>, <groupId>)
```
</br>
- Inside Module Function
```py
self.handleGroupPending(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.handleGroupPending(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.handleGroupPending(<members>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.handle_group_pending(<members>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.handle_group_pending(<members>, <groupId>)
```
</details>
<!-- END handleGroupPending -->
</br>
<!-- viewPollDetail -->
### View Poll Detail
This function will Give poll data by ID.
> - Args:
> - pollId (int | str): Poll ID to view detail
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.viewPollDetail(<pollId>)
```
</br>
- Inside Module Function
```py
self.viewPollDetail(<pollId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.viewPollDetail(<pollId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.viewPollDetail(<pollId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.view_poll_detail(<pollId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.view_poll_detail(<pollId>)
```
</details>
<!-- END viewPollDetail -->
</br>
<!-- createPoll -->
### Create Poll
This function will Create poll in group by ID.
> - Args:
> - question (str): Question for poll
> - options (str | list): List options for poll
> - groupId (int | str): Group ID to create poll from
> - expiredTime (int): Poll expiration time (0 = no expiration)
> - pinAct (bool): Pin action (pin poll)
> - multiChoices (bool): Allows multiple poll choices
> - allowAddNewOption (bool): Allow members to add new options
> - hideVotePreview (bool): Hide voting results when haven't voted
> - isAnonymous (bool): Hide poll voters
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.createPoll(<question>, <options>, <groupId>)
```
</br>
- Inside Module Function
```py
self.createPoll(<question>, <options>, <groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.createPoll(<question>, <options>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.createPoll(<question>, <options>, <groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.create_poll(<question>, <options>, <groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.create_poll(<question>, <options>, <groupId>)
```
</details>
<!-- END createPoll -->
</br>
<!-- lockPoll -->
### Lock Poll
This function will Lock/end poll by ID.
> - Args:
> - pollId (int | str): Poll ID to lock
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.lockPoll(<pollId>)
```
</br>
- Inside Module Function
```py
self.lockPoll(<pollId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.lockPoll(<pollId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.lockPoll(<pollId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.lock_poll(<pollId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.lock_poll(<pollId>)
```
</details>
<!-- END lockPoll -->
</br>
<!-- disperseGroup -->
### Disperse Group
This function will Disperse group by ID.
> - Args:
> - groupId (int | str): Group ID to disperse
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.disperseGroup(<groupId>)
```
</br>
- Inside Module Function
```py
self.disperseGroup(<groupId>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.disperseGroup(<groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.disperseGroup(<groupId>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.disperse_group(<groupId>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.disperse_group(<groupId>)
```
</details>
<!-- END disperseGroup -->
</br>
<!-- send/sendMessage -->
### Send Message
This function will Send message to a thread (user/group).
> - Args:
> - message (Message): ``Message`` Object to send
> - thread_id (int | str): User/Group ID to send to
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - mark_message (str): Send messages as `Urgent` or `Important` mark
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.send(<message>, <thread_id>, <thread_type>)
```
or
```py
bot.sendMessage(<message>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.send(<message>, <thread_id>, <thread_type>)
```
or
```py
self.sendMessage(<message>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send(<message>, <thread_id>, <thread_type>))
```
or
```py
asyncio.run(bot.sendMessage(<message>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.send(<message>, <thread_id>, <thread_type>)
```
or
```py
await self.sendMessage(<message>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send(<message>, <thread_id>, <thread_type>))
```
or
```py
asyncio.run(bot.send_message(<message>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send(<message>, <thread_id>, <thread_type>)
```
or
```py
await bot.send_message(<message>, <thread_id>, <thread_type>)
```
</details>
<!-- END send/sendMessage -->
</br>
<!-- replyMessage -->
### Reply Message
This function will Reply message in thread (user/group).
> - Args:
> - replyMsg (Message): ``Message Object`` to reply
> - message (Message): ``Message Object`` to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.reply_to(<replyMsg>, <message>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.reply_to(<replyMsg>, <message>, <thread_id>, <thread_type>)
```
</details>
<!-- END replyMessage -->
</br>
<!-- undoMessage -->
### Undo Message
This function will Undo message from the client (self) by ID.
> - Args:
> - msgId (int | str): Message ID to undo
> - cliMsgId (int | str): Client Msg ID to undo
> - thread_id (int | str): User/Group ID to undo message
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.undo_message(<msgId>, <cliMsgId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.undo_message(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)
```
</details>
<!-- END undoMessage -->
</br>
<!-- sendReaction -->
### Send Reaction
This function will Reaction message in thread (user/group) by ID.
> - Args:
> - messageObject (Message): ``Message Object`` to reaction
> - reactionIcon (str): Icon/Text to reaction
> - thread_id (int | str): Group/User ID contain message to reaction
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_reaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_reaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendReaction -->
</br>
<!-- sendMultiReaction -->
### Send Multiple Reactions
This function will Reaction multi message in thread (user/group) by ID.
> - Args:
> - reactionObj (MessageReaction): Message(s) data to reaction
> - reactionIcon (str): Icon/Text to reaction
> - thread_id (int | str): Group/User ID contain message to reaction
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_multi_reaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_multi_reaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendMultiReaction -->
</br>
<!-- sendRemoteFile -->
### Send Remote File
This function will Send File to a User/Group with url.
> - Args:
> - fileUrl (str): File url to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - fileName (str): File name to send
> - fileSize (int): File size to send
> - extension (str): type of file to send (py, txt, mp4, ...)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_remote_file(<fileUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_remote_file(<fileUrl>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendRemoteFile -->
</br>
<!-- sendRemoteVideo -->
### Send Remote Video
This function will Send video to a User/Group with url.
> - Args:
> - videoUrl (str): Video link to send
> - thumbnailUrl (str): Thumbnail link for video
> - duration (int | str): Time for video (ms)
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - width (int): Width of the video
> - height (int): Height of the video
> - message (Message): ``Message Object`` to send with video
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_remote_video(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_remote_video(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendRemoteVideo -->
</br>
<!-- sendRemoteVoice -->
### Send Remote Voice
This function will Send voice to a User/Group with url.
> - Args:
> - voiceUrl (str): Voice link to send
> - thread_id (int | str): User/Group ID to change status in
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - fileSize (int | str): Voice content length (size) to send
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_remote_voice(<voiceUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_remote_voice(<voiceUrl>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendRemoteVoice -->
</br>
<!-- sendLocalImage -->
### Send Local Image
This function will Send Image to a User/Group with local file.
> - Args:
> - imagePath (str): Image directory to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - width (int): Image width to send
> - height (int): Image height to send
> - message (Message): ``Message Object`` to send with image
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendLocalImage(<imagePath>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_local_image(<imagePath>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_local_image(<imagePath>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendLocalImage -->
</br>
<!-- sendMultiLocalImage -->
### Send Multiple Local Image
This function will Send Multiple Image to a User/Group with local file.
> - Args:
> - imagePathList (list): List image directory to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - width (int): Image width to send
> - height (int): Image height to send
> - message (Message): ``Message Object`` to send with image
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_multi_local_image(<imagePathList>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_multi_local_image(<imagePathList>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendMultiLocalImage -->
</br>
<!-- sendLocalGif -->
### Send Local Gif
This function will Send Gif to a User/Group with local file.
> - Args:
> - gifPath (str): Gif path to send
> - thumbnailUrl (str): Thumbnail of gif to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - gifName (str): Gif name to send
> - width (int): Gif width to send
> - height (int): Gif height to send
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_local_gif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_local_gif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendLocalGif -->
</br>
<!-- sendSticker -->
### Send Sticker
This function will Send Sticker to a User/Group.
> - Args:
> - stickerType (int | str): Sticker type to send
> - stickerId (int | str): Sticker id to send
> - cateId (int | str): Sticker category id to send
> - thread_id (int | str): User/Group ID to send to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_sticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_sticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendSticker -->
</br>
<!-- sendCustomSticker -->
### Send Custom Sticker
This function will Send custom (static/animation) sticker to a User/Group with url.
> - Args:
> - staticImgUrl (str): Image url (png, jpg, jpeg) format to create sticker
> - animationImgUrl (str): Static/Animation image url (webp) format to create sticker
> - thread_id (int | str): User/Group ID to send sticker to.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - reply (int | str): Message ID to send stickers with quote
> - width (int | str): Width of photo/sticker
> - height (int | str): Height of photo/sticker
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_custom_sticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_custom_sticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendCustomSticker -->
</br>
<!-- sendLink -->
### Send Link
This function will Send link to a User/Group with url.
> - Args:
> - linkUrl (str): Link url to send
> - title (str): Title for card to send
> - thread_id (int | str): User/Group ID to send link to
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - thumbnailUrl (str): Thumbnail link url for card to send
> - domainUrl (str): Main domain of Link to send (eg: github.com)
> - desc (str): Description for card to send
> - message (Message): ``Message Object`` to send with the link
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_link(<linkUrl>, <title>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_link(<linkUrl>, <title>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendLink -->
</br>
<!-- sendReport -->
### Send Report
This function will Send report to Zalo.
> - Args:
> - thread_id (int | str): User/Group ID to report
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - reason (int): Reason for reporting
>
> - 1 = Nội dung nhạy cảm
> - 2 = Làm phiền
> - 3 = Lừa đảo
> - 0 = custom
>
> - content (str): Report content (work if reason = custom)
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendReport(<thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendReport(<thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendReport(<thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendReport(<thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_report(<thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_report(<thread_id>, <thread_type>)
```
</details>
<!-- END sendReport -->
</br>
<!-- sendBusinessCard -->
### Send Business Card
This function will Send business card to thread (user/group) by user ID.
> - Args:
> - userId (int | str): Business card user ID
> - qrCodeUrl (str): QR Code link with business card profile information
> - thread_id (int | str): User/Group ID to change status in
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
> - phone (int | str): Send business card with phone number
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.send_business_card(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.send_business_card(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)
```
</details>
<!-- END sendBusinessCard -->
</br>
<!-- setTypingStatus -->
### Set Typing Status
This function will Set users typing status.
> - Args:
> - thread_id: User/Group ID to change status in.
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.setTyping(<thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.setTyping(<thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.setTyping(<thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.setTyping(<thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.set_typing(<thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.set_typing(<thread_id>, <thread_type>)
```
</details>
<!-- END setTypingStatus -->
</br>
<!-- markAsDelivered -->
### Mark Message As Delivered
This function will Mark a message as delivered.
> - Args:
> - msgId (int | str): Message ID to set as delivered
> - cliMsgId (int | str): Client message ID
> - senderId (int | str): Message sender Id
> - thread_id (int | str): User/Group ID to mark as delivered
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.mark_as_delivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.mark_as_delivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<!-- END markAsDelivered -->
</br>
<!-- markAsRead -->
### Mark Message As Read
This function will Mark a message as read.
> - Args:
> - msgId (int | str): Message ID to set as delivered
> - cliMsgId (int | str): Client message ID
> - senderId (int | str): Message sender Id
> - thread_id (int | str): User/Group ID to mark as read
> - thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Outside Module Function
```py
bot.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</br>
- Inside Module Function
```py
self.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await self.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Function
```py
asyncio.run(bot.mark_as_read(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))
```
</br>
- Inside Module Function (You can use ``await`` instead.)
```py
await bot.mark_as_read(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)
```
</details>
<!-- END markAsRead -->
</br>
<!-- listen -->
### Listen
This function will Initialize and runs the listening loop continually.
> - Args:
> - delay (int): Delay time for each message fetch for ``requests`` type (Default: 1)
> - thread (bool): Handle messages within the thread for ``requests`` type (Default: False)
> - type (str): Type of listening (Default: websocket)
> - reconnect (int): Delay interval when reconnecting
- Use Outside Of Function
```py
bot.listen()
```
<!-- END listen -->
</br>
<!-- onListening -->
### On Listening
This function is called when the client is listening.
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Inside Module Custom Class
```py
def onListening(self):
....
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Inside Module Custom Class
```py
async def onListening(self):
....
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
- Outside Module Class
```py
@bot.event
async def on_listening():
....
```
</details>
<!-- END onListening -->
</br>
<!-- onMessage -->
### On Message
This function is called when the client is listening, and somebody sends a message.
> - Args:
> - mid: The message ID
> - author_id: The ID of the author
> - message: The message content of the author
> - message_object: The message (As a `Message` object)
> - thread_id: Thread ID that the message was sent to.
> - thread_type (ThreadType): Type of thread that the message was sent to.
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Inside Module Custom Class
```py
def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
....
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Inside Module Custom Class
```py
async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):
....
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
> - In simple type, all event or register_handler functions use args with context.
>
> - Args Context Example:
> - ctx.message_id
> - ctx.author_id
> - ctx.message
> - ctx.message_object
> - ctx.thread_id
> - ctx.thread_type
- Outside Module Class
```py
@bot.event
async def on_message(ctx):
....
```
</details>
<!-- END onMessage -->
</br>
<!-- onEvent -->
### On Event
This function is called when the client listening, and some events occurred.
> - Args:
> - event_data (EventObject): Event data (As a `EventObject` object)
> - event_type (EventType/GroupEventType): Event Type
<details>
<summary><b><i>Normal</b> code style</i></summary>
- Inside Module Custom Class
```py
def onEvent(self, event_data, event_type):
....
```
</details>
<details>
<summary><b><i>Async</b> code style</i></summary>
- Inside Module Custom Class
```py
async def onEvent(self, event_data, event_type):
....
```
</details>
<details>
<summary><b><i>Simple</b> code style</i></summary>
> - In simple type, all event or register_handler functions use args with context.
>
> - Args Context Example:
> - ctx.event_data
> - ctx.event_type
- Outside Module Class
```py
@bot.event
async def on_event(ctx):
....
```
</details>
<!-- END onEvent -->
</br>
<!-- Messages -->
### Messages
Represents a Zalo message.
> - Args:
> - text (str): The actual message
> - style (MessageStyle/MultiMsgStyle): A ``MessageStyle`` or ``MultiMsgStyle`` objects
> - mention (Mention/MultiMention): A ``Mention`` or ``MultiMention`` objects
> - parse_mode (str): Format messages in ``Markdown``, ``HTML`` style
```py
Message(text=<text>, mention=<mention>, style=<style>)
```
<!-- END Messages -->
</br>
<!-- MessageStyle -->
### Message Style
Style for message.
> - Args:
> - offset (int): The starting position of the style. Defaults to 0.
> - length (int): The length of the style. Defaults to 1.
> - style (str): The type of style. Can be "font", "bold", "italic", "underline", "strike", or "color". Defaults to "font".
> - color (str): The color of the style in hexadecimal format (e.g. "ffffff"). Only applicable when style is "color". Defaults to "ffffff".
> - size (int | str): The font size of the style. Only applicable when style is "font". Defaults to "18".
> - auto_format (bool): If there are multiple styles (used in ``MultiMsgStyle``) then set it to False. Default is True (1 style)
- Example
- **bold** style with offset is 5, length is 10.
```py
style = MessageStyle(offset=5, length=10, style="bold")
...
```
</br>
- color style with offset is 10, length is 5 and color="![#ff0000](https://placehold.co/20x15/ff0000/ff0000.png) `#ff0000`"
```py
style = MessageStyle(offset=10, ``length=5``, style="color", color="ff0000")
...
```
</br>
- font style with offset is 15, length is 8 and size="24" (Customize font size to 24)
```py
style = MessageStyle(offset=15, length=8, style="font", size="24")
...
```
<!-- END MessageStyle -->
</br>
<!-- MultiMsgStyle -->
### Multiple Message Style
Multiple style for message.
> - Args:
> - listStyle (MessageStyle): A list of ``MessageStyle`` objects to be combined into a single style format.
```py
style = MultiMsgStyle([
MessageStyle(offset=<text>, length=<mention>, style=<style>, color=<color>, size=<size>, auto_format=False),
MessageStyle(offset=<text>, length=<mention>, style=<style>, color=<color>, size=<size>, auto_format=False),
...
])
```
<!-- END MultiMsgStyle -->
</br>
<!-- Mention -->
### Mention
Represents a @mention.
> - Args:
> - uid (str): The user ID to be mentioned.
> - length (int): The length of the mention. Defaults to 1.
> - offset (int): The starting position of the mention. Defaults to 0.
> - auto_format (bool): If there are multiple mention (used in ``MultiMention``) then set it to False. Default is True (1 mention).
```py
mention = Mention(uid=<uid>, length=<length>, offset=<offset>)
...
```
</br>
- Mention user id *1234567890* with offset is 10 and length is 5.
```py
mention = Mention("1234567890", length=5, offset=10)
...
```
<!-- END Mention -->
</br>
<!-- MultiMention -->
### Multiple Mention
Represents multiple @mentions.
> - Args:
> - listMention (Mention): A list of ``Mention`` objects to be combined into a single mention format.
```py
mention = MultiMention([
Mention(uid=<uid>, length=<length>, offset=<offset>, auto_format=False),
Mention(uid=<uid>, length=<length>, offset=<offset>, auto_format=False),
...
])
```
</br>
- Mention user id *1234567890* with offset is 10 and length is 5.
- Mention user id *9876543210* with offset is 20 and length is 3.
```py
mention1 = Mention("1234567890", length=5, offset=10)
mention2 = Mention("9876543210", length=3, offset=20)
mention = MultiMention([mention1, mention2])
```
<!-- END MultiMention -->
</br>
## Example
See [examples](examples) folder to learn more about ``zlapi``.
</br>
## Acknowledgments
- This project was originally inspired by [fbchat](https://github.com/fbchat-dev/fbchat).
- listen ``websocket`` type taken from [zca-js](https://github.com/RFS-ADRENO/zca-js).
- Thanks for support:
- [Crow](https://t.me/crowmatacc) for Hosting.
- [Duy Hoang](https://t.me/Tcp_API) for the Video Tutorial.
- [Nguyen Hong Anh Duc](https://t.me/ducknha) for the Example.
- [Khang Phan](https://www.facebook.com/khang.phan27.info) for help fix the ``listen`` function error.
## Contact For Help
- <img src="https://upload.wikimedia.org/wikipedia/commons/8/83/Telegram_2019_Logo.svg" alt="Telegram Icon" width=20 height=15/> Telegram: [Vexx](https://t.me/vrxx1337)
- <img src="https://raw.githubusercontent.com/dheereshagrwal/colored-icons/master/public/logos/facebook/facebook.svg" alt="Facebook Icon" width=20 height=15/> Facebook: [Lê Quốc Việt](https://www.facebook.com/profile.php?id=100094031375075)
Raw data
{
"_id": null,
"home_page": null,
"name": "zlapi",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "python, zalo, api, zalo api, zalo chat, requests",
"author": "L\u00ea Qu\u1ed1c Vi\u1ec7t (Vexx)",
"author_email": "<vrxxdev@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/f5/89/83db0ffe3ac004aa54b50439b9f5bfb2f06e19b61977189fdc5819981b9a/zlapi-1.0.3.tar.gz",
"platform": null,
"description": "![Logo](https://i.imgur.com/CMnA5Sh.jpeg \"Logo\")\n\n## ``zlapi`` - Zalo API (Unofficial) for Python\n\n[![Project version](https://img.shields.io/badge/pypi-v1.0.2-blue.svg \"Project version\")](https://pypi.org/project/zlapi/1.0.2)\n[![Supported python versions: >= 3. and pypy](https://badgen.net/badge/python/>=3.,pypy?list=| \"Supported python versions: >= 3. and pypy\")](zlapi)\n[![License: MIT License](https://img.shields.io/badge/license-MIT-lightgreen.svg \"License: MIT License\")](https://github.com/Its-VrxxDev/zlapi/blob/master/LICENSE)\n[![Documentation](https://img.shields.io/badge/docs-stop_updating-red.svg \"Documentation\")](https://vrxx1337.vercel.app/zlapi/docs/lastest)\n\n### Language\n\n- S\u1ebd h\u1ed7 tr\u1ee3 t\u00e0i li\u1ec7u Ti\u1ebfng Vi\u1ec7t s\u1edbm nh\u1ea5t c\u00f3 th\u1ec3. S\u00e0i t\u1ea1m google d\u1ecbch nh\u00e9 :)\n\n### What is ``zlapi``?\n\nA powerful and efficient library to interact with Zalo Website. \nThis is *not* an official API, Zalo has that [over here](https://developers.zalo.me/docs) for chat bots. This library differs by using a normal Zalo account instead (More flexible).\n\n``zlapi`` currently support:\n\n- Custom style for message.\n- Sending many types of messages, with files, stickers, mentions, etc.\n- Fetching messages, threads and users info.\n- Creating groups, setting the group, creating polls, etc.\n- Listening for, an reacting to messages and other events in real-time.\n- And there are many other things.\n- ``async``/``await`` (Updated).\n\nEssentially, everything you need to make an amazing Zalo Bot!\n\n\n### Caveats\n\n``zlapi`` works by imitating what the browser does, and thereby tricking Zalo into thinking it's accessing the website normally.\n\nHowever, there's a catch! **Using this library may not comply with Zalo's Terms Of Service**, so be! We are not responsible if your account gets banned or disabled!\n\n\n### What's New?\n\nThis is an updated version for ``zlapi`` to improve features and fix bugs (v1.0.3)\n\n**Improvements**\n\n- Change function [replyMessage]()\n\n**Bugfixes**\n\n- Fixed not getting response from server when listening.\n\n- Fixed the error of login function, not requiring account & password when using cookies.\n\n**Deprecations**\n\n- The old login server has been removed due to lack of funds to maintain the server.\n\n</br>\n\n## Installation\n\n```bash\npip install zlapi\n```\n\nIf you don't have [pip](https://pip.pypa.io/), [this guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process.\n\nYou can also install directly from source, provided you have ``pip>=19.0``:\n\n```bash\npip install git+https://github.com/Its-VrxxDev/zlapi.git\n```\n\n</br>\n\n## How to get IMEI and Cookies?\n\n### Download Extension\n\n- [Click Here](https://drive.google.com/file/d/18_-8ruYOVa89JkHdr3muGj3kGWxwt6mc/view?usp=drive_link) to download the extension support getting IMEI & Cookies more conveniently.\n\n### Extension Usage Tutorial\n\n1. Enable the extension downloaded above.\n2. Go to [https://chat.zalo.me](https://chat.zalo.me), Sign in to your account.\n3. After successfully logging in, go back to extension and get IMEI, Cookies.\n\n> [!TIP]\nIf you have opened the website ``chat.zalo.me`` but the extension does not have IMEI & Cookies, please click ``Refresh Page``.\n\n#### Windows\n\n[![](https://previews.jumpshare.com/thumb/815bc01b796dd6f1733c957c5af19493968eb06ccf48b6a5036cf7916c0a83965899fb056fe88c29f2bcb2f9f0f5ed5832801eede43aa22e94d5c7bc545ef9448bfbfd14044e807555841b406fdf069aa3acda441ff8675390fa0ff601ff0bcd)](https://jumpshare.com/embed/8SjFyd3EQlCMx1V7N1UQ)\n\n</br>\n\n#### Android\n\n> - Use ``kiwibrowser`` instead of ``chrome`` to be able to use the extension.\n> - If you are redirect when accessing ``https://chat.zalo.me``. [Watch this video](https://jumpshare.com/embed/l3LLjAWSAR8KQxvh9dzz)\n\n[![](https://previews.jumpshare.com/thumb/815bc01b796dd6f1733c957c5af194938966297dbb29c75d038ac93e0691be4c741e5e2cbb689c41b8dfebde4ded3316844e23ec82425f377c248f1a57861470e76e9fe268bdf0803c7c14a61c9dc50769f92efb3803e5ae68c46d260d3407db)](https://jumpshare.com/embed/n56jtVQ7pwZDfR5ZtPft)\n\n</br>\n\n## Basic Usage\n\n### Login Account Using Cookies\n\n* ``Normal``/``Async`` code style\n\n```py\n# > Normal\n# from zlapi import ZaloAPI\n\n# > Async\n# from zlapi.Async import ZaloAPI\n\nfrom zlapi import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\nbot = ZaloAPI(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\n```\n\n</br>\n\n* ``Simple`` code style\n\n```py\nfrom zlapi.simple import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\nbot = ZaloAPI(\"</>\", \"</>\", imei, cookies, prefix=\"<your bot prefix>\")\n```\n\n</br>\n\n### Listen Message, Event, ...\n\n* You can enable thread mode for [On Message](#on-message) function (work with ``requests`` type) with ``thread=True``.\n\n```py\nbot.listen(thread=True)\n```\n\n* You can customize the reconnect time when listening is interrupted using ``reconnect=...``.\n\n```py\nbot.listen(reconnect=5)\n```\n\n</br>\n\n* ``Normal``/``Async`` code style\n\n```py\n# > Normal\n# from zlapi import ZaloAPI\n\n# > Async\n# from zlapi.Async import ZaloAPI\n\nfrom zlapi import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nbot = ZaloAPI(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\n# client.listen(type=\"...\")\nbot.listen()\n```\n\n</br>\n\n* ``Simple`` code style\n\n```py\nfrom zlapi.simple import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nbot = ZaloAPI(\"</>\", \"</>\", imei, cookies, prefix=\"<your bot prefix>\")\nbot.listen()\n```\n\n</br>\n\n### Custom On Message Function\n\n``onMessage`` function will be called when receiving a message from ``listen`` function. **So we can handle that message here.**\n\n* ``Normal`` code style\n\n```py\nfrom zlapi import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nclass CustomBot(ZaloAPI):\n def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n # Handle Message Here\n pass\n\n\nbot = CustomBot(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\nbot.listen()\n```\n\n</br>\n\n* ``Async`` code style\n\n```py\nfrom zlapi.Async import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nclass CustomBot(ZaloAPI):\n async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n # Handle Message Here\n pass\n\n\nbot = CustomBot(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\nbot.listen()\n```\n\n</br>\n\n* ``Simple`` code style\n\n```py\nfrom zlapi.simple import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\nbot = ZaloAPI(\"</>\", \"</>\", imei, cookies, prefix=\"<bot prefix>\")\n\n\n@bot.event\nasync def on_message(ctx):\n # Handle Message Here\n pass\n\n\nbot.listen()\n```\n\n</br>\n\n### Example Handle Message\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n```py\nfrom zlapi import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nclass CustomBot(ZaloAPI):\n def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n if not isinstance(message, str):\n return\n\n if message == \".hi\":\n print(f\"{author_id} sent message .hi\")\n\n\nbot = CustomBot(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\nbot.listen()\n```\n\n> - If the message is not ``string`` do not process this message.\n> - If the message is ``.hi`` will print author id of message to terminal.\n\n</br>\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n```py\nfrom zlapi.Async import ZaloAPI\nfrom zlapi.models import *\n\nimei = \"<imei>\"\ncookies = {} # Cookies Dict\n\nclass CustomBot(ZaloAPI):\n async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n if not isinstance(message, str):\n return\n\n if message == \".hi\":\n print(f\"{author_id} sent message .hi\")\n\n\nbot = CustomBot(\"<phone>\", \"<password>\", imei=imei, session_cookies=cookies)\nbot.listen()\n```\n\n> - If the message is not ``string`` do not process this message.\n> - If the message is ``.hi`` will print author id of message to terminal.\n\n</br>\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Method 1\n\n ```py\n from zlapi.simple import ZaloAPI\n from zlapi.models import *\n\n imei = \"<imei>\"\n cookies = {} # Cookies Dict\n bot = ZaloAPI(\"</>\", \"</>\", imei, cookies, prefix=\"<bot prefix>\")\n\n \n @bot.event\n async def on_message(ctx):\n if ctx.message == \".hi\":\n print(f\"{ctx.author_id} sent message .hi\")\n\n\n bot.listen()\n ```\n\n</br>\n\n- Method 2\n\n ```py\n from zlapi.simple import ZaloAPI\n from zlapi.models import *\n\n imei = \"<imei>\"\n cookies = {} # Cookies Dict\n bot = ZaloAPI(\"</>\", \"</>\", imei, cookies, prefix=\".\")\n\n\n @bot.register_handler(commands=[\"hi\"])\n async def handle_hi(ctx):\n print(f\"{ctx.author_id} sent message .hi\")\n\n \n bot.listen()\n ```\n \n > - ``@bot.register_handler(commands=[\"hi\"])`` is a decoration class used to register a command. When an incoming message matches the bot prefix + registered commands, the message will be processed.\n\n</details>\n\n</br>\n\n<!-- fetchAccountInfo -->\n\n### Fetch Account Information\n\nThis function will get the account information you are using in ``zlapi``.\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchAccountInfo()\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchAccountInfo()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchAccountInfo())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchAccountInfo()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_account_info())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_account_info()\n ```\n\n</details>\n\n<!-- END FetchAccountInfo -->\n\n</br>\n\n<!-- fetchPhoneNumber -->\n\n### Fetch Phone Number\n\nThis function will get user information using that user phone number.\n\n> [!NOTE]\nCan't get information of **hidden phone number** or **locked account**\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchPhoneNumber(\"<phone number>\")\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchPhoneNumber(\"<phone number>\")\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchPhoneNumber(\"<phone number>\"))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchPhoneNumber(\"<phone number>\")\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_phone_number(\"<phone number>\"))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_phone_number(\"<phone number>\")\n ```\n\n</details>\n\n<!-- END FetchPhoneNumber -->\n\n</br>\n\n<!-- fetchUserInfo -->\n\n### Fetch User Info\n\nThis function will get user information using that user ID.\n\n> - In ``Normal``/``Async`` code style you can get user id with author_id argument\n> - In ``Simple`` code style you can get user id with ctx.author_id argument\n> - Or you can use user id if you already have one\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchUserInfo(<user id>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchUserInfo(<user id>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchUserInfo(<user id>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchUserInfo(<user id>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_user_info(<user id>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_user_info(<user id>)\n ```\n\n</details>\n\n<!-- END FetchUserInfo -->\n\n</br>\n\n<!-- fetchGroupInfo -->\n\n### Fetch Group Info\n\nThis function will get group information using that group ID.\n\n> - In ``Normal``/``Async`` code style you can get user id with thread_id argument\n> - In ``Simple`` code style you can get user id with ctx.thread_id argument\n> - Or you can use group id if you already have one\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchGroupInfo(<group id>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchGroupInfo(<group id>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchGroupInfo(<group id>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchGroupInfo(<group id>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_group_info(<group id>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_group_info(<user id>)\n ```\n\n</details>\n\n<!-- END FetchGroupInfo -->\n\n</br>\n\n<!-- fetchAllFriends -->\n\n### Fetch All Friends\n\nThis function will get all the friends information of the account currently using the ``zlapi``.\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchAllFriends()\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchAllFriends()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchAllFriends())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchAllFriends()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_all_friends())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_all_friends()\n ```\n\n</details>\n\n<!-- END FetchAllFriends -->\n\n</br>\n\n<!-- fetchAllGroups -->\n\n### Fetch All Groups\n\nThis function will get all the groups id of the account currently using the ``zlapi``.\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.fetchAllGroups()\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.fetchAllGroups()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.fetchAllGroups())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.fetchAllGroups()\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.fetch_all_groups())\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.fetch_all_groups()\n ```\n\n</details>\n\n<!-- END FetchAllGroups -->\n\n</br>\n\n<!-- changeAccountSetting -->\n\n### Change Account Setting\n\nThis function will change setting of the account currently using the ``zlapi``.\n\n> - Args:\n> - name (str): The new account name\n> - dob (str): Date of birth wants to change (format: year-month-day)\n> - gender (int | str): Gender wants to change (0 = Male, 1 = Female)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeAccountSetting(<name>, <dob>, <gender>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeAccountSetting(<name>, <dob>, <gender>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeAccountSetting(<name>, <dob>, <gender>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeAccountSetting(<name>, <dob>, <gender>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_account_setting(<name>, <dob>, <gender>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_account_setting(<name>, <dob>, <gender>)\n ```\n\n</details>\n\n<!-- END changeAccountSetting -->\n\n</br>\n\n<!-- changeAccountAvatar -->\n\n### Change Account Avatar\n\nThis function will upload/change avatar of the account currently using the ``zlapi``.\n\n> - Args:\n> - filePath (str): A path to the image to upload/change avatar\n> - size (int): Avatar image size (default = auto)\n>\t- width (int): Width of avatar image\n>\t- height (int): height of avatar image\n>\t- language (int | str): Zalo Website language ? (idk)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeAccountAvatar(<filePath>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeAccountAvatar(<filePath>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeAccountAvatar(<filePath>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeAccountAvatar(<filePath>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_account_avatar(<filePath>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_account_avatar(<filePath>)\n ```\n\n</details>\n\n<!-- END changeAccountAvatar -->\n\n</br>\n\n<!-- sendFriendRequest -->\n\n### Send Friend Request\n\nThis function will send friend request to a user by ID.\n\n> - Args:\n>\t- userId (int | str): User ID to send friend request\n>\t- msg (str): Friend request message\n>\t- language (str): Response language or Zalo interface language\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendFriendRequest(<userId>, <msg>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendFriendRequest(<userId>, <msg>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendFriendRequest(<userId>, <msg>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendFriendRequest(<userId>, <msg>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_friend_request(<userId>, <msg>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_friend_request(<userId>, <msg>)\n ```\n\n</details>\n\n<!-- END sendFriendRequest -->\n\n</br>\n\n<!-- acceptFriendRequest -->\n\n### Accept Friend Request\n\nThis function will accept friend request from user by ID.\n\n> - Args:\n>\t- userId (int | str): User ID to accept friend request\n>\t- language (str): Response language or Zalo interface language\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.acceptFriendRequest(<userId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.acceptFriendRequest(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.acceptFriendRequest(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.acceptFriendRequest(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.accept_friend_request(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.accept_friend_request(<userId>)\n ```\n\n</details>\n\n<!-- END acceptFriendRequest -->\n\n</br>\n\n<!-- blockViewFeed -->\n\n### Block View Feed\n\nThis function will Block/Unblock friend view feed by ID.\n\n> - Args:\n>\t- userId (int | str): User ID to block/unblock view feed\n>\t- isBlockFeed (int): Block/Unblock friend view feed (1 = True | 0 = False)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.blockViewFeed(<userId>, <isBlockFeed>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.blockViewFeed(<userId>, <isBlockFeed>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.blockViewFeed(<userId>, <isBlockFeed>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.blockViewFeed(<userId>, <isBlockFeed>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.block_view_feed(<userId>, <isBlockFeed>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.block_view_feed(<userId>, <isBlockFeed>)\n ```\n\n</details>\n\n<!-- END blockViewFeed -->\n\n</br>\n\n<!-- blockUser -->\n\n### Block User\n\nThis function will block user by ID.\n\n> - Args:\n>\t- userId (int | str): User ID to block\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.blockUser(<userId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.blockUser(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.blockUser(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.blockUser(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.block_user(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.block_user(<userId>)\n ```\n\n</details>\n\n<!-- END blockUser -->\n\n</br>\n\n<!-- unblockUser -->\n\n### Unblock User\n\nThis function will unblock user by ID.\n\n> - Args:\n>\t- userId (int | str): User ID to unblock\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.unblockUser(<userId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.unblockUser(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.unblockUser(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.unblockUser(<userId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.unblock_user(<userId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.unblock_user(<userId>)\n ```\n\n</details>\n\n<!-- END unblockUser -->\n\n</br>\n\n<!-- createGroup -->\n\n### Create Group\n\nThis function will Create a new group.\n\n> - Args:\n>\t- name (str): The new group name\n>\t- description (str): Description of the new group\n>\t- members (str | list): List/String member IDs add to new group\n>\t- nameChanged (int - auto): Will use default name if disabled (0), else (1)\n>\t- createLink (int - default): Create a group link? Default = 1 (True)\n\t\t\t\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.createGroup(<name>, <description>, <members>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.createGroup(<name>, <description>, <members>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.createGroup(<name>, <description>, <members>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.createGroup(<name>, <description>, <members>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.create_group(<name>, <description>, <members>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.create_group(<name>, <description>, <members>)\n ```\n\n</details>\n\n<!-- END createGroup -->\n\n</br>\n\n<!-- changeGroupAvatar -->\n\n### Change Group Avatar\n\nThis function will Upload/Change group avatar by ID.\n\n> - Args:\n>\t- filePath (str): A path to the image to upload/change avatar\n>\t- groupId (int | str): Group ID to upload/change avatar\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeGroupAvatar(<filePath>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeGroupAvatar(<filePath>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeGroupAvatar(<filePath>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeGroupAvatar(<filePath>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_group_avatar(<filePath>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_group_avatar(<filePath>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group\n(If the group does not allow members to upload/change)\n\n<!-- END changeGroupAvatar -->\n\n</br>\n\n<!-- changeGroupName -->\n\n### Change Group Name\n\nThis function will Set/Change group name by ID.\n\n> - Args:\n>\t- groupName (str): Group name to change\n>\t- groupId (int | str): Group ID to change name\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeGroupName(<groupName>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeGroupName(<groupName>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeGroupName(<groupName>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeGroupName(<groupName>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_group_name(<groupName>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_group_name(<groupName>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group\n(If the group does not allow members to upload/change)\n\n<!-- END changeGroupName -->\n\n</br>\n\n<!-- changeGroupSetting -->\n\n### Change Group Setting\n\nThis function will Update group settings by ID.\n\n> - Args:\n>\t- groupId (int | str): Group ID to update settings\n>\t- defaultMode (str): Default mode of settings\n>\t\t\t\n>\t\t- default: Group default settings\n>\t\t- anti-raid: Group default settings for anti-raid\n>\t\t\t\n>\t- **kwargs: Group settings kwargs, Value: (1 = True, 0 = False)\n>\t\t\t\n>\t\t- blockName: Kh\u00f4ng cho ph\u00e9p user \u0111\u1ed5i t\u00ean & \u1ea3nh \u0111\u1ea1i di\u1ec7n nh\u00f3m\n>\t\t- signAdminMsg: \u0110\u00e1nh d\u1ea5u tin nh\u1eafn t\u1eeb ch\u1ee7/ph\u00f3 nh\u00f3m\n>\t\t- addMemberOnly: Ch\u1ec9 th\u00eam members (Khi t\u1eaft link tham gia nh\u00f3m)\n>\t\t- setTopicOnly: Cho ph\u00e9p members ghim (tin nh\u1eafn, ghi ch\u00fa, b\u00ecnh ch\u1ecdn)\n>\t\t- enableMsgHistory: Cho ph\u00e9p new members \u0111\u1ecdc tin nh\u1eafn g\u1ea7n nh\u1ea5t\n>\t\t- lockCreatePost: Kh\u00f4ng cho ph\u00e9p members t\u1ea1o ghi ch\u00fa, nh\u1eafc h\u1eb9n\n>\t\t- lockCreatePoll: Kh\u00f4ng cho ph\u00e9p members t\u1ea1o b\u00ecnh ch\u1ecdn\n>\t\t- joinAppr: Ch\u1ebf \u0111\u1ed9 ph\u00ea duy\u1ec7t th\u00e0nh vi\u00ean\n>\t\t- bannFeature: Default (No description)\n>\t\t- dirtyMedia: Default (No description)\n>\t\t- banDuration: Default (No description)\n>\t\t- lockSendMsg: Kh\u00f4ng cho ph\u00e9p members g\u1eedi tin nh\u1eafn\n>\t\t- lockViewMember: Kh\u00f4ng cho ph\u00e9p members xem th\u00e0nh vi\u00ean nh\u00f3m\n>\t\t- blocked_members: Danh s\u00e1ch members b\u1ecb ch\u1eb7n\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeGroupSetting(<groupId>, **kwargs)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeGroupSetting(<groupId>, **kwargs)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeGroupSetting(<groupId>, **kwargs))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeGroupSetting(<groupId>, **kwargs)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_group_setting(<groupId>, **kwargs))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_group_setting(<groupId>, **kwargs)\n ```\n\n</details>\n\n> [!WARNING]\nOther settings will default value if not set. See `defaultMode`\n\n<!-- END changeGroupSetting -->\n\n</br>\n\n<!-- changeGroupOwner -->\n\n### Change Group Owner\n\nThis function will Change group owner by ID.\n\n> - Args:\n>\t- newAdminId (int | str): members ID to changer owner\n>\t- groupId (int | str): ID of the group to changer owner\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.changeGroupOwner(<newAdminId>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.changeGroupOwner(<newAdminId>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.changeGroupOwner(<newAdminId>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.changeGroupOwner(<newAdminId>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.change_group_owner(<newAdminId>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.change_group_owner(<newAdminId>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END changeGroupOwner -->\n\n</br>\n\n<!-- addUsersToGroup -->\n\n### Add Users To Group\n\nThis function will Add friends/users to a group.\n\n> - Args:\n>\t- user_ids (str | list): One or more friend/user IDs to add\n>\t- groupId (int | str): Group ID to add friend/user to\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.addUsersToGroup(<user_ids>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.addUsersToGroup(<user_ids>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.addUsersToGroup(<user_ids>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.addUsersToGroup(<user_ids>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.add_users_to_group(<user_ids>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.add_users_to_group(<user_ids>, <groupId>)\n ```\n\n</details>\n\n<!-- END addUsersToGroup -->\n\n</br>\n\n<!-- kickUsersInGroup -->\n\n### Kick Users In Group\n\nThis function will Kickout members in group by ID.\n\n> - Args:\n>\t- members (str | list): One or More member IDs to kickout\n>\t- groupId (int | str): Group ID to kick member from\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.kickUsersInGroup(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.kickUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.kickUsersInGroup(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.kickUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.kick_users_in_group(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.kick_users_in_group(<members>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END kickUsersInGroup -->\n\n</br>\n\n<!-- blockUsersInGroup -->\n\n### Block Users In Group\n\nThis function will Blocked members in group by ID.\n\n> - Args:\n>\t- members (str | list): One or More member IDs to block\n>\t- groupId (int | str): Group ID to block member from\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.blockUsersInGroup(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.blockUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.blockUsersInGroup(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.blockUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.block_users_in_group(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.block_users_in_group(<members>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END blockUsersInGroup -->\n\n</br>\n\n<!-- unblockUsersInGroup -->\n\n### Unblock Users In Group\n\nThis function will Unblock members in group by ID.\n\n> - Args:\n>\t- members (str | list): One or More member IDs to unblock\n>\t- groupId (int | str): Group ID to unblock member from\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.unblockUsersInGroup(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.unblockUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.unblockUsersInGroup(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.unblockUsersInGroup(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.unblock_users_in_group(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.unblock_users_in_group(<members>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END unblockUsersInGroup -->\n\n</br>\n\n<!-- addGroupAdmins -->\n\n### Add Group Admins\n\nThis function will Add admins to the group by ID.\n\n> - Args:\n>\t- members (str | list): One or More member IDs to add\n>\t- groupId (int | str): Group ID to add admins\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.addGroupAdmins(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.addGroupAdmins(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.addGroupAdmins(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.addGroupAdmins(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.add_group_admins(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.add_group_admins(<members>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END addGroupAdmins -->\n\n</br>\n\n<!-- removeGroupAdmins -->\n\n### Remove Group Admins\n\nThis function will Remove admins in the group by ID.\n\n> - Args:\n>\t- members (str | list): One or More admin IDs to remove\n>\t- groupId (int | str): Group ID to remove admins\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.removeGroupAdmins(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.removeGroupAdmins(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.removeGroupAdmins(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.removeGroupAdmins(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.remove_group_admins(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.remove_group_admins(<members>, <groupId>)\n ```\n\n</details>\n\n> [!NOTE]\nClient must be the Owner of the group.\n\n<!-- END removeGroupAdmins -->\n\n</br>\n\n<!-- pinGroupMsg -->\n\n### Pin Group Message\n\nThis function will Pin message in group by ID.\n\n> - Args:\n>\t- pinMsg (Message): Message Object to pin\n>\t- groupId (int | str): Group ID to pin message\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.pinGroupMsg(<pinMsg>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.pinGroupMsg(<pinMsg>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.pinGroupMsg(<pinMsg>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.pinGroupMsg(<pinMsg>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.pin_group_msg(<pinMsg>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.pin_group_msg(<pinMsg>, <groupId>)\n ```\n\n</details>\n\n<!-- END pinGroupMsg -->\n\n</br>\n\n<!-- unpinGroupMsg -->\n\n### Unpin Group Message\n\nThis function will Unpin message in group by ID.\n\n> - Args:\n>\t- pinId (int | str): Pin ID to unpin\n>\t- pinTime (int): Pin start time\n>\t- groupId (int | str): Group ID to unpin message\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.unpinGroupMsg(<pinId>, <pinTime>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.unpinGroupMsg(<pinId>, <pinTime>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.unpin_group_msg(<pinId>, <pinTime>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.unpin_group_msg(<pinId>, <pinTime>, <groupId>)\n ```\n\n</details>\n\n<!-- END unpinGroupMsg -->\n\n</br>\n\n<!-- deleteGroupMsg -->\n\n### Delete Group Message\n\nThis function will Delete message in group by ID.\n\n> - Args:\n>\t- msgId (int | str): Message ID to delete\n>\t- ownerId (int | str): Owner ID of the message to delete\n>\t- clientMsgId (int | str): Client message ID to delete message\n>\t- groupId (int | str): Group ID to delete message\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.deleteGroupMsg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.delete_group_msg(<msgId>, <onwerId>, <clientMsgId>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.delete_group_msg(<msgId>, <onwerId>, <clientMsgId>, <groupId>)\n ```\n\n</details>\n\n<!-- END deleteGroupMsg -->\n\n</br>\n\n<!-- viewGroupPending -->\n\n### View Group Pending\n\nThis function will Give list of people pending approval in group by ID.\n\n> - Args:\n>\t- groupId (int | str): Group ID to view pending members\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.viewGroupPending(<groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.viewGroupPending(<groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.viewGroupPending(<groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.viewGroupPending(<groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.view_group_pending(<groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.view_group_pending(<groupId>)\n ```\n\n</details>\n\n<!-- END viewGroupPending -->\n\n</br>\n\n<!-- handleGroupPending -->\n\n### Handle Group Pending\n\nThis function will Approve/Deny pending users to the group from the group's approval.\n\n> - Args:\n>\t- members (str | list): One or More member IDs to handle\n>\t- groupId (int | str): ID of the group to handle pending members\n>\t- isApprove (bool): Approve/Reject pending members (True | False)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.handleGroupPending(<members>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.handleGroupPending(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.handleGroupPending(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.handleGroupPending(<members>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.handle_group_pending(<members>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.handle_group_pending(<members>, <groupId>)\n ```\n\n</details>\n\n<!-- END handleGroupPending -->\n\n</br>\n\n<!-- viewPollDetail -->\n\n### View Poll Detail\n\nThis function will Give poll data by ID.\n\n> - Args:\n>\t- pollId (int | str): Poll ID to view detail\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.viewPollDetail(<pollId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.viewPollDetail(<pollId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.viewPollDetail(<pollId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.viewPollDetail(<pollId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.view_poll_detail(<pollId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.view_poll_detail(<pollId>)\n ```\n\n</details>\n\n<!-- END viewPollDetail -->\n\n</br>\n\n<!-- createPoll -->\n\n### Create Poll\n\nThis function will Create poll in group by ID.\n\n> - Args:\n>\t- question (str): Question for poll\n>\t- options (str | list): List options for poll\n>\t- groupId (int | str): Group ID to create poll from\n>\t- expiredTime (int): Poll expiration time (0 = no expiration)\n>\t- pinAct (bool): Pin action (pin poll)\n>\t- multiChoices (bool): Allows multiple poll choices\n>\t- allowAddNewOption (bool): Allow members to add new options\n>\t- hideVotePreview (bool): Hide voting results when haven't voted\n>\t- isAnonymous (bool): Hide poll voters\n\t\t\t\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.createPoll(<question>, <options>, <groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.createPoll(<question>, <options>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.createPoll(<question>, <options>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.createPoll(<question>, <options>, <groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.create_poll(<question>, <options>, <groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.create_poll(<question>, <options>, <groupId>)\n ```\n\n</details>\n\n<!-- END createPoll -->\n\n</br>\n\n<!-- lockPoll -->\n\n### Lock Poll\n\nThis function will Lock/end poll by ID.\n\n> - Args:\n>\t- pollId (int | str): Poll ID to lock\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.lockPoll(<pollId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.lockPoll(<pollId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.lockPoll(<pollId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.lockPoll(<pollId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.lock_poll(<pollId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.lock_poll(<pollId>)\n ```\n\n</details>\n\n<!-- END lockPoll -->\n\n</br>\n\n<!-- disperseGroup -->\n\n### Disperse Group\n\nThis function will Disperse group by ID.\n\n> - Args:\n>\t- groupId (int | str): Group ID to disperse\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.disperseGroup(<groupId>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.disperseGroup(<groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.disperseGroup(<groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.disperseGroup(<groupId>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.disperse_group(<groupId>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.disperse_group(<groupId>)\n ```\n\n</details>\n\n<!-- END disperseGroup -->\n\n</br>\n\n<!-- send/sendMessage -->\n\n### Send Message\n\nThis function will Send message to a thread (user/group).\n\n> - Args:\n>\t- message (Message): ``Message`` Object to send\n>\t- thread_id (int | str): User/Group ID to send to\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- mark_message (str): Send messages as `Urgent` or `Important` mark\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n bot.send(<message>, <thread_id>, <thread_type>)\n ```\n \n or\n \n ```py\n bot.sendMessage(<message>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.send(<message>, <thread_id>, <thread_type>)\n ```\n \n or\n \n ```py\n self.sendMessage(<message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.send(<message>, <thread_id>, <thread_type>))\n ```\n \n or\n \n ```py\n asyncio.run(bot.sendMessage(<message>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.send(<message>, <thread_id>, <thread_type>)\n ```\n \n or\n \n ```py\n await self.sendMessage(<message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send(<message>, <thread_id>, <thread_type>))\n ```\n \n or\n \n ```py\n asyncio.run(bot.send_message(<message>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send(<message>, <thread_id>, <thread_type>)\n ```\n \n or\n \n ```py\n await bot.send_message(<message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END send/sendMessage -->\n\n</br>\n\n<!-- replyMessage -->\n\n### Reply Message\n\nThis function will Reply message in thread (user/group).\n\n> - Args:\n>\t- replyMsg (Message): ``Message Object`` to reply\n>\t- message (Message): ``Message Object`` to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.replyTo(<replyMsg>, <message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.reply_to(<replyMsg>, <message>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.reply_to(<replyMsg>, <message>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END replyMessage -->\n\n</br>\n\n<!-- undoMessage -->\n\n### Undo Message\n\nThis function will Undo message from the client (self) by ID.\n\n> - Args:\n>\t- msgId (int | str): Message ID to undo\n>\t- cliMsgId (int | str): Client Msg ID to undo\n>\t- thread_id (int | str): User/Group ID to undo message\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\t\t\t\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.undoMessage(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.undo_message(<msgId>, <cliMsgId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.undo_message(<msgId>, <cliMsgId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END undoMessage -->\n\n</br>\n\n<!-- sendReaction -->\n\n### Send Reaction\n\nThis function will Reaction message in thread (user/group) by ID.\n\n> - Args:\n>\t- messageObject (Message): ``Message Object`` to reaction\n>\t- reactionIcon (str): Icon/Text to reaction\n>\t- thread_id (int | str): Group/User ID contain message to reaction\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendReaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_reaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_reaction(<messageObject>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendReaction -->\n\n</br>\n\n<!-- sendMultiReaction -->\n\n### Send Multiple Reactions\n\nThis function will Reaction multi message in thread (user/group) by ID.\n\n> - Args:\n>\t- reactionObj (MessageReaction): Message(s) data to reaction\n>\t- reactionIcon (str): Icon/Text to reaction\n>\t- thread_id (int | str): Group/User ID contain message to reaction\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendMultiReaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_multi_reaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_multi_reaction(<reactionObj>, <reactionIcon>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendMultiReaction -->\n\n</br>\n\n<!-- sendRemoteFile -->\n\n### Send Remote File\n\nThis function will Send File to a User/Group with url.\n\n> - Args:\n>\t- fileUrl (str): File url to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- fileName (str): File name to send\n>\t- fileSize (int): File size to send\n>\t- extension (str): type of file to send (py, txt, mp4, ...)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendRemoteFile(<fileUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_remote_file(<fileUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_remote_file(<fileUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendRemoteFile -->\n\n</br>\n\n<!-- sendRemoteVideo -->\n\n### Send Remote Video\n\nThis function will Send video to a User/Group with url.\n\n> - Args:\n>\t- videoUrl (str): Video link to send\n>\t- thumbnailUrl (str): Thumbnail link for video\n>\t- duration (int | str): Time for video (ms)\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- width (int): Width of the video\n>\t- height (int): Height of the video\n>\t- message (Message): ``Message Object`` to send with video\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendRemoteVideo(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_remote_video(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_remote_video(<videoUrl>, <thumbnailUrl>, <duration>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendRemoteVideo -->\n\n</br>\n\n<!-- sendRemoteVoice -->\n\n### Send Remote Voice\n\nThis function will Send voice to a User/Group with url.\n\n> - Args:\n>\t- voiceUrl (str): Voice link to send\n>\t- thread_id (int | str): User/Group ID to change status in\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- fileSize (int | str): Voice content length (size) to send\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendRemoteVoice(<voiceUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_remote_voice(<voiceUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_remote_voice(<voiceUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendRemoteVoice -->\n\n</br>\n\n<!-- sendLocalImage -->\n\n### Send Local Image\n\nThis function will Send Image to a User/Group with local file.\n\n> - Args:\n>\t- imagePath (str): Image directory to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- width (int): Image width to send\n>\t- height (int): Image height to send\n>\t- message (Message): ``Message Object`` to send with image\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendLocalImage(<imagePath>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendLocalImage(<imagePath>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_local_image(<imagePath>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_local_image(<imagePath>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendLocalImage -->\n\n</br>\n\n<!-- sendMultiLocalImage -->\n\n### Send Multiple Local Image\n\nThis function will Send Multiple Image to a User/Group with local file.\n\n> - Args:\n>\t- imagePathList (list): List image directory to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- width (int): Image width to send\n>\t- height (int): Image height to send\n>\t- message (Message): ``Message Object`` to send with image\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendMultiLocalImage(<imagePathList>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_multi_local_image(<imagePathList>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_multi_local_image(<imagePathList>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendMultiLocalImage -->\n\n</br>\n\n<!-- sendLocalGif -->\n\n### Send Local Gif\n\nThis function will Send Gif to a User/Group with local file.\n\n> - Args:\n>\t- gifPath (str): Gif path to send\n>\t- thumbnailUrl (str): Thumbnail of gif to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- gifName (str): Gif name to send\n>\t- width (int): Gif width to send\n>\t- height (int): Gif height to send\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendLocalGif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_local_gif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_local_gif(<gifPath>, <thumbnailUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendLocalGif -->\n\n</br>\n\n<!-- sendSticker -->\n\n### Send Sticker\n\nThis function will Send Sticker to a User/Group.\n\n> - Args:\n>\t- stickerType (int | str): Sticker type to send\n>\t- stickerId (int | str): Sticker id to send\n>\t- cateId (int | str): Sticker category id to send\n>\t- thread_id (int | str): User/Group ID to send to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendSticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_sticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_sticker(<stickerType>, <stickerId>, <cateId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendSticker -->\n\n</br>\n\n<!-- sendCustomSticker -->\n\n### Send Custom Sticker\n\nThis function will Send custom (static/animation) sticker to a User/Group with url.\n\n> - Args:\n>\t- staticImgUrl (str): Image url (png, jpg, jpeg) format to create sticker\n>\t- animationImgUrl (str): Static/Animation image url (webp) format to create sticker\n>\t- thread_id (int | str): User/Group ID to send sticker to.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- reply (int | str): Message ID to send stickers with quote\n>\t- width (int | str): Width of photo/sticker\n>\t- height (int | str): Height of photo/sticker\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendCustomSticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_custom_sticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_custom_sticker(<staticImgUrl>, <animationImgUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendCustomSticker -->\n\n</br>\n\n<!-- sendLink -->\n\n### Send Link\n\nThis function will Send link to a User/Group with url.\n\n> - Args:\n>\t- linkUrl (str): Link url to send\n>\t- title (str): Title for card to send\n>\t- thread_id (int | str): User/Group ID to send link to\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- thumbnailUrl (str): Thumbnail link url for card to send\n>\t- domainUrl (str): Main domain of Link to send (eg: github.com)\n>\t- desc (str): Description for card to send\n>\t- message (Message): ``Message Object`` to send with the link\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendLink(<linkUrl>, <title>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_link(<linkUrl>, <title>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_link(<linkUrl>, <title>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendLink -->\n\n</br>\n\n<!-- sendReport -->\n\n### Send Report\n\nThis function will Send report to Zalo.\n\n> - Args:\n>\t- thread_id (int | str): User/Group ID to report\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- reason (int): Reason for reporting\n>\t\t\t\n>\t\t- 1 = N\u1ed9i dung nh\u1ea1y c\u1ea3m\n>\t\t- 2 = L\u00e0m phi\u1ec1n\n>\t\t- 3 = L\u1eeba \u0111\u1ea3o\n>\t\t- 0 = custom\n>\t\t\t\n>\t- content (str): Report content (work if reason = custom)\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendReport(<thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendReport(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendReport(<thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendReport(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_report(<thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_report(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendReport -->\n\n</br>\n\n<!-- sendBusinessCard -->\n\n### Send Business Card\n\nThis function will Send business card to thread (user/group) by user ID.\n\n> - Args:\n>\t- userId (int | str): Business card user ID\n>\t- qrCodeUrl (str): QR Code link with business card profile information\n>\t- thread_id (int | str): User/Group ID to change status in\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n>\t- phone (int | str): Send business card with phone number\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.sendBusinessCard(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.send_business_card(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.send_business_card(<userId>, <qrCodeUrl>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END sendBusinessCard -->\n\n</br>\n\n<!-- setTypingStatus -->\n\n### Set Typing Status\n\nThis function will Set users typing status.\n\n> - Args:\n>\t- thread_id: User/Group ID to change status in.\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.setTyping(<thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.setTyping(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.setTyping(<thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.setTyping(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.set_typing(<thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.set_typing(<thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END setTypingStatus -->\n\n</br>\n\n<!-- markAsDelivered -->\n\n### Mark Message As Delivered\n\nThis function will Mark a message as delivered.\n\n> - Args:\n>\t- msgId (int | str): Message ID to set as delivered\n>\t- cliMsgId (int | str): Client message ID\n>\t- senderId (int | str): Message sender Id\n>\t- thread_id (int | str): User/Group ID to mark as delivered\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.markAsDelivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.mark_as_delivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.mark_as_delivered(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END markAsDelivered -->\n\n</br>\n\n<!-- markAsRead -->\n\n### Mark Message As Read\n\nThis function will Mark a message as read.\n\n> - Args:\n>\t- msgId (int | str): Message ID to set as delivered\n>\t- cliMsgId (int | str): Client message ID\n>\t- senderId (int | str): Message sender Id\n>\t- thread_id (int | str): User/Group ID to mark as read\n>\t- thread_type (ThreadType): ``ThreadType.USER``, ``ThreadType.GROUP``\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n bot.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</br>\n\n- Inside Module Function\n\n ```py\n self.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Outside Module Function\n\n ```py\n asyncio.run(bot.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await self.markAsRead(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n- Outside Module Function\n \n ```py\n asyncio.run(bot.mark_as_read(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>))\n ```\n\n</br>\n\n- Inside Module Function (You can use ``await`` instead.)\n\n ```py\n await bot.mark_as_read(<msgId>, <cliMsgId>, <senderId>, <thread_id>, <thread_type>)\n ```\n\n</details>\n\n<!-- END markAsRead -->\n\n</br>\n\n<!-- listen -->\n\n### Listen\n\nThis function will Initialize and runs the listening loop continually.\n\n> - Args:\n>\t- delay (int): Delay time for each message fetch for ``requests`` type (Default: 1)\n>\t- thread (bool): Handle messages within the thread for ``requests`` type (Default: False)\n>\t- type (str): Type of listening (Default: websocket)\n>\t- reconnect (int): Delay interval when reconnecting\n\n- Use Outside Of Function\n\n```py\nbot.listen()\n```\n\n<!-- END listen -->\n\n</br>\n\n<!-- onListening -->\n\n### On Listening\n\nThis function is called when the client is listening.\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n def onListening(self):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n async def onListening(self):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n\n- Outside Module Class\n\n ```py\n @bot.event\n async def on_listening():\n ....\n ```\n\n</details>\n\n<!-- END onListening -->\n\n</br>\n\n<!-- onMessage -->\n\n### On Message\n\nThis function is called when the client is listening, and somebody sends a message.\n\n> - Args:\n>\t- mid: The message ID\n>\t- author_id: The ID of the author\n>\t- message: The message content of the author\n>\t- message_object: The message (As a `Message` object)\n>\t- thread_id: Thread ID that the message was sent to.\n>\t- thread_type (ThreadType): Type of thread that the message was sent to.\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n async def onMessage(self, mid, author_id, message, message_object, thread_id, thread_type):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n> - In simple type, all event or register_handler functions use args with context.\n>\n> - Args Context Example:\n> - ctx.message_id\n> - ctx.author_id\n> - ctx.message\n> - ctx.message_object\n> - ctx.thread_id\n> - ctx.thread_type\n\n- Outside Module Class\n\n ```py\n @bot.event\n async def on_message(ctx):\n ....\n ```\n\n</details>\n\n<!-- END onMessage -->\n\n</br>\n\n<!-- onEvent -->\n\n### On Event\n\nThis function is called when the client listening, and some events occurred.\n\n> - Args:\n>\t- event_data (EventObject): Event data (As a `EventObject` object)\n>\t- event_type (EventType/GroupEventType): Event Type\n\n<details>\n<summary><b><i>Normal</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n def onEvent(self, event_data, event_type):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Async</b> code style</i></summary>\n\n- Inside Module Custom Class\n\n ```py\n async def onEvent(self, event_data, event_type):\n ....\n ```\n\n</details>\n\n<details>\n<summary><b><i>Simple</b> code style</i></summary>\n\n> - In simple type, all event or register_handler functions use args with context.\n>\n> - Args Context Example:\n> - ctx.event_data\n> - ctx.event_type\n\n- Outside Module Class\n\n ```py\n @bot.event\n async def on_event(ctx):\n ....\n ```\n\n</details>\n\n<!-- END onEvent -->\n\n</br>\n\n<!-- Messages -->\n\n### Messages\n\nRepresents a Zalo message.\n\n> - Args:\n> - text (str): The actual message\n> - style (MessageStyle/MultiMsgStyle): A ``MessageStyle`` or ``MultiMsgStyle`` objects\n> - mention (Mention/MultiMention): A ``Mention`` or ``MultiMention`` objects\n> - parse_mode (str): Format messages in ``Markdown``, ``HTML`` style\n\n```py\nMessage(text=<text>, mention=<mention>, style=<style>)\n```\n\n<!-- END Messages -->\n\n</br>\n\n<!-- MessageStyle -->\n\n### Message Style\n\nStyle for message.\n\n> - Args:\n> - offset (int): The starting position of the style. Defaults to 0.\n> - length (int): The length of the style. Defaults to 1.\n> - style (str): The type of style. Can be \"font\", \"bold\", \"italic\", \"underline\", \"strike\", or \"color\". Defaults to \"font\".\n> - color (str): The color of the style in hexadecimal format (e.g. \"ffffff\"). Only applicable when style is \"color\". Defaults to \"ffffff\".\n> - size (int | str): The font size of the style. Only applicable when style is \"font\". Defaults to \"18\".\n> - auto_format (bool): If there are multiple styles (used in ``MultiMsgStyle``) then set it to False. Default is True (1 style)\n\n- Example\n\n - **bold** style with offset is 5, length is 10.\n \n ```py\n style = MessageStyle(offset=5, length=10, style=\"bold\")\n ...\n ```\n \n </br>\n \n - color style with offset is 10, length is 5 and color=\"![#ff0000](https://placehold.co/20x15/ff0000/ff0000.png) `#ff0000`\"\n \n ```py\n style = MessageStyle(offset=10, ``length=5``, style=\"color\", color=\"ff0000\")\n ...\n ```\n \n </br>\n \n - font style with offset is 15, length is 8 and size=\"24\" (Customize font size to 24)\n \n ```py\n style = MessageStyle(offset=15, length=8, style=\"font\", size=\"24\")\n ...\n ```\n\n<!-- END MessageStyle -->\n\n</br>\n\n<!-- MultiMsgStyle -->\n\n### Multiple Message Style\n\nMultiple style for message.\n\n> - Args:\n> - listStyle (MessageStyle): A list of ``MessageStyle`` objects to be combined into a single style format.\n\n```py\nstyle = MultiMsgStyle([\n MessageStyle(offset=<text>, length=<mention>, style=<style>, color=<color>, size=<size>, auto_format=False),\n MessageStyle(offset=<text>, length=<mention>, style=<style>, color=<color>, size=<size>, auto_format=False),\n ...\n])\n```\n\n<!-- END MultiMsgStyle -->\n\n</br>\n\n<!-- Mention -->\n\n### Mention\n\nRepresents a @mention.\n\n> - Args:\n> - uid (str): The user ID to be mentioned.\n> - length (int): The length of the mention. Defaults to 1.\n> - offset (int): The starting position of the mention. Defaults to 0.\n> - auto_format (bool): If there are multiple mention (used in ``MultiMention``) then set it to False. Default is True (1 mention).\n\n```py\nmention = Mention(uid=<uid>, length=<length>, offset=<offset>)\n...\n```\n\n</br>\n\n- Mention user id *1234567890* with offset is 10 and length is 5.\n\n```py\nmention = Mention(\"1234567890\", length=5, offset=10)\n...\n```\n\n<!-- END Mention -->\n\n</br>\n\n<!-- MultiMention -->\n\n### Multiple Mention\n\nRepresents multiple @mentions.\n\n> - Args:\n> - listMention (Mention): A list of ``Mention`` objects to be combined into a single mention format.\n\n```py\nmention = MultiMention([\n Mention(uid=<uid>, length=<length>, offset=<offset>, auto_format=False),\n Mention(uid=<uid>, length=<length>, offset=<offset>, auto_format=False),\n ...\n])\n```\n\n</br>\n\n- Mention user id *1234567890* with offset is 10 and length is 5.\n- Mention user id *9876543210* with offset is 20 and length is 3.\n\n```py\nmention1 = Mention(\"1234567890\", length=5, offset=10)\nmention2 = Mention(\"9876543210\", length=3, offset=20)\nmention = MultiMention([mention1, mention2])\n```\n\n<!-- END MultiMention -->\n\n</br>\n\n## Example\n\nSee [examples](examples) folder to learn more about ``zlapi``.\n\n</br>\n\n## Acknowledgments\n\n- This project was originally inspired by [fbchat](https://github.com/fbchat-dev/fbchat).\n- listen ``websocket`` type taken from [zca-js](https://github.com/RFS-ADRENO/zca-js).\n\n- Thanks for support:\n - [Crow](https://t.me/crowmatacc) for Hosting.\n - [Duy Hoang](https://t.me/Tcp_API) for the Video Tutorial.\n - [Nguyen Hong Anh Duc](https://t.me/ducknha) for the Example.\n - [Khang Phan](https://www.facebook.com/khang.phan27.info) for help fix the ``listen`` function error.\n\n## Contact For Help\n\n- <img src=\"https://upload.wikimedia.org/wikipedia/commons/8/83/Telegram_2019_Logo.svg\" alt=\"Telegram Icon\" width=20 height=15/> Telegram: [Vexx](https://t.me/vrxx1337)\n- <img src=\"https://raw.githubusercontent.com/dheereshagrwal/colored-icons/master/public/logos/facebook/facebook.svg\" alt=\"Facebook Icon\" width=20 height=15/> Facebook: [L\u00ea Qu\u1ed1c Vi\u1ec7t](https://www.facebook.com/profile.php?id=100094031375075)\n",
"bugtrack_url": null,
"license": null,
"summary": "zlapi: Zalo API for Python",
"version": "1.0.3",
"project_urls": null,
"split_keywords": [
"python",
" zalo",
" api",
" zalo api",
" zalo chat",
" requests"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0b3e4994b4a517dc1bcd4c9e81942f23c6d1abbfe6649ceedbc2848cf894fabb",
"md5": "cdb3ac270deafa4548342bdc01b0905c",
"sha256": "888226c199cb3298116ad8ee4c15659cf52cd46c8fcf41a709f43420159fa888"
},
"downloads": -1,
"filename": "zlapi-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "cdb3ac270deafa4548342bdc01b0905c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 77467,
"upload_time": "2024-11-23T00:40:43",
"upload_time_iso_8601": "2024-11-23T00:40:43.067965Z",
"url": "https://files.pythonhosted.org/packages/0b/3e/4994b4a517dc1bcd4c9e81942f23c6d1abbfe6649ceedbc2848cf894fabb/zlapi-1.0.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f58983db0ffe3ac004aa54b50439b9f5bfb2f06e19b61977189fdc5819981b9a",
"md5": "313244b7557f05c49132ae532af79b28",
"sha256": "81ece21d411701a9a88272636785affb9bba2ef3f84d221e38295679116df815"
},
"downloads": -1,
"filename": "zlapi-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "313244b7557f05c49132ae532af79b28",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 95937,
"upload_time": "2024-11-23T00:40:44",
"upload_time_iso_8601": "2024-11-23T00:40:44.868191Z",
"url": "https://files.pythonhosted.org/packages/f5/89/83db0ffe3ac004aa54b50439b9f5bfb2f06e19b61977189fdc5819981b9a/zlapi-1.0.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-23 00:40:44",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "zlapi"
}