zgram


Namezgram JSON
Version 1.0.0 PyPI version JSON
download
home_pagehttps://ojoll.com
Summaryzgram is a robot framework based on Telegram Bot API, with plug-in system, easy to extend.
upload_time2022-12-22 23:51:07
maintainer
docs_urlNone
authorPluto
requires_python>=3.7
licenseGPLv3
keywords zgram telegram bot telegram bot api telegram
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## 框架更新了我还没同步过来 大的结构会有变化 三天之内全部修改完 我说的  耶稣也拦不住我(更新完了)

## 新手安装教程请看
https://southcat.net/2526/

## 插件必看
喵帕斯的已经没了 自动补码是喵帕斯的  需要dlercloud的请把updatacode目录下的dlercloud.py文件名修改为updatacode.py覆盖掉源文件,需要其他的自己修改或是可以找我
我有时间就做一个 马上放假了时间多的是

## 第一次开发有问题及时反馈
email:admin@southcat.net

博客:[南猫](https://southcat.net)

基于[zgram](https://github.com/plutobell/zgram)开源项目开发。

## 增加功能

1.邀请码自动发码模块 并且限制领取数量(邀请码添加在invite_code目录下的code.txt 一行一个)

2.邀请码数量统计,如果邀请码用完自动给管理员发消息(需自行修改len_invite.py里面的发送id)

3.补码模块已经开发 指令`/add_code邀请码`   请注意一行一码因为太菜要求比较严格 可能效果不是很理想,请等我再去学两天python再回来改

4.删除用户信息模块,删除后用户可以再次获取邀请码指令`/del用户id`目前只能删除单个用户

5.updatacode模块,目前仅支持从喵帕斯进行获取,会自动抓取邀请码页面前两页的邀请码,并和之前的数据进行对比,然后写入code,后续会支持更多网站
理论上所有和喵帕斯同模板的都可以使用,请在updatacode/updatacode.py 文件夹内填入你的账号密码

6.很遗憾喵关门了 在plguins/updatacode文件夹下更新了dlercloud的自动更新模块,需要使用的话备份原文件,将文件名修改为updatacode.py即可,理论上喵帕斯的补码支持所有同模板的网站只需要更改里面的网站即可,接下来会针对所有有邀请码模块的网站开发补码模块,或是你们也可以从邮箱或是tg发给我网站,我尽量进行适配(放假闲的)
## 开发计划
1.增加管理员添加邀请码模块

2.多类邀请码模块支持

3.代码优化,目前存在大量多余的代码

4.添加白名单,白名单用户支持无限获取

环境要求
Python版本
zgram 只支持 Python3.x,不支持Python2.x。

本项目在 Python 3.5 及以上版本测试通过。

安装
pip install zgram
升级
pip install zgram --upgrade
使用
一行命令启动 (Polling Mode)
zgram -c/--config <config file path> -k/--key <bot key> -r/--root <your user id>
此命令会自动生成在Polling模式下适用的配置文件,但仍需手动配置插件路径。

一、运行模式
zgram 支持以 Webhook 模式和 Polling 模式运行。生产环境推荐使用 Webhook 模式,而 Polling 则仅用于开发环境。

1、Webhook 模式
要以 Webhook 模式运行,请将配置文件字段 webhook 设置为 True ,此模式涉及的配置文件字段如下:

[config]
webhook=True
self_signed=False
cert_key=your private cert path
cert_pub=your public cert path
server_address=your server ip address or domain
server_port=your server port
local_address=webhook local address
local_port=webhook local port
self_signed 用于设置是否使用自签名证书,而 cert_key 和 cert_pub 则是你的证书路径(绝对路径),server_address 为你的服务器公网IP, server_port 为服务器的端口(目前 telegram 官方仅支持 443, 80, 88, 8443),local_address 为Webhook 本地监听地址, local_port 为 Webhook 本地运行的端口。

推荐搭配 nginx 使用,自签名证书生成请参考:Generating a self-signed certificate pair (PEM)

2、Polling 模式
要以 Polling 模式运行,只需要保证配置文件 webhook 字段为 False 即可。此模式最基本的配置文件如下:

[config]
key=bot key
pool_size=40
webhook=False
root_id=your user id
debug=False
plugin_dir=your plugin dir
二、运行
任意路径打开终端,输入以下命令:

对于使用程序配置文件默认路径的:

输入zgram 回车,正常情况下你应该能看见屏幕提示机器人开始运行。

对于命令行手动指定配置文件路径的:

输入zgram -c/--config <configure file path> 回车,正常情况下你应该能看见屏幕提示机器人开始运行。(更多指令请通过 -h/--help 查看)

可配合supervisor使用。

三、配置文件
完整的配置文件如下所示:

[config]
key=bot key
plugin_dir=your plugin dir
pool_size=40 //the thread pool size, default 40, range(1, 101)
webhook=False
self_signed=False //Optional while webhook is False
cert_key=your private cert path //Optional while webhook is False
cert_pub=your public cert path //Optional while webhook is False
server_ip=your server ip address //Optional while webhook is False
server_port=your server port //Optional while webhook is False
local_address=webhook local address //Optional while webhook is False
local_port=webhook local port //Optional while webhook is False
root_id=your user id
debug=False
drop_pending_updates=False
local_api_server=local api server address //[Optional]
在 1.13.0 及以上版本,支持自动生成配置文件。(默认为Polling模式)

1.在命令行未指定配置文件路径的情况下,会在默认配置文件路径下不存在配置文件时自动生成配置文件 config.cfg。

在Linux下,会自动在用户目录下创建文件夹 .zgram ,并生成配置文件 config.cfg

在Windows下,则会在 C:\Users\<username> 目录下创建文件夹 .zgram ,并生成配置文件 config.cfg

2.指定配置文件

Linux 和 Windows 都可在命令行通过参数手动指定配置文件路径,命令格式:

zgram -c/--config <configure file path>
路径必须为绝对路径,此情况下也会在指定路径上不存在配置文件时自动生成配置文件 ,配置文件命名由指定的路径决定。

Tip: 自动生成的配置文件未设置这几个字段值:key、root_id、plugin_dir,key 和 root_id 为必须,但我们仍然可以通过命令行设置他们:

zgram -c/--config <config file path> -k/--key <bot key> -r/--root <your user id>
使用以上命令会以Polling模式运行框架,而无需困扰于处理配置文件。

之后请手动设置 plugin_dir 。

插件开发指南 (以 Hello 插件为例) BETA 0.8
一、插件结构
一个完整的 zgram 插件应当呈现为一个文件夹,即一个Python包,以 Hello 插件为例,最基本的目录结构如下:

Hello/
  ./__init__.py
  ./Hello.py
  ./Hello_screenshot.png
  ./readme.md
  ./requirement.txt
二、规则
命名
在构建zgram插件中应当遵守的规则是:每个插件目录下应当存在一个与插件同名的.py 文件,比如插件 Hello 中的 Hello.py 文件,并且此文件中必须存在作为插件入口的同名函数,以插件 Hello 为例:

#file Hello/Hello.py

# -*- coding:utf-8 -*-

def Hello(bot, message):
    pass
函数 Hello() 即为插件的入口函数,参数 bot 为Bot接口库实例化对象,参数 message 用于接收消息数据。

资源路径
若要打开某个插件目录下的文件资源,需要使用的路径应当遵循以下的格式:

bot.path_converter(bot.plugin_dir + "<plugin dir name>/<resource address>")
方法 path_converter 根据操作系统转换路径格式。

三、自定义触发指令
插件指令
插件的触发指令可不同于插件名,允许自定义。以插件 Hello 为例,触发指令为 /helloworld 而不是 Hello。

修改插件目录下的 __init__.py 文件设置触发指令:

#file Hello/__init__.py

#/helloworld
#Hello World插件例子
第一行为触发指令,默认以 / 作为前缀;第二行为插件简介。

不用作插件的特殊情况
通常情况下,位于 plugins 目录下的所有包都将被识别为插件并自动加载到 zgram 中。但在某些情况下,存在并不用作插件而只是多个插件共用包的情况,若想该包不被 zgram 加载,请将触发指令设置为 ~~ 。以 tools 共用包为例, __init__.py 文件内容如下:

#fille tools/__init__.py

#~~
#tools 包的简介
建议用作插件的包名遵守 Pascal命名法,即每个单词的首字母大写;而不用做插件的包名使用全小写的包名,每个单词之间以_ 分隔。以区分 插件包 和 非插件包 :

- plugins
  - Menu    #插件包
  - tools   #非插件包
四、插件模板创建工具
在 v1.9.20_dev 及以上版本,可以通过命令行指令一键创建插件模板。

zgram -p/--plugin <plugin name>
该指令会使用框架配置文件(config.cfg)中的插件路径作为所创建插件模板的存放路径。

五、周期性任务
在 v1.11.1 及以上版本,可以创建周期性任务,功能类似循环定时器。

可获得的方法:

schedule.add : 添加任务
schedule.delete : 移除任务
schedule.find : 查找任务
schedule.clear : 清空任务池
schedule.status : 查看任务池状态
例:

ok, uid = bot.schedule.add(gap, event, (bot, ))
ok, uid = bot.schedule.delete(uid)
ok, uid = bot.schedule.find(uid)
ok, uid = bot.schedule.clear()
ok, uid = bot.schedule.status()
周期性任务池的大小为全局线程池的三分之一 ,线程池大小则可通过配置文件指定。
1.克隆或点击下载本项目到本地,保证本机安装有`Python3.x`版本和包`requests` ;



2.`config.cfg` 配置文件

配置文件格式:

```python
[config]
key=your key
pool_size=40 //the thread pool size, default 40, range(1, 101)
webhook=False
cert_pub=your public certificate dir //Optional while webhook is False
server_ip=your server ip address //Optional while webhook is False
server_port=your server port //Optional while webhook is False
local_address=webhook local address //Optional while webhook is False
local_port=webhook local port //Optional while webhook is False
root=your user id
debug=False
timeout=60
plugin_dir=your plugin dir   //[Optional]
```

* Linux

在 `/root` 目录下创建文件夹 `.zgram` ,并在其内新建配置文件 `config.cfg` ,按照上面的格式填写配置文件

* Windows

在 `C:\Users\<username>`  目录下创建文件夹 `.zgram` ,并在其内新建配置文件 `config.cfg` ,按照上面的格式填写配置文件

* 指定配置文件

Linux 和 Windows 都可在命令行通过参数手动指定配置文件路径,命令格式:

```
python -m zgram -c/-C <configure file path>
```

路径必须为绝对路径。



3.运行

终端下进入zgram文件夹所在目录。

* 对于使用程序配置文件默认路径的:

  输入`python -m zgram` 回车,正常情况下你应该能看见屏幕提示机器人开始运行。

* 对于命令行手动指定配置文件路径的:

  输入`python -m zgram -c/-C <configure file path>` 回车,正常情况下你应该能看见屏幕提示机器人开始运行。



#### 三、Pip安装运行

##### 安装 #####

* 确保本机Python环境拥有pip包管理工具。

* 在本项目Releases页面下载包文件。

* 本机命令行进入包文件所在目录,执行:

  ```
  pip install <zgram package file name>
  
  or
  
  pip3 install <zgram package file name>
  ```

由于API未封装完毕,暂未上传至 `PyPI` ,故不能在线安装,望谅解。

##### 运行 #####

任意路径打开终端,输入以下命令:

- 对于使用程序配置文件默认路径的:

  输入`zgram` 回车,正常情况下你应该能看见屏幕提示机器人开始运行。

- 对于命令行手动指定配置文件路径的:

  输入`zgram -c/-C <configure file path>` 回车,正常情况下你应该能看见屏幕提示机器人开始运行。



可配合`supervisor`使用。





## 插件开发指南 (以 Hello 插件为例) BETA 0.6

#### 一、插件结构

一个完整的 `zgram` 插件应当呈现为一个文件夹,即一个Python包,以 `Hello` 插件为例,最基本的目录结构如下:

```Python
Hello/
  ./__init__.py
  ./Hello.py
  ./Hello_screenshot.png
  ./readme.md
```

#### 二、规则

##### 命名

在构建zgram插件中应当遵守的规则是:每个插件目录下应当存在一个与插件同名的`.py` 文件,比如插件 `Hello ` 中的 `Hello.py` 文件,并且此文件中必须存在作为插件入口的同名函数,以插件 `Hello` 为例:

```python
#file Hello/Hello.py

# -*- coding:utf-8 -*-

def Hello(bot, message):
    pass
```

函数 `Hello()` 即为插件的入口函数,参数 `bot` 为Bot接口库实例化对象,参数 `message` 用于接收消息数据。





##### 资源路径

若要打开某个插件目录下的文件资源,需要使用的路径应当遵循以下的格式:

```python
bot.plugin_dir + "<plugin dir name>/<resource address>"
```

#### 三、自定义触发指令

##### 插件指令

插件的触发指令可不同于插件名,允许自定义。以插件 `Hello` 为例,触发指令为 `/helloworld` 而不是 `Hello`。

修改插件目录下的 `__init__.py` 文件设置触发指令:

```python
#file Hello/__init__.py

#/helloworld
#Hello World插件例子
```

第一行为触发指令,默认以 `/`  作为前缀;第二行为插件简介。



##### 不用作插件的特殊情况

通常情况下,位于 `plugins` 目录下的所有包都将被识别为插件并自动加载到 `zgram` 中。但在某些情况下,存在并不用作插件而只是多个插件共用包的情况,若想该包不被 `zgram` 加载,请将触发指令设置为 `~~`  。以 `tools` 共用包为例, `__init__.py` 文件内容如下:

```python
#fille tools/__init__.py

#~~
#tools 包的简介
```

建议用作插件的包名遵守 `Pascal命名法`,即每个单词的首字母大写;而不用做插件的包名使用全小写的包名,每个单词之间以`_`  分隔。以区分 `插件包` 和 `非插件包` :

```python
- plugins
  - Menu    #插件包
  - tools   #非插件包
```



            

Raw data

            {
    "_id": null,
    "home_page": "https://ojoll.com",
    "name": "zgram",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "zgram telegram bot telegram bot api telegram",
    "author": "Pluto",
    "author_email": "hi@ojoll.com",
    "download_url": "https://files.pythonhosted.org/packages/2d/63/89f181773c4b0ae8ed3432fad690693737a7cf2acffb76ab6c1499b74061/zgram-1.0.0.tar.gz",
    "platform": null,
    "description": "## \u6846\u67b6\u66f4\u65b0\u4e86\u6211\u8fd8\u6ca1\u540c\u6b65\u8fc7\u6765 \u5927\u7684\u7ed3\u6784\u4f1a\u6709\u53d8\u5316 \u4e09\u5929\u4e4b\u5185\u5168\u90e8\u4fee\u6539\u5b8c \u6211\u8bf4\u7684  \u8036\u7a23\u4e5f\u62e6\u4e0d\u4f4f\u6211(\u66f4\u65b0\u5b8c\u4e86)\r\n\r\n## \u65b0\u624b\u5b89\u88c5\u6559\u7a0b\u8bf7\u770b\r\nhttps://southcat.net/2526/\r\n\r\n## \u63d2\u4ef6\u5fc5\u770b\r\n\u55b5\u5e15\u65af\u7684\u5df2\u7ecf\u6ca1\u4e86 \u81ea\u52a8\u8865\u7801\u662f\u55b5\u5e15\u65af\u7684  \u9700\u8981dlercloud\u7684\u8bf7\u628aupdatacode\u76ee\u5f55\u4e0b\u7684dlercloud.py\u6587\u4ef6\u540d\u4fee\u6539\u4e3aupdatacode.py\u8986\u76d6\u6389\u6e90\u6587\u4ef6\uff0c\u9700\u8981\u5176\u4ed6\u7684\u81ea\u5df1\u4fee\u6539\u6216\u662f\u53ef\u4ee5\u627e\u6211\r\n\u6211\u6709\u65f6\u95f4\u5c31\u505a\u4e00\u4e2a \u9a6c\u4e0a\u653e\u5047\u4e86\u65f6\u95f4\u591a\u7684\u662f\r\n\r\n## \u7b2c\u4e00\u6b21\u5f00\u53d1\u6709\u95ee\u9898\u53ca\u65f6\u53cd\u9988\r\nemail:admin@southcat.net\r\n\r\n\u535a\u5ba2:[\u5357\u732b](https://southcat.net)\r\n\r\n\u57fa\u4e8e[zgram](https://github.com/plutobell/zgram)\u5f00\u6e90\u9879\u76ee\u5f00\u53d1\u3002\r\n\r\n## \u589e\u52a0\u529f\u80fd\r\n\r\n1.\u9080\u8bf7\u7801\u81ea\u52a8\u53d1\u7801\u6a21\u5757 \u5e76\u4e14\u9650\u5236\u9886\u53d6\u6570\u91cf\uff08\u9080\u8bf7\u7801\u6dfb\u52a0\u5728invite_code\u76ee\u5f55\u4e0b\u7684code.txt \u4e00\u884c\u4e00\u4e2a\uff09\r\n\r\n2.\u9080\u8bf7\u7801\u6570\u91cf\u7edf\u8ba1\uff0c\u5982\u679c\u9080\u8bf7\u7801\u7528\u5b8c\u81ea\u52a8\u7ed9\u7ba1\u7406\u5458\u53d1\u6d88\u606f\uff08\u9700\u81ea\u884c\u4fee\u6539len_invite.py\u91cc\u9762\u7684\u53d1\u9001id\uff09\r\n\r\n3.\u8865\u7801\u6a21\u5757\u5df2\u7ecf\u5f00\u53d1 \u6307\u4ee4`/add_code\u9080\u8bf7\u7801`   \u8bf7\u6ce8\u610f\u4e00\u884c\u4e00\u7801\u56e0\u4e3a\u592a\u83dc\u8981\u6c42\u6bd4\u8f83\u4e25\u683c \u53ef\u80fd\u6548\u679c\u4e0d\u662f\u5f88\u7406\u60f3\uff0c\u8bf7\u7b49\u6211\u518d\u53bb\u5b66\u4e24\u5929python\u518d\u56de\u6765\u6539\r\n\r\n4.\u5220\u9664\u7528\u6237\u4fe1\u606f\u6a21\u5757\uff0c\u5220\u9664\u540e\u7528\u6237\u53ef\u4ee5\u518d\u6b21\u83b7\u53d6\u9080\u8bf7\u7801\u6307\u4ee4`/del\u7528\u6237id`\u76ee\u524d\u53ea\u80fd\u5220\u9664\u5355\u4e2a\u7528\u6237\r\n\r\n5.updatacode\u6a21\u5757\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u4ece\u55b5\u5e15\u65af\u8fdb\u884c\u83b7\u53d6\uff0c\u4f1a\u81ea\u52a8\u6293\u53d6\u9080\u8bf7\u7801\u9875\u9762\u524d\u4e24\u9875\u7684\u9080\u8bf7\u7801\uff0c\u5e76\u548c\u4e4b\u524d\u7684\u6570\u636e\u8fdb\u884c\u5bf9\u6bd4\uff0c\u7136\u540e\u5199\u5165code\uff0c\u540e\u7eed\u4f1a\u652f\u6301\u66f4\u591a\u7f51\u7ad9\r\n\u7406\u8bba\u4e0a\u6240\u6709\u548c\u55b5\u5e15\u65af\u540c\u6a21\u677f\u7684\u90fd\u53ef\u4ee5\u4f7f\u7528\uff0c\u8bf7\u5728updatacode/updatacode.py \u6587\u4ef6\u5939\u5185\u586b\u5165\u4f60\u7684\u8d26\u53f7\u5bc6\u7801\r\n\r\n6.\u5f88\u9057\u61be\u55b5\u5173\u95e8\u4e86 \u5728plguins/updatacode\u6587\u4ef6\u5939\u4e0b\u66f4\u65b0\u4e86dlercloud\u7684\u81ea\u52a8\u66f4\u65b0\u6a21\u5757\uff0c\u9700\u8981\u4f7f\u7528\u7684\u8bdd\u5907\u4efd\u539f\u6587\u4ef6\uff0c\u5c06\u6587\u4ef6\u540d\u4fee\u6539\u4e3aupdatacode.py\u5373\u53ef\uff0c\u7406\u8bba\u4e0a\u55b5\u5e15\u65af\u7684\u8865\u7801\u652f\u6301\u6240\u6709\u540c\u6a21\u677f\u7684\u7f51\u7ad9\u53ea\u9700\u8981\u66f4\u6539\u91cc\u9762\u7684\u7f51\u7ad9\u5373\u53ef\uff0c\u63a5\u4e0b\u6765\u4f1a\u9488\u5bf9\u6240\u6709\u6709\u9080\u8bf7\u7801\u6a21\u5757\u7684\u7f51\u7ad9\u5f00\u53d1\u8865\u7801\u6a21\u5757\uff0c\u6216\u662f\u4f60\u4eec\u4e5f\u53ef\u4ee5\u4ece\u90ae\u7bb1\u6216\u662ftg\u53d1\u7ed9\u6211\u7f51\u7ad9\uff0c\u6211\u5c3d\u91cf\u8fdb\u884c\u9002\u914d\uff08\u653e\u5047\u95f2\u7684\uff09\r\n## \u5f00\u53d1\u8ba1\u5212\r\n1.\u589e\u52a0\u7ba1\u7406\u5458\u6dfb\u52a0\u9080\u8bf7\u7801\u6a21\u5757\r\n\r\n2.\u591a\u7c7b\u9080\u8bf7\u7801\u6a21\u5757\u652f\u6301\r\n\r\n3.\u4ee3\u7801\u4f18\u5316\uff0c\u76ee\u524d\u5b58\u5728\u5927\u91cf\u591a\u4f59\u7684\u4ee3\u7801\r\n\r\n4.\u6dfb\u52a0\u767d\u540d\u5355\uff0c\u767d\u540d\u5355\u7528\u6237\u652f\u6301\u65e0\u9650\u83b7\u53d6\r\n\r\n\u73af\u5883\u8981\u6c42\r\nPython\u7248\u672c\r\nzgram \u53ea\u652f\u6301 Python3.x\uff0c\u4e0d\u652f\u6301Python2.x\u3002\r\n\r\n\u672c\u9879\u76ee\u5728 Python 3.5 \u53ca\u4ee5\u4e0a\u7248\u672c\u6d4b\u8bd5\u901a\u8fc7\u3002\r\n\r\n\u5b89\u88c5\r\npip install zgram\r\n\u5347\u7ea7\r\npip install zgram --upgrade\r\n\u4f7f\u7528\r\n\u4e00\u884c\u547d\u4ee4\u542f\u52a8 (Polling Mode)\r\nzgram -c/--config <config file path> -k/--key <bot key> -r/--root <your user id>\r\n\u6b64\u547d\u4ee4\u4f1a\u81ea\u52a8\u751f\u6210\u5728Polling\u6a21\u5f0f\u4e0b\u9002\u7528\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u4f46\u4ecd\u9700\u624b\u52a8\u914d\u7f6e\u63d2\u4ef6\u8def\u5f84\u3002\r\n\r\n\u4e00\u3001\u8fd0\u884c\u6a21\u5f0f\r\nzgram \u652f\u6301\u4ee5 Webhook \u6a21\u5f0f\u548c Polling \u6a21\u5f0f\u8fd0\u884c\u3002\u751f\u4ea7\u73af\u5883\u63a8\u8350\u4f7f\u7528 Webhook \u6a21\u5f0f\uff0c\u800c Polling \u5219\u4ec5\u7528\u4e8e\u5f00\u53d1\u73af\u5883\u3002\r\n\r\n1\u3001Webhook \u6a21\u5f0f\r\n\u8981\u4ee5 Webhook \u6a21\u5f0f\u8fd0\u884c\uff0c\u8bf7\u5c06\u914d\u7f6e\u6587\u4ef6\u5b57\u6bb5 webhook \u8bbe\u7f6e\u4e3a True \uff0c\u6b64\u6a21\u5f0f\u6d89\u53ca\u7684\u914d\u7f6e\u6587\u4ef6\u5b57\u6bb5\u5982\u4e0b\uff1a\r\n\r\n[config]\r\nwebhook=True\r\nself_signed=False\r\ncert_key=your private cert path\r\ncert_pub=your public cert path\r\nserver_address=your server ip address or domain\r\nserver_port=your server port\r\nlocal_address=webhook local address\r\nlocal_port=webhook local port\r\nself_signed \u7528\u4e8e\u8bbe\u7f6e\u662f\u5426\u4f7f\u7528\u81ea\u7b7e\u540d\u8bc1\u4e66\uff0c\u800c cert_key \u548c cert_pub \u5219\u662f\u4f60\u7684\u8bc1\u4e66\u8def\u5f84(\u7edd\u5bf9\u8def\u5f84)\uff0cserver_address \u4e3a\u4f60\u7684\u670d\u52a1\u5668\u516c\u7f51IP, server_port \u4e3a\u670d\u52a1\u5668\u7684\u7aef\u53e3(\u76ee\u524d telegram \u5b98\u65b9\u4ec5\u652f\u6301 443, 80, 88, 8443)\uff0clocal_address \u4e3aWebhook \u672c\u5730\u76d1\u542c\u5730\u5740\uff0c local_port \u4e3a Webhook \u672c\u5730\u8fd0\u884c\u7684\u7aef\u53e3\u3002\r\n\r\n\u63a8\u8350\u642d\u914d nginx \u4f7f\u7528\uff0c\u81ea\u7b7e\u540d\u8bc1\u4e66\u751f\u6210\u8bf7\u53c2\u8003\uff1aGenerating a self-signed certificate pair (PEM)\r\n\r\n2\u3001Polling \u6a21\u5f0f\r\n\u8981\u4ee5 Polling \u6a21\u5f0f\u8fd0\u884c\uff0c\u53ea\u9700\u8981\u4fdd\u8bc1\u914d\u7f6e\u6587\u4ef6 webhook \u5b57\u6bb5\u4e3a False \u5373\u53ef\u3002\u6b64\u6a21\u5f0f\u6700\u57fa\u672c\u7684\u914d\u7f6e\u6587\u4ef6\u5982\u4e0b:\r\n\r\n[config]\r\nkey=bot key\r\npool_size=40\r\nwebhook=False\r\nroot_id=your user id\r\ndebug=False\r\nplugin_dir=your plugin dir\r\n\u4e8c\u3001\u8fd0\u884c\r\n\u4efb\u610f\u8def\u5f84\u6253\u5f00\u7ec8\u7aef\uff0c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a\r\n\r\n\u5bf9\u4e8e\u4f7f\u7528\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6\u9ed8\u8ba4\u8def\u5f84\u7684\uff1a\r\n\r\n\u8f93\u5165zgram \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002\r\n\r\n\u5bf9\u4e8e\u547d\u4ee4\u884c\u624b\u52a8\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u7684\uff1a\r\n\r\n\u8f93\u5165zgram -c/--config <configure file path> \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002(\u66f4\u591a\u6307\u4ee4\u8bf7\u901a\u8fc7 -h/--help \u67e5\u770b)\r\n\r\n\u53ef\u914d\u5408supervisor\u4f7f\u7528\u3002\r\n\r\n\u4e09\u3001\u914d\u7f6e\u6587\u4ef6\r\n\u5b8c\u6574\u7684\u914d\u7f6e\u6587\u4ef6\u5982\u4e0b\u6240\u793a:\r\n\r\n[config]\r\nkey=bot key\r\nplugin_dir=your plugin dir\r\npool_size=40 //the thread pool size, default 40, range(1, 101)\r\nwebhook=False\r\nself_signed=False //Optional while webhook is False\r\ncert_key=your private cert path //Optional while webhook is False\r\ncert_pub=your public cert path //Optional while webhook is False\r\nserver_ip=your server ip address //Optional while webhook is False\r\nserver_port=your server port //Optional while webhook is False\r\nlocal_address=webhook local address //Optional while webhook is False\r\nlocal_port=webhook local port //Optional while webhook is False\r\nroot_id=your user id\r\ndebug=False\r\ndrop_pending_updates=False\r\nlocal_api_server=local api server address //[Optional]\r\n\u5728 1.13.0 \u53ca\u4ee5\u4e0a\u7248\u672c\uff0c\u652f\u6301\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u6587\u4ef6\u3002\uff08\u9ed8\u8ba4\u4e3aPolling\u6a21\u5f0f\uff09\r\n\r\n1.\u5728\u547d\u4ee4\u884c\u672a\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u5728\u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u4e0b\u4e0d\u5b58\u5728\u914d\u7f6e\u6587\u4ef6\u65f6\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u6587\u4ef6 config.cfg\u3002\r\n\r\n\u5728Linux\u4e0b\uff0c\u4f1a\u81ea\u52a8\u5728\u7528\u6237\u76ee\u5f55\u4e0b\u521b\u5efa\u6587\u4ef6\u5939 .zgram \uff0c\u5e76\u751f\u6210\u914d\u7f6e\u6587\u4ef6 config.cfg\r\n\r\n\u5728Windows\u4e0b\uff0c\u5219\u4f1a\u5728 C:\\Users\\<username> \u76ee\u5f55\u4e0b\u521b\u5efa\u6587\u4ef6\u5939 .zgram \uff0c\u5e76\u751f\u6210\u914d\u7f6e\u6587\u4ef6 config.cfg\r\n\r\n2.\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\r\n\r\nLinux \u548c Windows \u90fd\u53ef\u5728\u547d\u4ee4\u884c\u901a\u8fc7\u53c2\u6570\u624b\u52a8\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0c\u547d\u4ee4\u683c\u5f0f\uff1a\r\n\r\nzgram -c/--config <configure file path>\r\n\u8def\u5f84\u5fc5\u987b\u4e3a\u7edd\u5bf9\u8def\u5f84\uff0c\u6b64\u60c5\u51b5\u4e0b\u4e5f\u4f1a\u5728\u6307\u5b9a\u8def\u5f84\u4e0a\u4e0d\u5b58\u5728\u914d\u7f6e\u6587\u4ef6\u65f6\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u6587\u4ef6 \uff0c\u914d\u7f6e\u6587\u4ef6\u547d\u540d\u7531\u6307\u5b9a\u7684\u8def\u5f84\u51b3\u5b9a\u3002\r\n\r\nTip: \u81ea\u52a8\u751f\u6210\u7684\u914d\u7f6e\u6587\u4ef6\u672a\u8bbe\u7f6e\u8fd9\u51e0\u4e2a\u5b57\u6bb5\u503c\uff1akey\u3001root_id\u3001plugin_dir\uff0ckey \u548c root_id \u4e3a\u5fc5\u987b\uff0c\u4f46\u6211\u4eec\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u884c\u8bbe\u7f6e\u4ed6\u4eec\uff1a\r\n\r\nzgram -c/--config <config file path> -k/--key <bot key> -r/--root <your user id>\r\n\u4f7f\u7528\u4ee5\u4e0a\u547d\u4ee4\u4f1a\u4ee5Polling\u6a21\u5f0f\u8fd0\u884c\u6846\u67b6\uff0c\u800c\u65e0\u9700\u56f0\u6270\u4e8e\u5904\u7406\u914d\u7f6e\u6587\u4ef6\u3002\r\n\r\n\u4e4b\u540e\u8bf7\u624b\u52a8\u8bbe\u7f6e plugin_dir \u3002\r\n\r\n\u63d2\u4ef6\u5f00\u53d1\u6307\u5357 (\u4ee5 Hello \u63d2\u4ef6\u4e3a\u4f8b) BETA 0.8\r\n\u4e00\u3001\u63d2\u4ef6\u7ed3\u6784\r\n\u4e00\u4e2a\u5b8c\u6574\u7684 zgram \u63d2\u4ef6\u5e94\u5f53\u5448\u73b0\u4e3a\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u5373\u4e00\u4e2aPython\u5305\uff0c\u4ee5 Hello \u63d2\u4ef6\u4e3a\u4f8b\uff0c\u6700\u57fa\u672c\u7684\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a\r\n\r\nHello/\r\n  ./__init__.py\r\n  ./Hello.py\r\n  ./Hello_screenshot.png\r\n  ./readme.md\r\n  ./requirement.txt\r\n\u4e8c\u3001\u89c4\u5219\r\n\u547d\u540d\r\n\u5728\u6784\u5efazgram\u63d2\u4ef6\u4e2d\u5e94\u5f53\u9075\u5b88\u7684\u89c4\u5219\u662f\uff1a\u6bcf\u4e2a\u63d2\u4ef6\u76ee\u5f55\u4e0b\u5e94\u5f53\u5b58\u5728\u4e00\u4e2a\u4e0e\u63d2\u4ef6\u540c\u540d\u7684.py \u6587\u4ef6\uff0c\u6bd4\u5982\u63d2\u4ef6 Hello \u4e2d\u7684 Hello.py \u6587\u4ef6\uff0c\u5e76\u4e14\u6b64\u6587\u4ef6\u4e2d\u5fc5\u987b\u5b58\u5728\u4f5c\u4e3a\u63d2\u4ef6\u5165\u53e3\u7684\u540c\u540d\u51fd\u6570\uff0c\u4ee5\u63d2\u4ef6 Hello \u4e3a\u4f8b\uff1a\r\n\r\n#file Hello/Hello.py\r\n\r\n# -*- coding:utf-8 -*-\r\n\r\ndef Hello(bot, message):\r\n    pass\r\n\u51fd\u6570 Hello() \u5373\u4e3a\u63d2\u4ef6\u7684\u5165\u53e3\u51fd\u6570\uff0c\u53c2\u6570 bot \u4e3aBot\u63a5\u53e3\u5e93\u5b9e\u4f8b\u5316\u5bf9\u8c61\uff0c\u53c2\u6570 message \u7528\u4e8e\u63a5\u6536\u6d88\u606f\u6570\u636e\u3002\r\n\r\n\u8d44\u6e90\u8def\u5f84\r\n\u82e5\u8981\u6253\u5f00\u67d0\u4e2a\u63d2\u4ef6\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u8d44\u6e90\uff0c\u9700\u8981\u4f7f\u7528\u7684\u8def\u5f84\u5e94\u5f53\u9075\u5faa\u4ee5\u4e0b\u7684\u683c\u5f0f\uff1a\r\n\r\nbot.path_converter(bot.plugin_dir + \"<plugin dir name>/<resource address>\")\r\n\u65b9\u6cd5 path_converter \u6839\u636e\u64cd\u4f5c\u7cfb\u7edf\u8f6c\u6362\u8def\u5f84\u683c\u5f0f\u3002\r\n\r\n\u4e09\u3001\u81ea\u5b9a\u4e49\u89e6\u53d1\u6307\u4ee4\r\n\u63d2\u4ef6\u6307\u4ee4\r\n\u63d2\u4ef6\u7684\u89e6\u53d1\u6307\u4ee4\u53ef\u4e0d\u540c\u4e8e\u63d2\u4ef6\u540d\uff0c\u5141\u8bb8\u81ea\u5b9a\u4e49\u3002\u4ee5\u63d2\u4ef6 Hello \u4e3a\u4f8b\uff0c\u89e6\u53d1\u6307\u4ee4\u4e3a /helloworld \u800c\u4e0d\u662f Hello\u3002\r\n\r\n\u4fee\u6539\u63d2\u4ef6\u76ee\u5f55\u4e0b\u7684 __init__.py \u6587\u4ef6\u8bbe\u7f6e\u89e6\u53d1\u6307\u4ee4\uff1a\r\n\r\n#file Hello/__init__.py\r\n\r\n#/helloworld\r\n#Hello World\u63d2\u4ef6\u4f8b\u5b50\r\n\u7b2c\u4e00\u884c\u4e3a\u89e6\u53d1\u6307\u4ee4\uff0c\u9ed8\u8ba4\u4ee5 / \u4f5c\u4e3a\u524d\u7f00\uff1b\u7b2c\u4e8c\u884c\u4e3a\u63d2\u4ef6\u7b80\u4ecb\u3002\r\n\r\n\u4e0d\u7528\u4f5c\u63d2\u4ef6\u7684\u7279\u6b8a\u60c5\u51b5\r\n\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u4f4d\u4e8e plugins \u76ee\u5f55\u4e0b\u7684\u6240\u6709\u5305\u90fd\u5c06\u88ab\u8bc6\u522b\u4e3a\u63d2\u4ef6\u5e76\u81ea\u52a8\u52a0\u8f7d\u5230 zgram \u4e2d\u3002\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u5b58\u5728\u5e76\u4e0d\u7528\u4f5c\u63d2\u4ef6\u800c\u53ea\u662f\u591a\u4e2a\u63d2\u4ef6\u5171\u7528\u5305\u7684\u60c5\u51b5\uff0c\u82e5\u60f3\u8be5\u5305\u4e0d\u88ab zgram \u52a0\u8f7d\uff0c\u8bf7\u5c06\u89e6\u53d1\u6307\u4ee4\u8bbe\u7f6e\u4e3a ~~ \u3002\u4ee5 tools \u5171\u7528\u5305\u4e3a\u4f8b\uff0c __init__.py \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff1a\r\n\r\n#fille tools/__init__.py\r\n\r\n#~~\r\n#tools \u5305\u7684\u7b80\u4ecb\r\n\u5efa\u8bae\u7528\u4f5c\u63d2\u4ef6\u7684\u5305\u540d\u9075\u5b88 Pascal\u547d\u540d\u6cd5\uff0c\u5373\u6bcf\u4e2a\u5355\u8bcd\u7684\u9996\u5b57\u6bcd\u5927\u5199\uff1b\u800c\u4e0d\u7528\u505a\u63d2\u4ef6\u7684\u5305\u540d\u4f7f\u7528\u5168\u5c0f\u5199\u7684\u5305\u540d\uff0c\u6bcf\u4e2a\u5355\u8bcd\u4e4b\u95f4\u4ee5_ \u5206\u9694\u3002\u4ee5\u533a\u5206 \u63d2\u4ef6\u5305 \u548c \u975e\u63d2\u4ef6\u5305 \uff1a\r\n\r\n- plugins\r\n  - Menu    #\u63d2\u4ef6\u5305\r\n  - tools   #\u975e\u63d2\u4ef6\u5305\r\n\u56db\u3001\u63d2\u4ef6\u6a21\u677f\u521b\u5efa\u5de5\u5177\r\n\u5728 v1.9.20_dev \u53ca\u4ee5\u4e0a\u7248\u672c\uff0c\u53ef\u4ee5\u901a\u8fc7\u547d\u4ee4\u884c\u6307\u4ee4\u4e00\u952e\u521b\u5efa\u63d2\u4ef6\u6a21\u677f\u3002\r\n\r\nzgram -p/--plugin <plugin name>\r\n\u8be5\u6307\u4ee4\u4f1a\u4f7f\u7528\u6846\u67b6\u914d\u7f6e\u6587\u4ef6(config.cfg)\u4e2d\u7684\u63d2\u4ef6\u8def\u5f84\u4f5c\u4e3a\u6240\u521b\u5efa\u63d2\u4ef6\u6a21\u677f\u7684\u5b58\u653e\u8def\u5f84\u3002\r\n\r\n\u4e94\u3001\u5468\u671f\u6027\u4efb\u52a1\r\n\u5728 v1.11.1 \u53ca\u4ee5\u4e0a\u7248\u672c\uff0c\u53ef\u4ee5\u521b\u5efa\u5468\u671f\u6027\u4efb\u52a1\uff0c\u529f\u80fd\u7c7b\u4f3c\u5faa\u73af\u5b9a\u65f6\u5668\u3002\r\n\r\n\u53ef\u83b7\u5f97\u7684\u65b9\u6cd5\uff1a\r\n\r\nschedule.add : \u6dfb\u52a0\u4efb\u52a1\r\nschedule.delete : \u79fb\u9664\u4efb\u52a1\r\nschedule.find : \u67e5\u627e\u4efb\u52a1\r\nschedule.clear : \u6e05\u7a7a\u4efb\u52a1\u6c60\r\nschedule.status : \u67e5\u770b\u4efb\u52a1\u6c60\u72b6\u6001\r\n\u4f8b\uff1a\r\n\r\nok, uid = bot.schedule.add(gap, event, (bot, ))\r\nok, uid = bot.schedule.delete(uid)\r\nok, uid = bot.schedule.find(uid)\r\nok, uid = bot.schedule.clear()\r\nok, uid = bot.schedule.status()\r\n\u5468\u671f\u6027\u4efb\u52a1\u6c60\u7684\u5927\u5c0f\u4e3a\u5168\u5c40\u7ebf\u7a0b\u6c60\u7684\u4e09\u5206\u4e4b\u4e00 \uff0c\u7ebf\u7a0b\u6c60\u5927\u5c0f\u5219\u53ef\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u6307\u5b9a\u3002\r\n1.\u514b\u9686\u6216\u70b9\u51fb\u4e0b\u8f7d\u672c\u9879\u76ee\u5230\u672c\u5730\uff0c\u4fdd\u8bc1\u672c\u673a\u5b89\u88c5\u6709`Python3.x`\u7248\u672c\u548c\u5305`requests` \uff1b\r\n\r\n\r\n\r\n2.`config.cfg` \u914d\u7f6e\u6587\u4ef6\r\n\r\n\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f:\r\n\r\n```python\r\n[config]\r\nkey=your key\r\npool_size=40 //the thread pool size, default 40, range(1, 101)\r\nwebhook=False\r\ncert_pub=your public certificate dir //Optional while webhook is False\r\nserver_ip=your server ip address //Optional while webhook is False\r\nserver_port=your server port //Optional while webhook is False\r\nlocal_address=webhook local address //Optional while webhook is False\r\nlocal_port=webhook local port //Optional while webhook is False\r\nroot=your user id\r\ndebug=False\r\ntimeout=60\r\nplugin_dir=your plugin dir   //[Optional]\r\n```\r\n\r\n* Linux\r\n\r\n\u5728 `/root` \u76ee\u5f55\u4e0b\u521b\u5efa\u6587\u4ef6\u5939 `.zgram` ,\u5e76\u5728\u5176\u5185\u65b0\u5efa\u914d\u7f6e\u6587\u4ef6 `config.cfg` ,\u6309\u7167\u4e0a\u9762\u7684\u683c\u5f0f\u586b\u5199\u914d\u7f6e\u6587\u4ef6\r\n\r\n* Windows\r\n\r\n\u5728 `C:\\Users\\<username>`  \u76ee\u5f55\u4e0b\u521b\u5efa\u6587\u4ef6\u5939 `.zgram` ,\u5e76\u5728\u5176\u5185\u65b0\u5efa\u914d\u7f6e\u6587\u4ef6 `config.cfg` ,\u6309\u7167\u4e0a\u9762\u7684\u683c\u5f0f\u586b\u5199\u914d\u7f6e\u6587\u4ef6\r\n\r\n* \u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\r\n\r\nLinux \u548c Windows \u90fd\u53ef\u5728\u547d\u4ee4\u884c\u901a\u8fc7\u53c2\u6570\u624b\u52a8\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\uff0c\u547d\u4ee4\u683c\u5f0f\uff1a\r\n\r\n```\r\npython -m zgram -c/-C <configure file path>\r\n```\r\n\r\n\u8def\u5f84\u5fc5\u987b\u4e3a\u7edd\u5bf9\u8def\u5f84\u3002\r\n\r\n\r\n\r\n3.\u8fd0\u884c\r\n\r\n\u7ec8\u7aef\u4e0b\u8fdb\u5165zgram\u6587\u4ef6\u5939\u6240\u5728\u76ee\u5f55\u3002\r\n\r\n* \u5bf9\u4e8e\u4f7f\u7528\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6\u9ed8\u8ba4\u8def\u5f84\u7684\uff1a\r\n\r\n  \u8f93\u5165`python -m zgram` \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002\r\n\r\n* \u5bf9\u4e8e\u547d\u4ee4\u884c\u624b\u52a8\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u7684\uff1a\r\n\r\n  \u8f93\u5165`python -m zgram -c/-C <configure file path>` \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002\r\n\r\n\r\n\r\n#### \u4e09\u3001Pip\u5b89\u88c5\u8fd0\u884c\r\n\r\n##### \u5b89\u88c5 #####\r\n\r\n* \u786e\u4fdd\u672c\u673aPython\u73af\u5883\u62e5\u6709pip\u5305\u7ba1\u7406\u5de5\u5177\u3002\r\n\r\n* \u5728\u672c\u9879\u76eeReleases\u9875\u9762\u4e0b\u8f7d\u5305\u6587\u4ef6\u3002\r\n\r\n* \u672c\u673a\u547d\u4ee4\u884c\u8fdb\u5165\u5305\u6587\u4ef6\u6240\u5728\u76ee\u5f55\uff0c\u6267\u884c\uff1a\r\n\r\n  ```\r\n  pip install <zgram package file name>\r\n  \r\n  or\r\n  \r\n  pip3 install <zgram package file name>\r\n  ```\r\n\r\n\u7531\u4e8eAPI\u672a\u5c01\u88c5\u5b8c\u6bd5\uff0c\u6682\u672a\u4e0a\u4f20\u81f3 `PyPI` ,\u6545\u4e0d\u80fd\u5728\u7ebf\u5b89\u88c5\uff0c\u671b\u8c05\u89e3\u3002\r\n\r\n##### \u8fd0\u884c #####\r\n\r\n\u4efb\u610f\u8def\u5f84\u6253\u5f00\u7ec8\u7aef\uff0c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a\r\n\r\n- \u5bf9\u4e8e\u4f7f\u7528\u7a0b\u5e8f\u914d\u7f6e\u6587\u4ef6\u9ed8\u8ba4\u8def\u5f84\u7684\uff1a\r\n\r\n  \u8f93\u5165`zgram` \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002\r\n\r\n- \u5bf9\u4e8e\u547d\u4ee4\u884c\u624b\u52a8\u6307\u5b9a\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u7684\uff1a\r\n\r\n  \u8f93\u5165`zgram -c/-C <configure file path>` \u56de\u8f66,\u6b63\u5e38\u60c5\u51b5\u4e0b\u4f60\u5e94\u8be5\u80fd\u770b\u89c1\u5c4f\u5e55\u63d0\u793a\u673a\u5668\u4eba\u5f00\u59cb\u8fd0\u884c\u3002\r\n\r\n\r\n\r\n\u53ef\u914d\u5408`supervisor`\u4f7f\u7528\u3002\r\n\r\n\r\n\r\n\r\n\r\n## \u63d2\u4ef6\u5f00\u53d1\u6307\u5357 (\u4ee5 Hello \u63d2\u4ef6\u4e3a\u4f8b) BETA 0.6\r\n\r\n#### \u4e00\u3001\u63d2\u4ef6\u7ed3\u6784\r\n\r\n\u4e00\u4e2a\u5b8c\u6574\u7684 `zgram` \u63d2\u4ef6\u5e94\u5f53\u5448\u73b0\u4e3a\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u5373\u4e00\u4e2aPython\u5305\uff0c\u4ee5 `Hello` \u63d2\u4ef6\u4e3a\u4f8b\uff0c\u6700\u57fa\u672c\u7684\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a\r\n\r\n```Python\r\nHello/\r\n  ./__init__.py\r\n  ./Hello.py\r\n  ./Hello_screenshot.png\r\n  ./readme.md\r\n```\r\n\r\n#### \u4e8c\u3001\u89c4\u5219\r\n\r\n##### \u547d\u540d\r\n\r\n\u5728\u6784\u5efazgram\u63d2\u4ef6\u4e2d\u5e94\u5f53\u9075\u5b88\u7684\u89c4\u5219\u662f\uff1a\u6bcf\u4e2a\u63d2\u4ef6\u76ee\u5f55\u4e0b\u5e94\u5f53\u5b58\u5728\u4e00\u4e2a\u4e0e\u63d2\u4ef6\u540c\u540d\u7684`.py` \u6587\u4ef6\uff0c\u6bd4\u5982\u63d2\u4ef6 `Hello ` \u4e2d\u7684 `Hello.py` \u6587\u4ef6\uff0c\u5e76\u4e14\u6b64\u6587\u4ef6\u4e2d\u5fc5\u987b\u5b58\u5728\u4f5c\u4e3a\u63d2\u4ef6\u5165\u53e3\u7684\u540c\u540d\u51fd\u6570\uff0c\u4ee5\u63d2\u4ef6 `Hello` \u4e3a\u4f8b\uff1a\r\n\r\n```python\r\n#file Hello/Hello.py\r\n\r\n# -*- coding:utf-8 -*-\r\n\r\ndef Hello(bot, message):\r\n    pass\r\n```\r\n\r\n\u51fd\u6570 `Hello()` \u5373\u4e3a\u63d2\u4ef6\u7684\u5165\u53e3\u51fd\u6570\uff0c\u53c2\u6570 `bot` \u4e3aBot\u63a5\u53e3\u5e93\u5b9e\u4f8b\u5316\u5bf9\u8c61\uff0c\u53c2\u6570 `message` \u7528\u4e8e\u63a5\u6536\u6d88\u606f\u6570\u636e\u3002\r\n\r\n\r\n\r\n\r\n\r\n##### \u8d44\u6e90\u8def\u5f84\r\n\r\n\u82e5\u8981\u6253\u5f00\u67d0\u4e2a\u63d2\u4ef6\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u8d44\u6e90\uff0c\u9700\u8981\u4f7f\u7528\u7684\u8def\u5f84\u5e94\u5f53\u9075\u5faa\u4ee5\u4e0b\u7684\u683c\u5f0f\uff1a\r\n\r\n```python\r\nbot.plugin_dir + \"<plugin dir name>/<resource address>\"\r\n```\r\n\r\n#### \u4e09\u3001\u81ea\u5b9a\u4e49\u89e6\u53d1\u6307\u4ee4\r\n\r\n##### \u63d2\u4ef6\u6307\u4ee4\r\n\r\n\u63d2\u4ef6\u7684\u89e6\u53d1\u6307\u4ee4\u53ef\u4e0d\u540c\u4e8e\u63d2\u4ef6\u540d\uff0c\u5141\u8bb8\u81ea\u5b9a\u4e49\u3002\u4ee5\u63d2\u4ef6 `Hello` \u4e3a\u4f8b\uff0c\u89e6\u53d1\u6307\u4ee4\u4e3a `/helloworld` \u800c\u4e0d\u662f `Hello`\u3002\r\n\r\n\u4fee\u6539\u63d2\u4ef6\u76ee\u5f55\u4e0b\u7684 `__init__.py` \u6587\u4ef6\u8bbe\u7f6e\u89e6\u53d1\u6307\u4ee4\uff1a\r\n\r\n```python\r\n#file Hello/__init__.py\r\n\r\n#/helloworld\r\n#Hello World\u63d2\u4ef6\u4f8b\u5b50\r\n```\r\n\r\n\u7b2c\u4e00\u884c\u4e3a\u89e6\u53d1\u6307\u4ee4\uff0c\u9ed8\u8ba4\u4ee5 `/`  \u4f5c\u4e3a\u524d\u7f00\uff1b\u7b2c\u4e8c\u884c\u4e3a\u63d2\u4ef6\u7b80\u4ecb\u3002\r\n\r\n\r\n\r\n##### \u4e0d\u7528\u4f5c\u63d2\u4ef6\u7684\u7279\u6b8a\u60c5\u51b5\r\n\r\n\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u4f4d\u4e8e `plugins` \u76ee\u5f55\u4e0b\u7684\u6240\u6709\u5305\u90fd\u5c06\u88ab\u8bc6\u522b\u4e3a\u63d2\u4ef6\u5e76\u81ea\u52a8\u52a0\u8f7d\u5230 `zgram` \u4e2d\u3002\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u5b58\u5728\u5e76\u4e0d\u7528\u4f5c\u63d2\u4ef6\u800c\u53ea\u662f\u591a\u4e2a\u63d2\u4ef6\u5171\u7528\u5305\u7684\u60c5\u51b5\uff0c\u82e5\u60f3\u8be5\u5305\u4e0d\u88ab `zgram` \u52a0\u8f7d\uff0c\u8bf7\u5c06\u89e6\u53d1\u6307\u4ee4\u8bbe\u7f6e\u4e3a `~~`  \u3002\u4ee5 `tools` \u5171\u7528\u5305\u4e3a\u4f8b\uff0c `__init__.py` \u6587\u4ef6\u5185\u5bb9\u5982\u4e0b\uff1a\r\n\r\n```python\r\n#fille tools/__init__.py\r\n\r\n#~~\r\n#tools \u5305\u7684\u7b80\u4ecb\r\n```\r\n\r\n\u5efa\u8bae\u7528\u4f5c\u63d2\u4ef6\u7684\u5305\u540d\u9075\u5b88 `Pascal\u547d\u540d\u6cd5`\uff0c\u5373\u6bcf\u4e2a\u5355\u8bcd\u7684\u9996\u5b57\u6bcd\u5927\u5199\uff1b\u800c\u4e0d\u7528\u505a\u63d2\u4ef6\u7684\u5305\u540d\u4f7f\u7528\u5168\u5c0f\u5199\u7684\u5305\u540d\uff0c\u6bcf\u4e2a\u5355\u8bcd\u4e4b\u95f4\u4ee5`_`  \u5206\u9694\u3002\u4ee5\u533a\u5206 `\u63d2\u4ef6\u5305` \u548c `\u975e\u63d2\u4ef6\u5305` \uff1a\r\n\r\n```python\r\n- plugins\r\n  - Menu    #\u63d2\u4ef6\u5305\r\n  - tools   #\u975e\u63d2\u4ef6\u5305\r\n```\r\n\r\n\r\n",
    "bugtrack_url": null,
    "license": "GPLv3",
    "summary": "zgram is a robot framework based on Telegram Bot API, with plug-in system, easy to extend.",
    "version": "1.0.0",
    "split_keywords": [
        "zgram",
        "telegram",
        "bot",
        "telegram",
        "bot",
        "api",
        "telegram"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "9322e21170cd410bc82c6950350b5a46",
                "sha256": "88bee29ed98606e1f58b8f061499c65bbef4f149db709dca07fad15a4bcaec26"
            },
            "downloads": -1,
            "filename": "zgram-1.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "9322e21170cd410bc82c6950350b5a46",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 40101,
            "upload_time": "2022-12-22T23:51:07",
            "upload_time_iso_8601": "2022-12-22T23:51:07.457352Z",
            "url": "https://files.pythonhosted.org/packages/2d/63/89f181773c4b0ae8ed3432fad690693737a7cf2acffb76ab6c1499b74061/zgram-1.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-12-22 23:51:07",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "zgram"
}
        
Elapsed time: 0.02479s