webex bot creation framework and tools via pip install webexbotsdk
webexbotsdk
Contributing
webexbotsdk.teams
#EG | #API | A framework for creating a Webex Teams bot with automatic ngrok setup
^ EG
configure with config.json
{
"botAccessToken": "", // (required) create a bot at https://developer.webex.com/my-apps
"port": 8080, // local server port
"botName": "", // give it a unique identifier (ex. mybot)
"encryptDb": false, // encrypts local json db
"botDbKey": "", // key used when 'encryptDb' is true
"ngrokAuthToken": "", // not recommended unless using a paid tier
"disableDb": false // disable tinydb
}quick start
from webexbotsdk.teams import Bot
bot = Bot()
@bot.hears(r'hi|hello')
def hears_hi(message, data):
person = bot.api.people.get(message.personId)
return bot.api.messages.create(
roomId = message.roomId,
text = f"Hi {person.displayName}"
)
bot.setup('config.json')
bot.run()with class inheritence
from webexbotsdk.teams import Bot, sdk
class HiBot(Bot):
def say_hi(self, replyTo: sdk.Message) -> sdk.Message:
person:sdk.Person = self.api.people.get(replyTo.personId)
return self.api.messages.create(
roomId=replyTo.roomId,
text=f"Hi {person.displayName}"
)
hibot = HiBot()
@hibot.hears(r'hi|hello')
def hears_hi(message:sdk.Message, data):
hibot.say_hi(message)
hibot.setup('config.json')
hibot.run()webexteamssdk is included
from webexbotsdk.teams import Bot
bot = Bot()
all_rooms = bot.api.rooms.list()
demo_rooms = [room for room in all_rooms if 'webexteamssdk Demo' in room.title]local DB with TinyDB to remember things even after the bot is restarted
from webexbotsdk.teams import Bot
from webexbotsdk.tinydb import where
bot = Bot()
@bot.hears(r'remember (\d+)')
def hears_remember(message, data):
number = int(data['groups'][0][0])
bot.db.table('stuff').upsert(
{ 'personId':message.personId, 'number':number },
(where('personId') == message.personId) & (where('number') == number)
)
@bot.hears('recall')
def hears_recall(message, data):
docs = bot.db.table('stuff').search(where('personId') == message.personId)
bot.api.messages.create(
roomId=message.roomId,
text=f"I remember {', '.join([str(doc['number']) for doc in docs])}" if len(docs) > 0
else 'No numbers stored yet'
)
bot.setup('config.json')
bot.run()use dataclasses to type check DB documents
from webexbotsdk.teams import Bot
from webexbotsdk.tinydb import where, dataclass, BotDoc
bot = Bot()
@dataclass
class Number(BotDoc):
personId:str
number:int
doc_id = bot.db.table('stuff').insert(Number(personId='asdf', number=14).dict())
docs = [Number(**doc) for doc in bot.db.table('stuff').get(doc_id=doc_id)]
bot.setup('config.json')
bot.run()^ API
class Bot
props
app Bottle local server for teams webhooks
api WebexTeamsAPI will be abbreviated as teams in this doc
db TinyDB
log python 3 Logger
methods
setup(config:dict)
setup(path:str)configure Bot using a python dict or a filepath to a json config
table(name:str) -> TinyDB.Tableretrieve tinydb table
run()start the bot local server
send_card(roomId:str, card:teams.AdaptiveCard) -> teams.Messagemention(person:teams.Person|teams.Membership) -> str
mention(personId:str, displayName:str) -> str(BROKEN) returns a formatted string for mentioning a user in a message
bot.api.message.create(text = f"hello {bot.mention(person)}")
send_help(source:teams.Message) -> teams.Messagereply to a message with help text which includes
- commands the bot recognizes
- command descriptions
hears(regex:str|list[str]|Pattern, name:str=None, description:str=None)@decorator, listen for user giving the bot with a command
on(resource:str, event:str = None)@decorator, listen for other resource events
webexbotsdk.util
#API | Framework helper methods
^ API
methods
is_bot(person:teams.Person|teams.Membership) -> booldetermine whether a person is a human or bot
webexbotsdk.tinydb
^TOC | @DOCS | TinyDB library
Contributing
Create an Issue to:
- Ask a question
- Request a feature
- Report a bug
File a complaint
Pull requests from branches/forks are also welcome! I will try to respond to them ASAP.