1、抖音直播互动数据对接更换成系统代理抓包pd解码的方式(运行直播伴侣即可);
2、修复若干逻辑及说明错误。
This commit is contained in:
xszyou 2023-04-13 09:44:36 +08:00
parent a42a72081d
commit d80543684a
42 changed files with 33829 additions and 249 deletions

450
README.md
View File

@ -6,247 +6,67 @@
</div>
Fay是一个完整的开源项目包含Python内核及UE数字人模型。开发人员可以利用该项目简单地构建各种类型的数字人或数字助理。该项目各模块之间耦合度非常低包括声音来源、语音识别、情绪分析、NLP处理、情绪语音合成、语音输出和表情动作输出等模块。每个模块都可以轻松地更换。其中NLP可以自由切换AIUI、GPT及Yuan1.0。
Fay是一个完整的开源项目包含Fay控制器及数字人模型可灵活组合出不同的应用场景虚拟主播、现场推销货、商品导购、语音助理、远程语音助理、数字人互动、数字人面试官及心理测评、贾维斯、Her。开发人员可以利用该项目简单地构建各种类型的数字人或数字助理。该项目各模块之间耦合度非常低包括声音来源、语音识别、情绪分析、NLP处理、情绪语音合成、语音输出和表情动作输出等模块。每个模块都可以轻松地更换。
<img src="images/5.png" alt="QA">
## **一、Fay控制器用途**
相关文章:
1、[(34条消息) 非常全面的数字人解决方案_郭泽斌之心的博客-CSDN博客_数字人算法](https://blog.csdn.net/aa84758481/article/details/124758727)
![](images/kzq.jpg)
2、[(34条消息) Fay数字人开源项目在mac 上的安装办法_郭泽斌之心的博客-CSDN博客](https://blog.csdn.net/aa84758481/article/details/127551258)
3、【开源项目数字人FAY——Fay新架构使用讲解】 https://www.bilibili.com/video/BV1NM411B7Ab/?share_source=copy_web&vd_source=64cd9062f5046acba398177b62bea9ad
### **远程语音助理** [`PC demo`](https://github.com/TheRamU/Fay/tree/main/python_connector_demo)
4、【开源项目FAY——UE工程讲解】https://www.bilibili.com/video/BV1C8411P7Ac?vd_source=64cd9062f5046acba398177b62bea9ad
### **远程语音助理** [`android demo`](https://github.com/TheRamU/Fay/tree/main/android_connector_demo)
5、m1机器安装办法Gason提供https://www.zhihu.com/question/437075754
目前最新版本是2.0。在新版本里我们提出一个全新的架构。在这个架构下每个人都可以把Fay控制器搭建在自己个人电脑上未来或许我们会提供终端让你电脑成为你数字助理的载体。你的所有设备手表、手机、眼镜、笔记本随时可以与你的数字助理通讯数字助理将通过电脑为你处理数字世界里的所有事情。贾维斯Her?
![](images/20230122074644.png)
2023.03
1、增加edge-tts语音合成免费可替换azure-tts(支持情绪化语音)
2、替换flask发行版运行方式
4、web socket接口增加数字人文字内容同步以便数人字可以远程运行
5、优化数字人数据web socket同步逻辑
6、更改gpt 3.5对接方式。
2023.02
1、提供chatgpt及yuan1.0作为选择。
2023.01
1、控制器pc内网穿透音频输入输出设备远程直连
2、提供android 音频输入输出工程示例代码;
3、提供python音频输入输出工程示例代码远程PC、树莓派等可用
4、补传1.0语音指令音乐播放模块(暂不支持远程播放);
5、重构及补充若干工具模块websocket、多线程、缓冲器、音频流录制器等
6、修复1.x版本的多个bug
7、集成看板娘;
2022.12
1、上传bin目录用于直播互动
2022.11
1、更新抖音直播获取粉丝互动数据的xpath;
2022.10.27
1、更新mac上的麦克风参数
2、解决mac上无法重启问题
3、上传brew安装脚本。
2022.10.17
1、更新语音指令
2、补充人设语法
## 语音指令
- **关闭核心**
关闭
再见
你走吧
- **静音**
静音
闭嘴
我想静静
- **取消静音**
取消静音
你在哪呢?
你可以说话了
- **播放歌曲(暂不能用需更换音乐库)**
播放歌曲
播放音乐
唱首歌
放首歌
听音乐
你会唱歌吗?
- **暂停播放**
暂停播放
别唱了
我不想听了
## 环境
- Python 3.8.0 +
- Chrome 浏览器 (若不开启直播功能,可跳过)
## 安装
### 安装依赖
```shell
pip install -r requirements.txt
```
### 配置 ChromeDriver (若不开启直播功能,可跳过)
1. Chrome 浏览器进入 [`chrome://settings/help`](chrome://settings/help) 查看当前版本
2. 下载对应版本 [ChromeDriver](https://chromedriver.chromium.org/downloads)
3. 解压zip并拷贝至 <u>./bin</u> 目录
4. 编辑 <u>system.conf</u> 配置 ChromeDriver 路径
### 配置应用密钥
1. 查看 [AI 模块](#ai-模块)
2. 浏览链接,注册并创建应用,将应用密钥填入 `./system.conf`
## 启动
启动数字人图像控制器
```shell
python main.py
```
## 图形界面
![](images/controller.png)
### 人设
数字人属性,与用户交互中能做出相应的响应。
##### 交互灵敏度
在交互中,数字人能感受用户的情感,并作出反应。最直的体现,就是语气的变化,如 开心/伤心/生气 等。
设置灵敏度,可改变用户情感对于数字人的影响程度。
### 接收来源
#### 抖音
填入直播间地址,实现与直播间粉丝交互
#### 麦克风
选择麦克风设备,实现面对面交互,成为你的伙伴
#### socket远程音频输入
可以接入远程音频输入,远程音频输出
#### 商品栏
填入商品介绍,数字人将自动讲解商品。
当用户对商品有疑问时,数字人可自动跳转至对应商品并解答问题。
配合抖音接收来源,实现直播间自动带货。
## AI 模块
启动前需填入应用密钥[`system.conf`](https://github.com/TheRamU/Fay/blob/main/system.conf)
| 代码模块 | 描述 | 链接 |
| ------------------------- | -------------------------- | ------------------------------------------------------------ |
| ./ai_module/ali_nls.py | 阿里云 实时语音识别 | https://ai.aliyun.com/nls/trans |
| ./ai_module/ms_tts_sdk.py | 微软 文本转情绪语音(可选) | https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/ |
| ./ai_module/xf_ltp.py | 讯飞 情感分析 | https://www.xfyun.cn/service/emotion-analysis |
| ./utils/ngrok_util.py | ngrok.cc 外网穿透(可选) | http://ngrok.cc |
| ./ai_module/yuan_1_0.py | 浪潮源大模型NLP 3选1 | https://air.inspur.com/ |
| ./ai_module/chatgpt.py | ChatGPTNLP 3选1 | ******* |
| ./ai_module/xf_aiui.py | 讯飞自然语言处理NLP 3选1 | https://aiui.xfyun.cn/solution/webapi |
## 与远程音频输入输出设备连接(非必须,外网需要配置http://ngrok.cc ngrok tcp通道的clientid
控制器与采用 socket(非websocket) 方式与 音频输出设备通讯
内网通讯地址: [`ws://127.0.0.1:10001`](ws://127.0.0.1:10001)
外网通讯地址: 通过http://ngrok.cc获取
![](images/Dingtalk_20230131122109.jpg)
消息格式: 参考 [remote_audio.py](https://github.com/TheRamU/Fay/blob/main/python_connector_demo/remote_audio.py)
## 与数字形象通讯(非必须,控制器需要关闭“面板播放”)
### **与数字形象通讯**(非必须,控制器需要关闭“面板播放”)
控制器与采用 WebSocket 方式与 UE 通讯
![](images/cs.png)
下载工程: [https://pan.baidu.com/s/1RBo2Pie6A5yTrCf1cn_Tuw?pwd=ck99](https://pan.baidu.com/s/1RBo2Pie6A5yTrCf1cn_Tuw?pwd=ck99)
下载windows运行包: [https://pan.baidu.com/s/1CsJ647uV5rS2NjQH3QT0Iw?pwd=s9s8](https://pan.baidu.com/s/1CsJ647uV5rS2NjQH3QT0Iw?pwd=s9s8)
![](images/UElucky.png)
**发您的Fay运行效果视频至公众号领取最新的UE5模型哦**
通讯地址: [`ws://127.0.0.1:10002`](ws://127.0.0.1:10002)(已接通)
消息格式: 查看 [WebSocket.md](https://github.com/TheRamU/Fay/blob/main/WebSocket.md)
![](images/UE.png)
### **与远程音频输入输出设备连接**(非必须,外网需要配置http://ngrok.cc tcp通道的clientid
控制器与采用 socket(非websocket) 方式与 音频输出设备通讯
内网通讯地址: [`ws://127.0.0.1:10001`](ws://127.0.0.1:10001)
外网通讯地址: 通过http://ngrok.cc获取有伙伴愿意赞助服务器给社区免费使用吗
![](images/Dingtalk_20230131122109.jpg)
消息格式: 参考 [remote_audio.py](https://github.com/TheRamU/Fay/blob/main/python_connector_demo/remote_audio.py)
## **二、Fay控制器核心逻辑**
## 目录结构
![](images/luoji.png)
**注:**
1、去API及会话管理功能将在下一版本发布
2、以上每个模块可轻易替换成自家核心产品。
### **目录结构**
```
.
@ -258,6 +78,8 @@ python main.py
│   ├── ali_nls.py # 阿里云 实时语音
│   ├── ms_tts_sdk.py # 微软 文本转语音
│   ├── xf_aiui.py # 讯飞 人机交互-自然语言处理
│   ├── chatgpt.py # gpt3.5对接
│   ├── yuan_1_0.py # 浪潮.源大模型对接
│   └── xf_ltp.py # 讯飞 性感分析
├── bin # 可执行文件目录
├── core # 数字人核心
@ -278,10 +100,198 @@ python main.py
├── storer.py
└── util.py
```
进一步交流请联系QQ 467665317
技术交流群
<img src="images/20230329172514.jpg" alt="微信群">
## **三、升级日志**
**2023.04**
+ 抖音直播互动数据对接更换成系统代理抓包pd解码的方式运行直播伴侣即可
+ 修复若干逻辑及说明错误。
**2023.03**
+ 增加edge-tts语音合成免费可替换azure-tts(支持情绪化语音)
+ 替换flask发行版运行方式
+ web socket接口增加数字人文字内容同步以便数人字可以远程运行
+ 优化数字人数据web socket同步逻辑
+ 更改gpt 3.5对接方式。
**2023.02**
+ 提供chatgpt及yuan1.0作为选择。
**2023.01**
+ 控制器pc内网穿透音频输入输出设备远程直连
+ 提供android 音频输入输出工程示例代码;
+ 提供python音频输入输出工程示例代码远程PC、树莓派等可用
+ 补传1.0语音指令音乐播放模块(暂不支持远程播放);
+ 重构及补充若干工具模块websocket、多线程、缓冲器、音频流录制器等
+ 修复1.x版本的多个bug
+ 集成看板娘;
**2022.12**
+ 上传bin目录用于直播互动
**2022.11**
+ 更新抖音直播获取粉丝互动数据的xpath;
**2022.10.27**
+ 更新mac上的麦克风参数
+ 解决mac上无法重启问题
+ 上传brew安装脚本。
**2022.10.17**
+ 更新语音指令;
+ 补充人设语法;
## **四、安装说明**
### **环境**
- Python 3.8.0 +
- Chrome 浏览器 (若不开启直播功能,可跳过)
### **安装依赖**
```shell
pip install -r requirements.txt
```
### **配置应用密钥**
+ 查看 [AI 模块](#ai-模块)
+ 浏览链接,注册并创建应用,将应用密钥填入 `./system.conf`
### **启动**
启动Fay控制器
```shell
python main.py
```
### **AI 模块**
启动前需填入应用密钥
| 代码模块 | 描述 | 链接 |
| ------------------------- | -------------------------- | ------------------------------------------------------------ |
| ./ai_module/ali_nls.py | 阿里云 实时语音识别 | https://ai.aliyun.com/nls/trans |
| ./ai_module/ms_tts_sdk.py | 微软 文本转情绪语音(可选) | https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/ |
| ./ai_module/xf_ltp.py | 讯飞 情感分析 | https://www.xfyun.cn/service/emotion-analysis |
| ./utils/ngrok_util.py | ngrok.cc 外网穿透(可选) | http://ngrok.cc |
| ./ai_module/yuan_1_0.py | 浪潮源大模型NLP 3选1 | https://air.inspur.com/ |
| ./ai_module/chatgpt.py | ChatGPTNLP 3选1 | ******* |
| ./ai_module/xf_aiui.py | 讯飞自然语言处理NLP 3选1 | https://aiui.xfyun.cn/solution/webapi |
## **五、使用说明**
### **使用说明**
+ 抖音虚拟主播fay控制器抖音输入源开启、展板播放关闭+ 数字人 + 抖音伴侣;
+ 现场推销货fay控制器展板播放关闭、填写商品信息+ 数字人;
+ 商品导购fay控制器麦克风输入源开启、展板播放关闭、填写商品信息、填写商品Q&A+ 数字人;
+ 语音助理fay控制器麦克风输入源开启、展板播放开启
+ 远程语音助理fay控制器展板播放关闭+ 远程设备接入;
+ 数字人互动fay控制器麦克风输入源开启、展板播放关闭、填写性格Q&A+ 数字人;
+ 数字人面试官及心理测评:联系免费领取;
+ 贾维斯、Her加入我们一起完成。
### **语音指令**
- **关闭核心**
关闭
再见
你走吧
- **静音**
静音
闭嘴
我想静静
- **取消静音**
取消静音
你在哪呢?
你可以说话了
- **播放歌曲**(网易音乐库不可用,寻找替代中)
播放歌曲
播放音乐
唱首歌
放首歌
听音乐
你会唱歌吗?
- **暂停播放**
暂停播放
别唱了
我不想听了
### **图形界面**
![](images/controller.png)
### **人设**
数字人属性,与用户交互中能做出相应的响应。
#### 交互灵敏度
在交互中,数字人能感受用户的情感,并作出反应。最直的体现,就是语气的变化,如 开心/伤心/生气 等。
设置灵敏度,可改变用户情感对于数字人的影响程度。
### **接收来源**
#### 抖音
填入直播间地址,实现与直播间粉丝交互
#### 麦克风
选择麦克风设备,实现面对面交互,成为你的伙伴
#### socket远程音频输入
可以接入远程音频输入,远程音频输出
#### 商品栏
填入商品介绍,数字人将自动讲解商品。
当用户对商品有疑问时,数字人可自动跳转至对应商品并解答问题。
配合抖音接收来源,实现直播间自动带货。
### 相关文章:
1、[(34条消息) 非常全面的数字人解决方案_郭泽斌之心的博客-CSDN博客_数字人算法](https://blog.csdn.net/aa84758481/article/details/124758727)
2、[(34条消息) Fay数字人开源项目在mac 上的安装办法_郭泽斌之心的博客-CSDN博客](https://blog.csdn.net/aa84758481/article/details/127551258)
3、【开源项目数字人FAY——Fay新架构使用讲解】 https://www.bilibili.com/video/BV1NM411B7Ab/?share_source=copy_web&vd_source=64cd9062f5046acba398177b62bea9ad
4、【开源项目FAY——UE工程讲解】https://www.bilibili.com/video/BV1C8411P7Ac?vd_source=64cd9062f5046acba398177b62bea9ad
5、m1机器安装办法Gason提供https://www.zhihu.com/question/437075754
二次开发指导联系QQ 467665317
关注公众号获取最新微信技术交流群二维码
![](images/gzh.jpg)

View File

@ -48,3 +48,24 @@
| Data.Time | 音频时长 (秒) | float | |
| Data.Type | 发言类型 | str | interact/script |
### 发送回复文字
```json
{
"Topic": "Unreal",
"Data": {
"Key": "text",
"Value": "很高兴见到你"
}
}
```
| 参数 | 描述 | 类型 | 范围 |
| ---------- | ---------------- | ----- | --------------- |
| Data.text | 文本 | str | |

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

BIN
bin/Release_2.85/Fleck.dll Normal file

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Buffers</name>
</assembly>
<members>
<member name="T:System.Buffers.ArrayPool`1">
<summary>Provides a resource pool that enables reusing instances of type <see cref="T[]"></see>.</summary>
<typeparam name="T">The type of the objects that are in the resource pool.</typeparam>
</member>
<member name="M:System.Buffers.ArrayPool`1.#ctor">
<summary>Initializes a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create(System.Int32,System.Int32)">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class using the specifed configuration.</summary>
<param name="maxArrayLength">The maximum length of an array instance that may be stored in the pool.</param>
<param name="maxArraysPerBucket">The maximum number of array instances that may be stored in each bucket in the pool. The pool groups arrays of similar lengths into buckets for faster access.</param>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class with the specified configuration.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Rent(System.Int32)">
<summary>Retrieves a buffer that is at least the requested length.</summary>
<param name="minimumLength">The minimum length of the array.</param>
<returns>An array of type <see cref="T[]"></see> that is at least <paramref name="minimumLength">minimumLength</paramref> in length.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)">
<summary>Returns an array to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method on the same <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<param name="array">A buffer to return to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method.</param>
<param name="clearArray">Indicates whether the contents of the buffer should be cleared before reuse. If <paramref name="clearArray">clearArray</paramref> is set to true, and if the pool will store the buffer to enable subsequent reuse, the <see cref="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)"></see> method will clear the <paramref name="array">array</paramref> of its contents so that a subsequent caller using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method will not see the content of the previous caller. If <paramref name="clearArray">clearArray</paramref> is set to false or if the pool will release the buffer, the array&amp;#39;s contents are left unchanged.</param>
</member>
<member name="P:System.Buffers.ArrayPool`1.Shared">
<summary>Gets a shared <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<returns>A shared <see cref="System.Buffers.ArrayPool`1"></see> instance.</returns>
</member>
</members>
</doc>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,355 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Memory</name>
</assembly>
<members>
<member name="T:System.Span`1">
<typeparam name="T"></typeparam>
</member>
<member name="M:System.Span`1.#ctor(`0[])">
<param name="array"></param>
</member>
<member name="M:System.Span`1.#ctor(System.Void*,System.Int32)">
<param name="pointer"></param>
<param name="length"></param>
</member>
<member name="M:System.Span`1.#ctor(`0[],System.Int32)">
<param name="array"></param>
<param name="start"></param>
</member>
<member name="M:System.Span`1.#ctor(`0[],System.Int32,System.Int32)">
<param name="array"></param>
<param name="start"></param>
<param name="length"></param>
</member>
<member name="M:System.Span`1.Clear">
</member>
<member name="M:System.Span`1.CopyTo(System.Span{`0})">
<param name="destination"></param>
</member>
<member name="M:System.Span`1.DangerousCreate(System.Object,`0@,System.Int32)">
<param name="obj"></param>
<param name="objectData"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.DangerousGetPinnableReference">
<returns></returns>
</member>
<member name="P:System.Span`1.Empty">
<returns></returns>
</member>
<member name="M:System.Span`1.Equals(System.Object)">
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Fill(`0)">
<param name="value"></param>
</member>
<member name="M:System.Span`1.GetHashCode">
<returns></returns>
</member>
<member name="P:System.Span`1.IsEmpty">
<returns></returns>
</member>
<member name="P:System.Span`1.Item(System.Int32)">
<param name="index"></param>
<returns></returns>
</member>
<member name="P:System.Span`1.Length">
<returns></returns>
</member>
<member name="M:System.Span`1.op_Equality(System.Span{`0},System.Span{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(System.ArraySegment{T})~System.Span{T}">
<param name="arraySegment"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(System.Span{T})~System.ReadOnlySpan{T}">
<param name="span"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(T[])~System.Span{T}">
<param name="array"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Inequality(System.Span{`0},System.Span{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Slice(System.Int32)">
<param name="start"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Slice(System.Int32,System.Int32)">
<param name="start"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.ToArray">
<returns></returns>
</member>
<member name="M:System.Span`1.TryCopyTo(System.Span{`0})">
<param name="destination"></param>
<returns></returns>
</member>
<member name="T:System.SpanExtensions">
</member>
<member name="M:System.SpanExtensions.AsBytes``1(System.ReadOnlySpan{``0})">
<param name="source"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsBytes``1(System.Span{``0})">
<param name="source"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan(System.String)">
<param name="text"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan``1(System.ArraySegment{``0})">
<param name="arraySegment"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan``1(``0[])">
<param name="array"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.CopyTo``1(``0[],System.Span{``0})">
<param name="array"></param>
<param name="destination"></param>
<typeparam name="T"></typeparam>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.Byte)">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.Byte)">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},``0)">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},``0)">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<param name="value2"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<param name="value2"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.NonPortableCast``2(System.ReadOnlySpan{``0})">
<param name="source"></param>
<typeparam name="TFrom"></typeparam>
<typeparam name="TTo"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.NonPortableCast``2(System.Span{``0})">
<param name="source"></param>
<typeparam name="TFrom"></typeparam>
<typeparam name="TTo"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="first"></param>
<param name="second"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="first"></param>
<param name="second"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="first"></param>
<param name="second"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="first"></param>
<param name="second"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="T:System.ReadOnlySpan`1">
<typeparam name="T"></typeparam>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[])">
<param name="array"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(System.Void*,System.Int32)">
<param name="pointer"></param>
<param name="length"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32)">
<param name="array"></param>
<param name="start"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32,System.Int32)">
<param name="array"></param>
<param name="start"></param>
<param name="length"></param>
</member>
<member name="M:System.ReadOnlySpan`1.CopyTo(System.Span{`0})">
<param name="destination"></param>
</member>
<member name="M:System.ReadOnlySpan`1.DangerousCreate(System.Object,`0@,System.Int32)">
<param name="obj"></param>
<param name="objectData"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.DangerousGetPinnableReference">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Empty">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Equals(System.Object)">
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.GetHashCode">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.IsEmpty">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Item(System.Int32)">
<param name="index"></param>
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Length">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Equality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Implicit(System.ArraySegment{T})~System.ReadOnlySpan{T}">
<param name="arraySegment"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Implicit(T[])~System.ReadOnlySpan{T}">
<param name="array"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Inequality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32)">
<param name="start"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32,System.Int32)">
<param name="start"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.ToArray">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.TryCopyTo(System.Span{`0})">
<param name="destination"></param>
<returns></returns>
</member>
</members>
</doc>

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Runtime.CompilerServices.Unsafe</name>
</assembly>
<members>
<member name="T:System.Runtime.CompilerServices.Unsafe">
<summary>Contains generic, low-level functionality for manipulating pointers.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.Int32)">
<summary>Adds an element offset to the given reference.</summary>
<param name="source">The reference to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Add``1(``0@,System.IntPtr)">
<summary>Adds an element offset to the given reference.</summary>
<param name="source">The reference to add the offset to.</param>
<param name="elementOffset">The offset to add.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the addition of offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AddByteOffset``1(``0@,System.IntPtr)">
<summary>Adds a byte offset to the given reference.</summary>
<param name="source">The reference to add the offset to.</param>
<param name="byteOffset">The offset to add.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the addition of byte offset to pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AreSame``1(``0@,``0@)">
<summary>Determines whether the specified references point to the same location.</summary>
<param name="left">The first reference to compare.</param>
<param name="right">The second reference to compare.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>true if <paramref name="left">left</paramref> and <paramref name="right">right</paramref> point to the same location; otherwise, false.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.As``1(System.Object)">
<summary>Casts the given object to the specified type.</summary>
<param name="o">The object to cast.</param>
<typeparam name="T">The type which the object will be cast to.</typeparam>
<returns>The original object, casted to the given type.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.As``2(``0@)">
<summary>Reinterprets the given reference as a reference to a value of type <typeparamref name="TTo">TTo</typeparamref>.</summary>
<param name="source">The reference to reinterpret.</param>
<typeparam name="TFrom">The type of reference to reinterpret..</typeparam>
<typeparam name="TTo">The desired type of the reference.</typeparam>
<returns>A reference to a value of type <typeparamref name="TTo">TTo</typeparamref>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AsPointer``1(``0@)">
<summary>Returns a pointer to the given by-ref parameter.</summary>
<param name="value">The object whose pointer is obtained.</param>
<typeparam name="T">The type of object.</typeparam>
<returns>A pointer to the given value.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.AsRef``1(System.Void*)">
<summary>Reinterprets the given location as a reference to a value of type <typeparamref name="T">T</typeparamref>.</summary>
<param name="source">The location of the value to reference.</param>
<typeparam name="T">The type of the interpreted location.</typeparam>
<returns>A reference to a value of type <typeparamref name="T">T</typeparamref>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ByteOffset``1(``0@,``0@)">
<summary>Determines the byte offset from origin to target from the given references.</summary>
<param name="origin">The reference to origin.</param>
<param name="target">The reference to target.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>Byte offset from origin to target i.e. <paramref name="target">target</paramref> - <paramref name="origin">origin</paramref>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(System.Void*,``0@)">
<summary>Copies a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
<param name="destination">The location to copy to.</param>
<param name="source">A reference to the value to copy.</param>
<typeparam name="T">The type of value to copy.</typeparam>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Copy``1(``0@,System.Void*)">
<summary>Copies a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
<param name="destination">The location to copy to.</param>
<param name="source">A pointer to the value to copy.</param>
<typeparam name="T">The type of value to copy.</typeparam>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Byte@,System.Byte@,System.UInt32)">
<summary>Copies bytes from the source address to the destination address.</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlock(System.Void*,System.Void*,System.UInt32)">
<summary>Copies bytes from the source address to the destination address.</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Void*,System.Void*,System.UInt32)">
<summary>Copies bytes from the source address to the destination address
without assuming architecture dependent alignment of the addresses.</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.CopyBlockUnaligned(System.Byte@,System.Byte@,System.UInt32)">
<summary>Copies bytes from the source address to the destination address
without assuming architecture dependent alignment of the addresses.</summary>
<param name="destination">The destination address to copy to.</param>
<param name="source">The source address to copy from.</param>
<param name="byteCount">The number of bytes to copy.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Byte@,System.Byte,System.UInt32)">
<summary>Initializes a block of memory at the given location with a given initial value.</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlock(System.Void*,System.Byte,System.UInt32)">
<summary>Initializes a block of memory at the given location with a given initial value.</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Byte@,System.Byte,System.UInt32)">
<summary>Initializes a block of memory at the given location with a given initial value
without assuming architecture dependent alignment of the address.</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.InitBlockUnaligned(System.Void*,System.Byte,System.UInt32)">
<summary>Initializes a block of memory at the given location with a given initial value
without assuming architecture dependent alignment of the address.</summary>
<param name="startAddress">The address of the start of the memory block to initialize.</param>
<param name="value">The value to initialize the block to.</param>
<param name="byteCount">The number of bytes to initialize.</param>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Read``1(System.Void*)">
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location.</summary>
<param name="source">The location to read from.</param>
<typeparam name="T">The type to read.</typeparam>
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Byte@)">
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location
without assuming architecture dependent alignment of the addresses.</summary>
<param name="source">The location to read from.</param>
<typeparam name="T">The type to read.</typeparam>
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.ReadUnaligned``1(System.Void*)">
<summary>Reads a value of type <typeparamref name="T">T</typeparamref> from the given location
without assuming architecture dependent alignment of the addresses.</summary>
<param name="source">The location to read from.</param>
<typeparam name="T">The type to read.</typeparam>
<returns>An object of type <typeparamref name="T">T</typeparamref> read from the given location.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.SizeOf``1">
<summary>Returns the size of an object of the given type parameter.</summary>
<typeparam name="T">The type of object whose size is retrieved.</typeparam>
<returns>The size of an object of type <typeparamref name="T">T</typeparamref>.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.Int32)">
<summary>Subtracts an element offset from the given reference.</summary>
<param name="source">The reference to subtract the offset from.</param>
<param name="elementOffset">The offset to subtract.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Subtract``1(``0@,System.IntPtr)">
<summary>Subtracts an element offset from the given reference.</summary>
<param name="source">The reference to subtract the offset from.</param>
<param name="elementOffset">The offset to subtract.</param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the subraction of offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.SubtractByteOffset``1(``0@,System.IntPtr)">
<summary>Subtracts a byte offset from the given reference.</summary>
<param name="source">The reference to subtract the offset from.</param>
<param name="byteOffset"></param>
<typeparam name="T">The type of reference.</typeparam>
<returns>A new reference that reflects the subraction of byte offset from pointer.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.Write``1(System.Void*,``0)">
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location.</summary>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
<typeparam name="T">The type of value to write.</typeparam>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Byte@,``0)">
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location
without assuming architecture dependent alignment of the addresses.</summary>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
<typeparam name="T">The type of value to write.</typeparam>
</member>
<member name="M:System.Runtime.CompilerServices.Unsafe.WriteUnaligned``1(System.Void*,``0)">
<summary>Writes a value of type <typeparamref name="T">T</typeparamref> to the given location
without assuming architecture dependent alignment of the addresses.</summary>
<param name="destination">The location to write to.</param>
<param name="value">The value to write.</param>
<typeparam name="T">The type of value to write.</typeparam>
</member>
</members>
</doc>

View File

@ -0,0 +1,582 @@
syntax = "proto3";
message Response{
repeated Message messages = 1;
string cursor = 2;
int64 fetchInterval = 3;
int64 now = 4;
string internalExt = 5;
int32 fetchType = 6;
map<string, string> routeParams = 7;
int64 heartbeatDuration = 8;
bool needAck = 9;
string pushServer = 10;
string liveCursor = 11;
bool historyNoMore = 12;
}
message Message{
string method = 1;
bytes payload = 2;
int64 msgId = 3;
int32 msgType = 4;
int64 offset = 5;
}
message RoomUserSeqMessage {
Common common = 1;
repeated Contributor ranks = 2;
int64 total = 3;
string popStr = 4;
repeated Contributor seats = 5;
int64 popularity = 6;
int64 totalUser = 7;
string totalUserStr = 8;
string totalStr = 9;
string onlineUserForAnchor = 10;
string totalPvForAnchor = 11;
message Contributor {
int64 score = 1;
User user = 2;
int64 rank = 3;
int64 delta = 4;
bool isHidden = 5;
string scoreDescription = 6;
string exactlyScore = 7;
}
}
message GiftMessage {
Common common = 1;
int64 giftId = 2;
int64 fanTicketCount = 3;
int64 groupCount = 4;
int64 repeatCount = 5;
int64 comboCount = 6;
User user = 7;
User toUser = 8;
int32 repeatEnd = 9;
TextEffect textEffect = 10;
int64 groupId = 11;
int64 incomeTaskgifts = 12;
int64 roomFanTicketCount = 13;
GiftIMPriority priority = 14;
GiftStruct gift = 15;
string logId = 16;
int64 sendType = 17;
PublicAreaCommon publicAreaCommon = 18;
Text trayDisplayText = 19;
int64 bannedDisplayEffects = 20;
GiftTrayInfo trayInfo = 21;
AssetEffectMixInfo assetEffectMixInfo = 24;
message TextEffect{
Detail portrait = 1;
Detail landscape = 2;
message Detail {
Text text = 1;
int32 textFontSize = 2;
Image background = 3;
int32 start = 4;
int32 duration = 5;
int32 x = 6;
int32 y = 7;
int32 width = 8;
int32 height = 9;
int32 shadowDx = 10;
int32 shadowDy = 11;
int32 shadowRadius = 12;
string shadowColor = 13;
string strokeColor = 14;
int32 strokeWidth = 15;
}
}
}
message LikeMessage {
Common common = 1;
int64 count = 2;
int64 total = 3;
int64 color = 4;
User user = 5;
string icon = 6;
}
message ChatMessage {
Common common = 1;
User user = 2;
string content = 3;
bool visibleToSender = 4;
Image backgroundImage = 5;
string fullScreenTextColor = 6;
Image backgroundImageV2 = 7;
PublicAreaCommon publicAreaCommon = 9;
Image giftImage = 10;
}
message SocialMessage {
Common common = 1;
User user = 2;
int64 shareType = 3;
int64 action = 4;
string shareTarget = 5;
int64 followCount = 6;
PublicAreaCommon publicAreaCommon = 7;
}
message MemberMessage{
Common common = 1;
User user = 2;
int64 memberCount = 3;
User operator = 4;
bool isSetToAdmin = 5;
bool isTopUser = 6;
int64 rankScore = 7;
int64 topUserNo = 8;
int64 enterType = 9;
int64 action = 10;
string actionDescription = 11;
int64 userId = 12;
EffectConfig effectConfig = 13;
string popStr = 14;
EffectConfig enterEffectConfig = 15;
Image backgroundImage = 16;
Image backgroundImageV2 = 17;
Text anchorDisplayText = 18;
PublicAreaCommon publicAreaCommon = 19;
message EffectConfig{
int64 type = 1;
Image icon = 2;
int64 avatarPos = 3;
Text text = 4;
Image textIcon = 5;
int32 stayTime = 6;
int64 animAssetId = 7;
Image badge = 8;
repeated int64 flexSettingArray = 9;
Image textIconOverlay = 10;
Image animatedBadge = 11;
bool hasSweepLight = 12;
repeated int64 textFlexSettingArray = 13;
int64 centerAnimAssetId = 14;
}
}
message ControlMessage {
Common common = 1;
int32 status = 2;
}
message FansclubMessage {
Common commonInfo = 1;
// 12
int32 type = 2;
string content = 3;
User user = 4;
}
message Common{
string method = 1;
int64 msgId = 2;
int64 roomId = 3;
int64 createTime = 4;
int32 monitor = 5;
bool isShowMsg = 6;
string describe = 7;
Text displayText = 8;
int64 foldType = 9;
int64 anchorFoldType = 10;
int64 priorityScore = 11;
string logId = 12;
string msgProcessFilterK = 13;
string msgProcessFilterV = 14;
User user = 15;
Room room = 16;
int64 anchorFoldTypeV2 = 17;
int64 processAtSeiTimeMs = 18;
}
message Text{
string key = 1;
string defaultPattern = 2;
TextFormat defaultFormat = 3;
repeated TextPiece pieces = 4;
}
message Room {
int64 id = 1;
string idStr = 2;
int64 status = 3;
int64 ownerUserId = 4;
string title = 5;
int64 userCount = 6;
int64 createTime = 7;
int64 linkmicLayout = 8;
int64 finishTime = 9;
RoomExtra extra = 10;
string dynamicCoverUri = 11;
map<int64, string> dynamicCoverDict = 12;
int64 lastPingTime = 13;
int64 liveId = 14;
int64 streamProvider = 15;
int64 osType = 16;
int64 clientVersion = 17;
bool withLinkmic = 18;
bool enableRoomPerspective = 19;
Image cover = 20;
Image dynamicCover = 21;
Image dynamicCoverLow = 22;
string shareUrl = 23;
string anchorShareText = 24;
string userShareText = 25;
int64 streamId = 26;
string streamIdStr = 27;
StreamUrl streamUrl = 28;
int64 mosaicStatus = 29;
string mosaicTip = 30;
int64 cellStyle = 31;
LinkMic linkMic = 32;
int64 luckymoneyNum = 33;
repeated Decoration decoList = 34;
repeated TopFan topFans = 35;
RoomStats stats = 36;
string sunDailyIconContent = 37;
string distance = 38;
string distanceCity = 39;
string location = 40;
string realDistance = 41;
Image feedRoomLabel = 42;
string commonLabelList = 43;
RoomUserAttr livingRoomAttrs = 44;
repeated int64 adminUserIds = 45;
User owner = 46;
string privateInfo = 47;
}
message RoomExtra{
}
message RoomStats{
}
message RoomUserAttr{
}
message StreamUrl{
}
message LinkMic {
}
message Decoration{
}
message TopFan {
}
message User{
int64 id = 1;
int64 shortId = 2;
string nickname = 3;
int32 gender = 4;
string signature = 5;
int32 level = 6;
int64 birthday = 7;
string telephone = 8;
Image avatarThumb = 9;
Image avatarMedium = 10;
Image avatarLarge = 11;
bool verified = 12;
int32 experience = 13;
string city = 14;
int32 status = 15;
int64 createTime = 16;
int64 modifyTime = 17;
int32 secret = 18;
string shareQrcodeUri = 19;
int32 incomeSharePercent = 20;
Image badgeImageList = 21;
FollowInfo followInfo = 22;
PayGrade payGrade = 23;
FansClub fansClub = 24;
Border border = 25;
string specialId = 26;
Image avatarBorder = 27;
Image medal = 28;
repeated Image realTimeIcons = 29;
repeated Image newRealTimeIcons = 30;
int64 topVipNo = 31;
UserAttr userAttr = 32;
OwnRoom ownRoom = 33;
int64 payScore = 34;
int64 ticketCount = 35;
AnchorInfo anchorInfo = 36;
int32 linkMicStats = 37;
string displayId = 38;
message UserAttr {
}
message OwnRoom {
}
message AnchorInfo {
}
message FollowInfo {
int64 followingCount = 1;
int64 followerCount = 2;
int64 followStatus = 3;
int64 pushStatus = 4;
string remarkName = 5;
}
message FansClub{
FansClubData data = 1;
map<int32, FansClubData> preferData = 2;
message FansClubData {
string clubName = 1;
int32 level = 2;
int32 userFansClubStatus = 3;
UserBadge badge = 4;
repeated int64 availableGiftIds = 5;
int64 anchorId = 6;
message UserBadge {
map<int32, Image> icons = 1;
string title = 2;
}
}
}
message Border{
}
message GradeBuffInfo {
int64 buffLevel = 1;
int32 status = 2;
int64 endTime = 3;
map<int64, int64> statsInfo = 4;
Image buffBadge = 5;
}
message PayGrade {
int64 totalDiamondCount = 1;
Image diamondIcon = 2;
string name = 3;
Image icon = 4;
string nextName = 5;
int64 level = 6;
Image nextIcon = 7;
int64 nextDiamond = 8;
int64 nowDiamond = 9;
int64 thisGradeMinDiamond = 10;
int64 thisGradeMaxDiamond = 11;
int64 payDiamondBak = 12;
string gradeDescribe = 13;
repeated GradeIcon gradeIconList = 14;
int64 screenChatType = 15;
Image imIcon = 16;
Image imIconWithLevel = 17;
Image liveIcon = 18;
Image newImIconWithLevel = 19;
Image newLiveIcon = 20;
int64 upgradeNeedConsume = 21;
string nextPrivileges = 22;
Image background = 23;
Image backgroundBack = 24;
int64 score = 25;
GradeBuffInfo buffInfo = 26;
string gradeBanner = 1001;
Image profileDialogBg = 1002;
Image profileDialogBgBack = 1003;
message GradeIcon{
Image icon = 1;
int64 iconDiamond = 2;
int64 level = 3;
string levelStr = 4;
}
}
}
message TextFormat{
string color = 1;
bool bold = 2;
bool italic = 3;
int32 weight = 4;
int32 italicAngle = 5;
int32 fontSize = 6;
bool userHeightLightColor = 7;
bool useRemoteClor = 8;
}
message TextPiece{
int32 type = 1;
TextFormat format = 2;
string stringValue = 11;
TextPieceUser userValue = 21;
}
message Image{
repeated string urlList = 1;
string uri = 2;
int64 height = 3;
int64 width = 4;
string avgColor = 5;
int32 imageType = 6;
string openWebUrl = 7;
Content content = 8;
bool isAnimated = 9;
message Content {
string name = 1;
string fontColor = 2;
int64 level = 3;
string alternativeText = 4;
}
}
message TextPieceUser{
User user = 1;
bool withColon = 2;
}
message PublicAreaCommon {
Image userLabel = 1;
int64 userConsumeInRoom = 2;
int64 userSendGiftCntInRoom = 3;
}
message GiftIMPriority {
repeated int64 queueSizes = 1;
int64 selfQueuePriority = 2;
int64 priority = 3;
}
message GiftTrayInfo{
Text trayDisplayText = 1;
Image trayBaseImg = 2;
Image trayHeadImg = 3;
Image trayRightImg = 4;
int64 trayLevel = 5;
Image trayDynamicImg = 6;
}
message GiftStruct {
Image image = 1;
string describe = 2;
bool notify = 3;
int64 duration = 4;
int64 id = 5;
GiftStructFansClubInfo fansclubInfo = 6;
bool forLinkmic = 7;
bool doodle = 8;
bool forFansclub = 9;
bool combo = 10;
int32 type = 11;
int32 diamondCount = 12;
int32 isDisplayedOnPanel = 13;
int64 primaryEffectId = 14;
Image giftLabelIcon = 15;
string name = 16;
string region = 17;
string manual = 18;
bool forCustom = 19;
map<string, int64> specialEffects = 20;
Image icon = 21;
int32 actionType = 22;
int32 watermelonSeeds = 23;
string goldEffect = 24;
repeated LuckyMoneyGiftMeta subs = 25;
int64 goldenBeans = 26;
int64 honorLevel = 27;
int32 itemType = 28;
string schemeUrl = 29;
GiftPanelOperation giftOperation = 30;
string eventName = 31;
int64 nobleLevel = 32;
string guideUrl = 33;
bool punishMedicine = 34;
bool forPortal = 35;
string businessText = 36;
bool cnyGift = 37;
int64 appId = 38;
int64 vipLevel = 39;
bool isGray = 40;
string graySchemeUrl = 41;
int64 giftScene = 42;
GiftBanner giftBanner = 43;
repeated string triggerWords = 44;
repeated GiftBuffInfo giftBuffInfos = 45;
bool forFirstRecharge = 46;
Image dynamicImgForSelected = 47;
int32 afterSendAction = 48;
int64 giftOfflineTime = 49;
string topBarText = 50;
Image topRightAvatar = 51;
string bannerSchemeUrl = 52;
bool isLocked = 53;
int64 reqExtraType = 54;
repeated int64 assetIds = 55;
GiftPreviewInfo giftPreviewInfo = 56;
GiftTip giftTip = 57;
int32 needSweepLightCount = 58;
repeated GiftGroupInfo groupInfo = 59;
message GiftStructFansClubInfo {
int32 minLevel = 1;
int32 insertPos = 2;
}
}
message AssetEffectMixInfo{
}
message LuckyMoneyGiftMeta {
}
message GiftPanelOperation {
}
message GiftBanner {
}
message GiftBuffInfo{
}
message GiftPreviewInfo{
}
message GiftTip {
}
message GiftGroupInfo {
}
message EffectMixImageInfo {
}

View File

@ -0,0 +1,12 @@
syntax = "proto3";
message WssResponse{
uint64 seqid = 1;
uint64 logid = 2;
uint64 service = 3;
uint64 method = 4;
map<string,string> headers = 5;
string payloadEncoding = 6;
string payloadType = 7;
bytes payload = 8;
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

BIN
bin/Release_2.85/v2.85.exe Normal file

Binary file not shown.

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<!--过滤Websocket数据源进程,可用','进行分隔,程序将会监听以下进程的弹幕信息-->
<add key="filterProcess" value="直播伴侣,chrome,msedge" />
<!--Websocket监听端口-->
<add key="wsListenPort" value="8888" />
<!--在控制台输出弹幕-->
<add key="printBarrage" value="on" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>

BIN
bin/Release_2.85/v2.85.pdb Normal file

Binary file not shown.

Binary file not shown.

View File

@ -21,7 +21,7 @@
"indifferent": 10,
"join": 10
},
"playSound": false
"playSound": true
},
"items": [
{
@ -42,11 +42,11 @@
"source": {
"liveRoom": {
"enabled": false,
"url": "https://v.douyin.com/hL6ehu8/"
"url": "\u65b0\u7248\u672c\u4e0d\u7528\u586b\u5199"
},
"record": {
"device": "",
"enabled": true
"enabled": false
}
}
}

View File

@ -255,10 +255,6 @@ class FeiFei:
else:
raise RuntimeError('讯飞key、yuan key、chatgpt key都没有配置')
util.log(1, '自然语言处理完成. 耗时: {} ms'.format(math.floor((time.time() - tm) * 1000)))
#同步文字内容给ue5
if text is not None and not config_util.config["interact"]["playSound"]: # 非展板播放
content = {'Topic': 'Unreal', 'Data': {'Key': 'text', 'Value': text}}
wsa_server.get_instance().add_cmd(content)
if text == '哎呀,你这么说我也不懂,详细点呗' or text == '':
util.log(1, '[!] 自然语言无语了!')
wsa_server.get_web_instance().add_cmd({"panelMsg": ""})
@ -477,6 +473,10 @@ class FeiFei:
MyThread(target=storer.storage_live_interact, args=[Interact('Fay', 0, {'user': 'Fay', 'msg': self.a_msg})]).start()
util.log(1, '合成音频...')
tm = time.time()
#文字也推送出去为了ue5
if not config_util.config["interact"]["playSound"]: # 非展板播放
content = {'Topic': 'Unreal', 'Data': {'Key': 'text', 'Value': self.a_msg}}
wsa_server.get_instance().add_cmd(content)
result = self.sp.to_sample(self.a_msg, self.__get_mood())
util.log(1, '合成音频完成. 耗时: {} ms 文件:{}'.format(math.floor((time.time() - tm) * 1000), result))
if result is not None:

View File

@ -8,6 +8,11 @@ from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
import websocket
import ssl
import subprocess
import os
import winreg
from core.interact import Interact
from scheduler.thread_manager import MyThread
@ -15,6 +20,52 @@ from utils import config_util, util
USER_URL = 'https://www.douyin.com/user/'
interact_datas = []
class WS_Client:
def __init__(self, host):
self.__ws = None
self.__host = host
self.__connect(host)
# 收到websocket消息的处理
def on_message(self, ws, message):
try:
data = json.loads(message)
if data["Type"] == 1:#留言
if len(interact_datas) >= 5:
interact_datas.pop()
interact = Interact("live", 1, {"user": json.loads(data["Data"])["User"]["Nickname"], "msg": json.loads(data["Data"])["Content"]})
interact_datas.append(interact)
if data["Type"] == 3:#进入
if len(interact_datas) >= 5:
interact_datas.pop()
interact_datas.append(Interact("live", 2, {"user": json.loads(data["Data"])["User"]["Nickname"], "msg": "来了"}))
#...
except Exception as e:
pass
# 收到websocket错误的处理
def on_close(self, ws, code, msg):
pass
# 收到websocket错误的处理
def on_error(self, ws, error):
time.sleep(5)
self.__connect(self.__host)
# 收到websocket连接建立的处理
def on_open(self, ws):
pass
def __connect(self, host):
websocket.enableTrace(False)
self.__ws = websocket.WebSocketApp(host, on_message=self.on_message)
self.__ws.on_open = self.on_open
self.__ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
def close(self):
self.__ws.close()
class Viewer:
@ -37,21 +88,53 @@ class Viewer:
self.last_interact_datas = []
self.live_started = False
self.last_chat_item_index = 0
self.dy_msg_ws = None
self.exe_process = None
def __start(self):
MyThread(target=self.__driver_alive_runnable).start()
MyThread(target=self.__run_dy_msg_ws).start() #获取抖音监听内容
# MyThread(target=self.__driver_alive_runnable).start()#直播浏览器运行
self.chrome_options = Options()
chrome_profile_path = "C:/Users/Administrator/AppData/Local/Google/Chrome/User Data"#视实际情况修改
self.chrome_options.add_argument(f"user-data-dir={chrome_profile_path}")
self.chrome_options.add_argument('--ignore-certificate-errors')
self.chrome_options.add_argument('--allow-insecure-localhost')
self.chrome_options.add_argument('--no-sandbox') # 解决沙箱模式下的限制问题
self.chrome_options.add_argument('--disable-dev-shm-usage') # 解决共享内存不足的问题
self.chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
self.chrome_options.add_argument('--disable-extensions') # 禁用扩展程序
self.chrome_options.add_argument('--disable-notifications')
self.chrome_options.add_argument('--disable-popup-blocking')
self.chrome_options.add_argument('--disable-infobars')
self.chrome_options.add_argument("--log-level=3") # 只记录错误级别的消息
#隐藏浏览器
# self.chrome_options.add_argument('--headless')
# self.chrome_options.add_argument('--blink-settings=imagesEnabled=false')
self.live_driver = webdriver.Chrome(config_util.system_chrome_driver, options=self.chrome_options)
self.live_driver.get(self.url)
# self.live_driver = webdriver.Chrome(config_util.system_chrome_driver, options=self.chrome_options)
# self.live_driver.set_page_load_timeout(60)
# self.live_driver.get(self.url)
# self.user_driver = webdriver.Chrome(config_util.system_chrome_driver, options=self.chrome_options)#抖音加了验证码,暂时不获取粉丝数
self.__wait_live_start()
self.user_sec_uid = self.__get_render_data(self.live_driver)['app']['initialState']['roomStore']['roomInfo']['room']['owner']['sec_uid']
MyThread(target=self.__live_state_runnable).start()
MyThread(target=self.__join_runnable).start()
MyThread(target=self.__interact_runnable).start()
# MyThread(target=self.__follower_runnable).start() #抖音加了验证码,暂时不获取粉丝数
# self.__wait_live_start()#等待开播
# self.user_sec_uid = self.__get_render_data(self.live_driver)['app']['initialState']['roomStore']['roomInfo']['room']['owner']['sec_uid']
# MyThread(target=self.__live_state_runnable).start()#监测直播状态
# MyThread(target=self.__join_runnable).start()#selenium监测粉丝进入
# MyThread(target=self.__interact_runnable).start()#selenium监测直播间互动留言、送礼
# MyThread(target=self.__follower_runnable).start() #selenium监测粉丝变化
self.live_started = True
MyThread(target=self.__get_package_listen_interact_runnable).start()
def __run_dy_msg_ws(self):
exe_path = "./bin/Release_2.85/v2.85.exe"
self.exe_process = subprocess.Popen([exe_path])
while self.__running:
try:
self.dy_msg_ws = WS_Client('ws://127.0.0.1:8888')
except Exception as e:
print(e)
time.sleep(5)
def start(self):
MyThread(target=self.__start).start()
@ -60,6 +143,7 @@ class Viewer:
return self.live_started
def __wait_live_start(self):
time.sleep(30)
if self.__is_live():
return
util.log(1, '等待直播开始...')
@ -256,6 +340,16 @@ class Viewer:
MyThread(target=self.on_interact, args=[interact, time.time()]).start()
# self.on_interact(interact, time.time())
#TODO Add by xszyou on 20230412.通过抓包监测互动数据
def __get_package_listen_interact_runnable(self):
while self.__running:
if not self.live_started:
continue
for interact in interact_datas:
MyThread(target=self.on_interact, args=[interact, time.time()]).start()
interact_datas.clear()
def __follower_runnable(self):
followers = -1
while self.__running:
@ -292,6 +386,33 @@ class Viewer:
self.live_driver.quit()
if self.user_driver:
self.user_driver.quit()
if self.dy_msg_ws:
self.dy_msg_ws.close()
self.dy_msg_ws = None
self.disable_windows_proxy()
subprocess.run(["taskkill", "/F", "/PID", str(self.exe_process.pid)])
#关闭系统代理
def disable_windows_proxy(self):
settings_key = r'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
try:
registry = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
settings = winreg.OpenKey(registry, settings_key, 0, winreg.KEY_WRITE)
# 设置代理启用值为0禁用
winreg.SetValueEx(settings, 'ProxyEnable', 0, winreg.REG_DWORD, 0)
# 清空代理服务器和代理覆盖设置
winreg.SetValueEx(settings, 'ProxyServer', 0, winreg.REG_SZ, '')
winreg.SetValueEx(settings, 'ProxyOverride', 0, winreg.REG_SZ, '')
winreg.CloseKey(settings)
winreg.CloseKey(registry)
util.log(1, '系统代理已关闭。')
except Exception as e:
util.log(1, '关闭系统代理时出错:', e)
@abstractmethod
def on_interact(self, interact, event_time):

BIN
images/UElucky.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
images/cs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
images/gzh.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
images/kzq.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

BIN
images/luoji.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,34 +1,31 @@
[system]
# ChromeDriver 路径(必须)
chrome_driver=./bin/chromedriver.exe
[key]
# 阿里云 实时语音识别 服务密钥(必须)
# 阿里云 实时语音识别 服务密钥必须https://ai.aliyun.com/nls/trans
ali_nls_key_id=
ali_nls_key_secret=
ali_nls_app_key=
# 微软 文字转语音 服务密钥(必须)
# 微软 文字转语音 服务密钥(必须,使用可产生不同情绪的音频https://azure.microsoft.com/zh-cn/services/cognitive-services/text-to-speech/
ms_tts_key=
ms_tts_region=
# 讯飞 情绪分析 服务密钥
# 讯飞 情绪分析 服务密钥 https://www.xfyun.cn/service/emotion-analysis/
xf_ltp_app_id=
xf_ltp_api_key=
#NLP三选一:xfaiui、yuan、chatgpt
chat_module=xfaiui
# 讯飞 自然语言处理 服务密钥(NLP3选1)
# 讯飞 自然语言处理 服务密钥(NLP3选1) https://aiui.xfyun.cn/solution/webapi/
xf_aiui_app_id=
xf_aiui_api_key=
#yuan_1_0 对话机器人 服务密钥(NLP3选1)
#浪.潮源大模型 服务密钥(NLP3选1) https://air.inspur.com/
yuan_1_0_account=
yuan_1_0_phone=
#chatgpt 对话机器人 服务密钥(NLP3选1)
#gpt 服务密钥(NLP3选1) https://openai.com/
chatgpt_api_key=
#ngrok.cc 内网穿透id非必须
#ngrok内网穿透id远程设备可以通过互联网连接Fay(非必须)http://ngrok.cc
ngrok_cc_id=

3
test/test_rpa.py Normal file
View File

@ -0,0 +1,3 @@
import rpa as r
r.init()
r.url('https://baidu.com')

View File

@ -25,7 +25,6 @@ key_chat_module = None
def load_config():
global config
global system_config
global system_chrome_driver
global key_ali_nls_key_id
global key_ali_nls_key_secret
global key_ali_nls_app_key
@ -43,7 +42,6 @@ def load_config():
system_config = ConfigParser()
system_config.read('system.conf', encoding='UTF-8')
system_chrome_driver = os.path.abspath(system_config.get('system', 'chrome_driver'))
key_ali_nls_key_id = system_config.get('key', 'ali_nls_key_id')
key_ali_nls_key_secret = system_config.get('key', 'ali_nls_key_secret')
key_ali_nls_app_key = system_config.get('key', 'ali_nls_app_key')