Skip to main content

pywgb

PyPI version Python versions codecov License: MIT

Wecom (WeChat Work) Group Bot Python API - A comprehensive and easy-to-use library for sending messages to Wecom group bots.

✨ Features

  • 🤖 Smart Bot - Automatic message type detection
  • 📝 Multiple Message Types - Text, Markdown (v1 & v2), Images, Files, Voice, News, Template Cards
  • 🎨 Rich Formatting - Colored text, tables, lists, code blocks
  • 🔒 Rate Limiting - Built-in overheat detection (20 msg/min)
  • ✅ Type Hints - Full type annotation support
  • 🧪 Well Tested - 100% test coverage
  • 📚 Comprehensive Docs - Detailed documentation and examples

📦 Installation

# Basic installation (text, markdown, images, news, cards)
pip install pywgb

# Full installation (includes voice message support with pydub)
pip install "pywgb[all]"

Requirements: Python 3.8+

🚀 Quick Start

1. Get Your Webhook Key

  1. Create a Wecom Group Bot
  2. Copy the webhook URL or just the key (UUID format):
    • Full URL: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR-UUID-KEY
    • Or just: YOUR-UUID-KEY

2. Send Your First Message

from pywgb import SmartBot

# Initialize bot with your key
bot = SmartBot("YOUR-UUID-KEY")

# Send a simple text message
bot.send("Hello, World!")

That's it! 🎉

📖 Usage Guide

Text Messages

from pywgb import SmartBot

bot = SmartBot("YOUR-KEY")

# Simple text
bot.send("This is a text message")

# Text with @mentions
bot.send(
    "Important announcement!",
    mentioned_list=["userid1", "@all"],  # @all mentions everyone
    mentioned_mobile_list=["13800138000"]
)

Markdown Messages

Markdown v1 (with colored text)

# Colored text (unique feature!)
status = bot.markdown_feature.green("Online")
warning = bot.markdown_feature.orange("High Load")
info = bot.markdown_feature.gray("Last updated: 2026-01-16")

markdown = f"""
# Server Status Report

**Status**: {status}  
**Warning**: {warning}  
**Info**: {info}

> For more details, visit [Dashboard](https://example.com)

Inline `code` example
"""

bot.send(markdown)

Supported syntax: Titles (H1-H6), Bold, Links, inline code, > quotes, colored text

Markdown v2 (with tables and more)

# Create a table
data = [
    ["Name", "Status", "Score"],
    ["Alice", "Active", "95"],
    ["Bob", "Inactive", "87"],
    ["Charlie", "Active", "92"]
]

markdown_v2 = f"""
# Team Performance

{bot.markdown_feature.list2table(data)}

## Notes
- *Important*: Review pending
- **Deadline**: 2026-01-20

> Main objective
>> Sub-objective

---

```python
def hello():
    print("Hello!")

bot.send(markdown_v2)


**Additional syntax**: *Italics*, multi-level lists, tables, images, code blocks, horizontal rules

> **Note**: Markdown v2 does NOT support colored text. Choose v1 for colors, v2 for tables.

### Images

```python
# Supported formats: PNG, JPG (max 2MB)
bot.send(file_path="screenshot.png")

Voice Messages

# Requires full installation: pip install "pywgb[all]"
# Format: AMR only (max 2MB, max 60 seconds)
bot.send(file_path="audio.amr")

Files

# Any file format (5B < size < 20MB)
bot.send(file_path="document.pdf")

News Articles

articles = [
    {
        "title": "Breaking News",
        "description": "Important update",
        "url": "https://example.com/article",
        "picurl": "https://example.com/image.jpg"
    },
    # ... up to 8 articles
]

bot.send(articles=articles)

Template Cards

Text Card

bot.send(
    main_title={"title": "Deployment Notification", "desc": "Production environment"},
    emphasis_content={"title": "SUCCESS", "desc": "Status"},
    sub_title_text="Deployed by: DevOps Team",
    horizontal_content_list=[
        {"keyname": "Version", "value": "v2.1.0"},
        {"keyname": "Time", "value": "2026-01-16 15:00"}
    ],
    card_action={"type": 1, "url": "https://example.com/details"}
)

News Card

bot.send(
    main_title={"title": "System Alert", "desc": "Monitoring report"},
    card_image={"url": "https://example.com/chart.png", "aspect_ratio": 2.25},
    image_text_area={
        "type": 1,
        "url": "https://example.com",
        "title": "CPU Usage Alert",
        "desc": "Current usage: 85%",
        "image_url": "https://example.com/icon.png"
    },
    card_action={"type": 1, "url": "https://example.com/dashboard"}
)

🔧 Advanced Usage

Upload Temporary Media

# Upload file and get media_id (valid for 3 days)
media_id = bot.upload("document.pdf")
print(f"Media ID: {media_id}")

Use Specific Bot Types

from pywgb.bot import TextBot, MarkdownBot, ImageBot, FileBot

# Use specific bot for better control
text_bot = TextBot("YOUR-KEY")
text_bot.send("Specific text message")

# Send image as file (instead of image message)
file_bot = FileBot("YOUR-KEY")
file_bot.send(file_path="image.png")  # Sent as file, not image

⚠️ Limitations

Type Limit
Rate Limit 20 messages/minute per bot
Text Max 2048 bytes (UTF-8)
Markdown Max 4096 bytes (UTF-8)
Image PNG/JPG, max 2MB
Voice AMR only, max 2MB, max 60s
File 5B - 20MB
News Max 8 articles per message

Rate Limiting: The library automatically handles rate limits with cooldown detection. When limit is exceeded, it waits and retries automatically.

📚 Documentation

Build Documentation

pip install "pywgb[docs]"
cd docs && make html
open _build/html/index.html

🧪 Development

Run Tests

# Install dev dependencies
pip install -e ".[test]"

# Run tests with coverage
pytest --cov=src/pywgb --cov-report=html -v

# View coverage report
open htmlcov/index.html

Code Quality

  • Test Coverage: 100%
  • Type Hints: Full support
  • Code Style: PEP 8 compliant
  • Documentation: Sphinx with Google-style docstrings

🗺️ Roadmap

  • v0.0.1-0.0.5: Initial release with basic message types
  • v0.0.6-0.0.9: Add template cards and refactoring
  • v0.1.0-0.1.2: Add SmartBot with auto-detection
  • v1.0.0-1.0.4: Stable release with full features
  • v1.1.0: Performance optimizations (in progress)
  • v1.2.0: Enhanced documentation and examples
  • v2.0.0: Async support and additional features

See NEXT_STEPS.md for detailed improvement plans.

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

👤 Author

Rex Zhou

🙏 Acknowledgments

  • Thanks to Tencent for providing the Wecom Group Bot API
  • Inspired by the need for a simple, Pythonic interface to Wecom bots

Star ⭐ this repo if you find it helpful!

Metadata

Release files for pywgb 1.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pywgb 1.0.5
File Size Uploaded Provenance Actions
pywgb-1.0.5.tar.gz 36.7 kB With provenance Details for pywgb-1.0.5.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pywgb 1.0.5
File Interpreter ABI Platform Actions
pywgb-1.0.5-py3-none-any.whl Python 3 none any Details for pywgb-1.0.5-py3-none-any.whl

Total release size: 77.0 kB

Release files / pywgb-1.0.5.tar.gz

Download URL pywgb-1.0.5.tar.gz
Size 36.7 kB
Tags Source
SHA-256 checksum
How to use checksums
13620c2c8e06eb104d014bef46ed4911325cf1ce016cd472da6be6d824f34719
BLAKE2b-256 checksum
How to use checksums
23193b70ddc0dd5053d5200aa7d568562e902973b165a922c2055837a3096306
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 19, 2026.

Transparency log

Release files / pywgb-1.0.5-py3-none-any.whl

Download URL pywgb-1.0.5-py3-none-any.whl
Size 40.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b1b1f8cb1e8afabb673f2807fc19d7ba9637ecca06761d3bf440f549f170684e
BLAKE2b-256 checksum
How to use checksums
95b4c562291f60251fb50141723bb70efdf1e89cce9cd1eaca9f389987670c90
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 19, 2026.

Transparency log

Security for pywgb 1.0.5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pywgb-1.0.5.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page