├── Assets ├── Make │ ├── .gitignore │ ├── sniper_stock.jpg │ ├── knockdown_shield.jpg │ ├── extended_sniper_mag.jpg │ ├── mobile_respawn_beacon.jpg │ ├── optic_variable_sniper.jpg │ └── skullpiercer_rifling.jpg ├── Map │ ├── .gitignore │ ├── Fragment.jpg │ ├── Olympus.jpg │ ├── Overflow.jpg │ ├── Habitat 4.jpg │ ├── Kings Canyon.jpg │ ├── Phase Runner.jpg │ └── World's Edge.jpg ├── QQ_EA_ID.json ├── Rank │ ├── .gitignore │ ├── Bronze1.png │ ├── Bronze2.png │ ├── Bronze3.png │ ├── Bronze4.png │ ├── Gold1.png │ ├── Gold2.png │ ├── Gold3.png │ ├── Gold4.png │ ├── Master1.png │ ├── Rookie2.png │ ├── Rookie4.png │ ├── Silver1.png │ ├── Silver2.png │ ├── Silver3.png │ ├── Diamond1.png │ ├── Diamond2.png │ ├── Diamond4.png │ ├── Platinum1.png │ ├── Platinum2.png │ ├── Platinum3.png │ ├── Platinum4.png │ └── Unranked0.png ├── Rank_Data.json ├── Temp │ └── .gitignore ├── Legend │ ├── .gitignore │ ├── Alter.png │ ├── Ash.png │ ├── Fuse.png │ ├── Loba.png │ ├── Seer.png │ ├── Conduit.png │ ├── Crypto.png │ ├── Horizon.png │ ├── Octane.png │ ├── Vantage.png │ ├── Wraith.png │ ├── Ballistic.png │ ├── Bangalore.png │ ├── Bloodhound.png │ ├── Catalyst.png │ ├── Gibraltar.png │ ├── Lifeline.png │ ├── Mad Maggie.png │ ├── Newcastle.png │ ├── Pathfinder.png │ ├── Valkyrie.png │ └── Wraith-1.png ├── Font.ttf └── Template │ ├── ls.jpg │ ├── info.jpg │ └── nopic.png ├── requirements.txt ├── LICENSE ├── utils.py ├── README.md ├── config.py └── __init__.py /Assets/Make/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Assets/Map/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Assets/QQ_EA_ID.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Assets/Rank/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Assets/Rank_Data.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /Assets/Temp/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Assets/Legend/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | opencv_python 2 | Pillow 3 | numpy -------------------------------------------------------------------------------- /Assets/Font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Font.ttf -------------------------------------------------------------------------------- /Assets/Legend/Alter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Alter.png -------------------------------------------------------------------------------- /Assets/Legend/Ash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Ash.png -------------------------------------------------------------------------------- /Assets/Legend/Fuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Fuse.png -------------------------------------------------------------------------------- /Assets/Legend/Loba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Loba.png -------------------------------------------------------------------------------- /Assets/Legend/Seer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Seer.png -------------------------------------------------------------------------------- /Assets/Map/Fragment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Fragment.jpg -------------------------------------------------------------------------------- /Assets/Map/Olympus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Olympus.jpg -------------------------------------------------------------------------------- /Assets/Map/Overflow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Overflow.jpg -------------------------------------------------------------------------------- /Assets/Rank/Bronze1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Bronze1.png -------------------------------------------------------------------------------- /Assets/Rank/Bronze2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Bronze2.png -------------------------------------------------------------------------------- /Assets/Rank/Bronze3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Bronze3.png -------------------------------------------------------------------------------- /Assets/Rank/Bronze4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Bronze4.png -------------------------------------------------------------------------------- /Assets/Rank/Gold1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Gold1.png -------------------------------------------------------------------------------- /Assets/Rank/Gold2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Gold2.png -------------------------------------------------------------------------------- /Assets/Rank/Gold3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Gold3.png -------------------------------------------------------------------------------- /Assets/Rank/Gold4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Gold4.png -------------------------------------------------------------------------------- /Assets/Rank/Master1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Master1.png -------------------------------------------------------------------------------- /Assets/Rank/Rookie2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Rookie2.png -------------------------------------------------------------------------------- /Assets/Rank/Rookie4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Rookie4.png -------------------------------------------------------------------------------- /Assets/Rank/Silver1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Silver1.png -------------------------------------------------------------------------------- /Assets/Rank/Silver2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Silver2.png -------------------------------------------------------------------------------- /Assets/Rank/Silver3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Silver3.png -------------------------------------------------------------------------------- /Assets/Template/ls.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Template/ls.jpg -------------------------------------------------------------------------------- /Assets/Legend/Conduit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Conduit.png -------------------------------------------------------------------------------- /Assets/Legend/Crypto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Crypto.png -------------------------------------------------------------------------------- /Assets/Legend/Horizon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Horizon.png -------------------------------------------------------------------------------- /Assets/Legend/Octane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Octane.png -------------------------------------------------------------------------------- /Assets/Legend/Vantage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Vantage.png -------------------------------------------------------------------------------- /Assets/Legend/Wraith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Wraith.png -------------------------------------------------------------------------------- /Assets/Map/Habitat 4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Habitat 4.jpg -------------------------------------------------------------------------------- /Assets/Rank/Diamond1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Diamond1.png -------------------------------------------------------------------------------- /Assets/Rank/Diamond2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Diamond2.png -------------------------------------------------------------------------------- /Assets/Rank/Diamond4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Diamond4.png -------------------------------------------------------------------------------- /Assets/Rank/Platinum1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Platinum1.png -------------------------------------------------------------------------------- /Assets/Rank/Platinum2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Platinum2.png -------------------------------------------------------------------------------- /Assets/Rank/Platinum3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Platinum3.png -------------------------------------------------------------------------------- /Assets/Rank/Platinum4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Platinum4.png -------------------------------------------------------------------------------- /Assets/Rank/Unranked0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Rank/Unranked0.png -------------------------------------------------------------------------------- /Assets/Template/info.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Template/info.jpg -------------------------------------------------------------------------------- /Assets/Template/nopic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Template/nopic.png -------------------------------------------------------------------------------- /Assets/Legend/Ballistic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Ballistic.png -------------------------------------------------------------------------------- /Assets/Legend/Bangalore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Bangalore.png -------------------------------------------------------------------------------- /Assets/Legend/Bloodhound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Bloodhound.png -------------------------------------------------------------------------------- /Assets/Legend/Catalyst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Catalyst.png -------------------------------------------------------------------------------- /Assets/Legend/Gibraltar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Gibraltar.png -------------------------------------------------------------------------------- /Assets/Legend/Lifeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Lifeline.png -------------------------------------------------------------------------------- /Assets/Legend/Mad Maggie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Mad Maggie.png -------------------------------------------------------------------------------- /Assets/Legend/Newcastle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Newcastle.png -------------------------------------------------------------------------------- /Assets/Legend/Pathfinder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Pathfinder.png -------------------------------------------------------------------------------- /Assets/Legend/Valkyrie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Valkyrie.png -------------------------------------------------------------------------------- /Assets/Legend/Wraith-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Legend/Wraith-1.png -------------------------------------------------------------------------------- /Assets/Make/sniper_stock.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/sniper_stock.jpg -------------------------------------------------------------------------------- /Assets/Map/Kings Canyon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Kings Canyon.jpg -------------------------------------------------------------------------------- /Assets/Map/Phase Runner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/Phase Runner.jpg -------------------------------------------------------------------------------- /Assets/Map/World's Edge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Map/World's Edge.jpg -------------------------------------------------------------------------------- /Assets/Make/knockdown_shield.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/knockdown_shield.jpg -------------------------------------------------------------------------------- /Assets/Make/extended_sniper_mag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/extended_sniper_mag.jpg -------------------------------------------------------------------------------- /Assets/Make/mobile_respawn_beacon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/mobile_respawn_beacon.jpg -------------------------------------------------------------------------------- /Assets/Make/optic_variable_sniper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/optic_variable_sniper.jpg -------------------------------------------------------------------------------- /Assets/Make/skullpiercer_rifling.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AreCie/Apex_Tool/HEAD/Assets/Make/skullpiercer_rifling.jpg -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 捡咸鱼的二七 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | from PIL import Image, ImageDraw, ImageFont 3 | from nonebot.log import logger 4 | from pathlib import Path 5 | import os 6 | import cv2 7 | from .config import * 8 | from utils.http_utils import AsyncHttpx 9 | import numpy as np 10 | 11 | 12 | async def addText(img, size, text, x, y, color=(255, 255, 255)): 13 | draw = ImageDraw.Draw(img) 14 | typeface = ImageFont.truetype(Font_Path, size) 15 | draw.text((x, y), text, font=typeface, fill=color) 16 | return draw 17 | 18 | 19 | def progressBar(img, bgcolor, color, x, y, w, h, progress): 20 | drawObject = ImageDraw.Draw(img) 21 | 22 | '''BG''' 23 | drawObject.ellipse((x + w, y, x + h + w, y + h), fill=bgcolor) 24 | drawObject.ellipse((x, y, x + h, y + h), fill=bgcolor) 25 | drawObject.rectangle((x + (h / 2), y, x + w + (h / 2), y + h), fill=bgcolor) 26 | 27 | '''PROGRESS''' 28 | if (progress <= 0): 29 | progress = 0.01 30 | if (progress > 1): 31 | progress = 1 32 | w = w * progress 33 | drawObject.ellipse((x + w, y, x + h + w, y + h), fill=color) 34 | drawObject.ellipse((x, y, x + h, y + h), fill=color) 35 | drawObject.rectangle((x + (h / 2), y, x + w + (h / 2), y + h), fill=color) 36 | 37 | '''SAVE''' 38 | # im.save(imgPath) 39 | 40 | 41 | async def isHasImg(path, url): 42 | if not os.path.lexists(path): 43 | logger.info(f'图片【{path}】不存在,将从【{url}】下载') 44 | img = await AsyncHttpx.get(url) 45 | if img.status_code == 200: 46 | with open(path, 'wb') as f: 47 | f.write(img.content) 48 | f.close() 49 | logger.info(f"保存成功【{path}】") 50 | if path.rsplit(".", 1)[1] == "jpg": 51 | img = cv2.imread(path, 1) 52 | cv2.imwrite(path, img, [cv2.IMWRITE_JPEG_QUALITY, 30]) 53 | else: 54 | # Download failed, use a blank black image 55 | img = np.zeros((300, 960, 3), np.uint8) 56 | img.fill(0) 57 | cv2.imwrite(path, img) 58 | logger.info(f"下载失败,使用空白黑色图片【{path}】") 59 | else: 60 | logger.info(f"已有图片【{path}】") 61 | return True 62 | 63 | 64 | def loadEAIDJson(): 65 | target_file = open(Bind_EAID_JSON, 'r+') 66 | try: 67 | QQ_EA = json.load(target_file) 68 | except Exception as e: 69 | print(e) 70 | QQ_EA = {} 71 | target_file.close() 72 | return QQ_EA 73 | 74 | def writeEAID(js): 75 | target_file = open(Bind_EAID_JSON, 'w+') 76 | json.dump(js, target_file) 77 | target_file.close() 78 | return 79 | 80 | def loadRankJson(): 81 | target_file = open(Rank_JSON, 'r+') 82 | try: 83 | Rank_Data = json.load(target_file) 84 | except Exception as e: 85 | print(e) 86 | Rank_Data = {} 87 | target_file.close() 88 | return Rank_Data 89 | 90 | def writeRankData(js): 91 | target_file = open(Rank_JSON, 'w+') 92 | json.dump(js, target_file) 93 | target_file.close() 94 | return 95 | 96 | 97 | def isHasKey(key, dic): 98 | for d in dic: 99 | if key and d.lower() in key.lower(): 100 | return True, dic[d] 101 | return False, "" 102 | 103 | 104 | def ysImg(inPath): 105 | im = Image.open(inPath) 106 | (x, y) = im.size 107 | x_s = 1000 108 | y_s = int(y * x_s / x) 109 | out = im.resize((x_s, y_s)) 110 | out.save(inPath) 111 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![OSCS Status](https://www.oscs1024.com/platform/badge/AreCie/Apex_Tool.svg?size=large)](https://www.oscs1024.com/project/AreCie/Apex_Tool?ref=badge_large) 2 | 3 | # Apex_Tool APEX英雄QQBot信息查询 4 | 适用于[绪山真寻Bot](https://github.com/HibiKier/zhenxun_bot) ,``nonebot2``使用的话,需要稍加更改,可以参考这个[nonebot2 中使用该插件](https://github.com/AreCie/Apex_Tool/issues/9#issuecomment-1218910846) 5 | 6 | # 更新日志 7 | 8 | - ### 2023/00/27 v1.8.0 9 | 10 | - 修复脚本中版本号没有更新的遗漏 11 | - 指令现在不区分大小写,如 ``查询 [a查询,A查询]`` 12 | - 增加增加导线管、变换图片资源及翻译 13 | - 删除侵蚀不合大小的图片资源 14 | - 针对部分未填写API Token的情况进行了错误描述优化 15 | - 针对``Lagrange.Core及Lagrange.OneBot``进行了发送图片的适配,避免出错 16 | - 暂时移除竞技场排位的标识 17 | 18 | - ### 2023/07/03 v1.7.1 19 | 20 | - 增加对错误结果的处理,出现错误时将返回更加具体的错误信息(如请求过快或找不到用户等) 21 | 22 | - ### 2023/06/17 v1.7.0 23 | 24 | - 优化ReadMe中更新日志条目的显示 25 | - 更换英雄图片,采用更加美观的图片 26 | - 增加rank数据的查询记录,并给出相较于上次查询的分数变动 27 | - 修复当api中没有下一张地图的数据时的处理 28 | - 修复娱乐模式没有图片资源导致的报错(实在没有图片资源时会直接使用黑色背景代替,未实际测试) 29 | - 采用地图名称而非模式代码作为地图图片资源的文件名(大概,可节约空间) 30 | - 去除地图查询中对竞技场的显示(已经结束哩) 31 | - 增加部分娱乐模式的地图名称翻译 32 | - 增加新英雄的翻译和图片资源(似乎弹道的图片资源api所给网址不存在资源) 33 | 34 | - ### 2022/10/21 v1.6.0 35 | 36 | - 修复因真寻Bot更新造成的错误(其实是我自己铸币) 37 | 38 | - ### 2022/10/06 v1.5.0 39 | - 完善帮助文档,非首次安装用户,需删除真寻Bot``/data/configs``目录下``plugins2settings.yaml``文件中该查询的配置``Apex_Tool`` 40 | 41 | - 帮助命令使用:艾特你的Bot,然后``帮助 [派派, 派, Apex, apex, APEX]``,中括号中任意一个即可,或者使用``派帮助/派命令/a帮助/a命令``其中任意一个即可 42 | 43 | - ### 2022/09/25 v1.4.0 44 | - 增加对`没有找到玩家信息/烂橘子ID错误`时的判断,增长请求数据的超时时间 45 | 46 | - ### 2022/09/02 v1.3.0 47 | - 增加对私聊的支持 48 | 49 | - ### 2022/08/18 v1.2.0 50 | - 优化代码,去除无用的依赖,去除有问题的状态码判断(官方文档提供的状态码和说明有偏差,索性直接去掉判断),调整说明文档 51 | 52 | - ### 2022/08/17 v1.1.0 53 | - 修复使用代理时造成的错误 54 | 55 | - ### 2022/08/16 v1.0.0 56 | - 优化代码逻辑,对图片进行压缩,提升处理、响应速度,部分追踪器汉化修正。 57 | 58 | 59 | # 关于追踪器汉化 60 | 追踪器汉化只是试验阶段,如果有不正确或者未显示汉化的,及时提出,谢谢。 61 | 62 | # 关于图片资源 63 | 所用到的图片素材都是下载自接口,因为接口是国外的,所以国内部署的QQBot使用的话,下载会很慢,具体表现为查询时等待时间过长,但第二次同样内容的查询会比之前快很多。 64 | 65 | 所以为了提高体验效果,我这里提供了部分处理好的图片素材,用的你们最爱的蓝奏云,下载后直接覆盖到Assets文件夹里即可。 66 | 67 | 下载地址:[点我下载](https://wws.lanzoub.com/i5KER0bn0oih) 68 | 69 | # 目前功能及对应命令 70 | **查询地图轮换**:【a地图】 71 | 72 | **查询制造轮换**:【a制造】 73 | 74 | **查询猎杀信息**:【a猎杀】 75 | 76 | **绑定烂橘子ID**:【a绑定 烂橘子ID】 77 | 78 | **查询玩家信息**:【a查询】(这个需先绑定烂橘子ID)、【a查询 烂橘子ID】 79 | 80 | # 功能展示 81 | ![a地图](https://github.com/newton-miku/ImgStorage/blob/main/Blog/a%E5%9C%B0%E5%9B%BE.png?raw=true) 82 | ![O_GMHBEG5{QW{0$GA@IS9SI](https://user-images.githubusercontent.com/41849402/170845801-e0ddc0d3-f44b-4aa6-b51b-1e21d7be7653.png) 83 | ![4(O6QJ~8C@V3T3{B3}RL )W](https://user-images.githubusercontent.com/41849402/170845803-421213e7-5f48-42c8-8afd-faddf933160b.png) 84 | ![RG7{{~%DV~SAJD`})EUJ{RB](https://user-images.githubusercontent.com/41849402/170845806-c37feb98-88c8-42c7-98df-499d7841fa80.png) 85 | ![a查询截图](https://raw.githubusercontent.com/newton-miku/ImgStorage/main/Blog/a%E6%9F%A5%E8%AF%A2.png) 86 | 87 | # 使用方法 88 | 1、先将该插件下载下来,将文件夹名字改为【Apex_Tool】 89 | 90 | 2、访问这个网站 https://portal.apexlegendsapi.com/ 获取token 91 | 92 | 3、打开该插件中的【config.py】文件 93 | 94 | 4、将步骤2获取的token填入到【Tool_Token】字段中 95 | 96 | 5、将改好的插件放到[绪山真寻Bot](https://github.com/HibiKier/zhenxun_bot)的【plugins】文件夹下 97 | 98 | 6、在虚拟环境下安装该插件的依赖文件【requirements.txt】,安装方法: 99 | 100 | ```shell 101 | pip install -r [插件路径]/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 102 | ``` 103 | 104 | 也可以直接用下面这条命令安装: 105 | ```shell 106 | pip install opencv_python Pillow numpy -i https://pypi.tuna.tsinghua.edu.cn/simple 107 | ``` 108 | 109 | 主要就是安装两个依赖:```opencv-python #cv2```、```Pillow #PIL``` 110 | 111 | (```opencv-python #cv2```安装``真寻Bot``时在安装依赖那步好像有安装,不太确定。) 112 | 113 | 114 | 6、重启[绪山真寻Bot](https://github.com/HibiKier/zhenxun_bot)即可 115 | 116 | 帮助命令使用:艾特你的Bot,然后``帮助 [派派, 派, Apex, apex, APEX]``,中括号中任意一个即可,或者使用``派帮助/派命令/a帮助/a命令``其中任意一个即可 117 | 118 | 注意: 文件夹的名字一定要是【Apex_Tool】 119 | # 题外话 120 | 因本人主修C#,Python只有自学的程度,某些地方写的可能没那么完美,有能力的可以自己优化下,就这样 121 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # API Token 4 | Tool_Token = "" 5 | 6 | # 此插件根目录 7 | Tool_Path = os.path.dirname(__file__) 8 | # 此插件资源目录 9 | Tool_Assets_Path = f"{Tool_Path}/Assets" 10 | # QQ绑定的EAID的Json文件路径 11 | Bind_EAID_JSON = f"{Tool_Path}/Assets/QQ_EA_ID.json" 12 | # EAID的RankJson文件路径 13 | Rank_JSON = f"{Tool_Path}/Assets/Rank_Data.json" 14 | # 字体文件路径 15 | Font_Path = f"{Tool_Assets_Path}/Font.ttf" 16 | # 地图图片资源目录 17 | Map_Path = f"{Tool_Assets_Path}/Map" 18 | # 制造器图片资源目录 19 | Make_Path = f"{Tool_Assets_Path}/Make" 20 | # 段位图片资源目录 21 | Rank_Path = f"{Tool_Assets_Path}/Rank" 22 | # 传奇图片资源目录 23 | Legend_Path = f"{Tool_Assets_Path}/Legend" 24 | # 模板图片资源目录 25 | Template_Path = f"{Tool_Assets_Path}/Template" 26 | # 临时资源目录 27 | Temp_Path = f"{Tool_Assets_Path}/Temp" 28 | 29 | # 地图名称对照 30 | Map_Dict = { 31 | "worlds_edge_rotation": "世界尽头", 32 | "storm_point_rotation": "风暴点", 33 | "arenas_encore": "再来一次", 34 | "arenas_party_crasher": "派对破坏者", 35 | "caustic_tt_rotation": "毒气室", 36 | "hammond_labs_rotation": "哈蒙德实验室", 37 | "olympus_rotation": "奥林匹斯", 38 | "arenas_composite": "原料厂", 39 | "arenas_overflow": "熔岩流", 40 | "arenas_habitat": "栖息地4", 41 | "kings_canyon_rotation": "诸王峡谷", 42 | "arenas_phase_runner": "相位穿梭器", 43 | "broken_moon_rotation": "破碎月球", 44 | "freedm_tdm_habitat": "栖息地(团队竞技)", 45 | "freedm_swat_habitat": "栖息地(死亡之眼-无护盾)", 46 | "control_canyonlands_caustic": "诸王峡谷(控制)", 47 | "control_tropics_barometer": "晴雨表(控制)", 48 | "freedm_tdm_skulltown": "骷髅镇(团队竞技)", 49 | "freedm_gungame_wall": "高墙(枪王)", 50 | "control_desertlands_siphon": "熔岩虹吸(枪王)", 51 | "freedm_tdm_overflow": "熔岩流(团队竞技)", 52 | "freedm_swat_overflow": "熔岩流(死亡之眼-无护盾)", 53 | "freedm_gungame_skulltown": "骷髅镇(子弹时间)", 54 | "freedm_gungame_estates": "不动产(子弹时间)", 55 | "freedm_tdm_phase_runner": "相位穿梭器(团队死斗)", 56 | "freedm_swat_phase_runner": "相位穿梭器(死亡之眼-无护盾)", 57 | } 58 | 59 | # 游戏模式对照 60 | GameMode_Dict = { 61 | "battle_royale": "匹配", 62 | "arenas": "竞技场", 63 | "ranked": "排位", 64 | "arenasRanked": "竞技场排位", 65 | "control": "控制", 66 | "freenom": "枪王模式", 67 | "ltm": "娱乐模式", 68 | } 69 | 70 | # 传奇名字对照 71 | Legend_Dict = { 72 | "Revenant": "亡灵", 73 | "Crypto": "密客", 74 | "Horizon": "地平线", 75 | "Gibraltar": "直布罗陀", 76 | "Wattson": "华森", 77 | "Fuse": "暴雷", 78 | "Bangalore": "班加罗尔", 79 | "Wraith": "恶灵", 80 | "Octane": "动力小子", 81 | "Bloodhound": "寻血猎犬", 82 | "Caustic": "侵蚀", 83 | "Lifeline": "命脉", 84 | "Pathfinder": "探路者", 85 | "Loba": "罗芭", 86 | "Mirage": "幻象", 87 | "Rampart": "兰伯特", 88 | "Valkyrie": "瓦尔基里", 89 | "Seer": "希尔", 90 | "Ash": "艾许", 91 | "Mad Maggie": "疯玛吉", 92 | "Newcastle": "纽卡斯尔", 93 | "Vantage": "万蒂奇", 94 | "Catalyst": "卡特莉丝", 95 | "Ballistic": "弹道", 96 | "Conduit": "导线管", 97 | "Alter": "变换", 98 | } 99 | 100 | # 追踪器对照 101 | Tracker = { 102 | # 赛季 103 | "BR Season 15 kills": "第15赛季Apex击杀数", 104 | "BR Season 15 wins": "第15赛季Apex胜场数", 105 | "BR Season 14 kills": "第14赛季Apex击杀数", 106 | "BR Season 14 wins": "第14赛季Apex胜场数", 107 | "BR Season 13 kills": "第13赛季Apex击杀数", 108 | "BR Season 13 wins": "第13赛季Apex胜场数", 109 | "BR Season 12 kills": "第12赛季Apex击杀数", 110 | "BR Season 12 wins": "第12赛季Apex胜场数", 111 | "BR Season 11 kills": "第11赛季Apex击杀数", 112 | "BR Season 11 wins": "第11赛季Apex胜场数", 113 | "BR Season 10 kills": "第10赛季Apex击杀数", 114 | "BR Season 10 wins": "第10赛季Apex胜场数", 115 | "BR Season 9 kills": "第9赛季Apex击杀数", 116 | "BR Season 9 wins": "第9赛季Apex胜场数", 117 | "BR Season 8 kills": "第8赛季Apex击杀数", 118 | "BR Season 8 wins": "第8赛季Apex胜场数", 119 | "BR Season 7 kills": "第7赛季Apex击杀数", 120 | "BR Season 7 wins": "第7赛季Apex胜场数", 121 | "BR Season 6 kills": "第6赛季Apex击杀数", 122 | "BR Season 6 wins": "第6赛季Apex胜场数", 123 | "BR Season 5 kills": "第5赛季Apex击杀数", 124 | "BR Season 5 wins": "第5赛季Apex胜场数", 125 | "BR Season 4 kills": "第4赛季Apex击杀数", 126 | "BR Season 4 wins": "第4赛季Apex胜场数", 127 | "BR Season 3 kills": "第3赛季Apex击杀数", 128 | "BR Season 3 wins": "第3赛季Apex胜场数", 129 | "BR Season 2 kills": "第2赛季Apex击杀数", 130 | "BR Season 2 wins": "第2赛季Apex胜场数", 131 | "BR Season 1 kills": "第1赛季Apex击杀数", 132 | "BR Season 1 wins": "第1赛季Apex胜场数", 133 | 134 | # 通用 135 | "Scout of Action": "侦察行动", 136 | "Smoke Show": "烟幕表演", 137 | "Jackson's Bow Out": "杰克逊的谢幕", 138 | "Arenas Wins": "竞技场获胜数", 139 | "Arenas Kills": "竞技场击杀数", 140 | "Arenas Damage": "竞技场模式伤害", 141 | "BR Special event wins": "Apex获胜数", 142 | "BR Special event damage": "Apex伤害数", 143 | "BR Special event kills": "Apex击杀数", 144 | "BR Kills": "Apex击杀数", 145 | "BR Damage": "Apex伤害", 146 | "BR Wins": "Apex胜场数", 147 | "BR Executions": "Apex终结数", 148 | "BR Kills as Kill Leader": "作为击杀王的Apex击杀数", 149 | "BR Headshots": "Apex爆头数", 150 | "BR Finishers": "Apex终结技次数", 151 | "BR Revives": "Apex急救次数", 152 | "BR Games Played": "Apex已进行的游戏", 153 | "BR Wins with Full Squad Alive": "小队无人阵亡获得的Apex胜场数", 154 | "BR Top 3": "排名前3的Apex次数", 155 | "BR AR kills": "Apex突击步枪击杀数", 156 | "BR LMG kills": "Apex轻机枪击杀数", 157 | "BR Marksman kills": "Apex神射手击杀数", 158 | "BR Pistol kills": "Apex手枪击杀数", 159 | "BR Shotgun kills": "Apex霰弹枪击杀数", 160 | "BR SMG kills": "Apex冲锋枪击杀数", 161 | "BR Sniper kills": "Apex狙击枪击杀数", 162 | "BR Care Package Weapon kills": "Apex补给仓武器击杀数", 163 | 164 | # 寻血猎犬 165 | "Eye: Enemies Scanned": "发现-扫描到敌人", 166 | "Eye: Traps Scanned": "发现-扫描到陷阱", 167 | "Beast of the Hunt: Kills": "狂野猎人-击杀数", 168 | 169 | # 直布罗陀 170 | "Dome: Damage Blocked": "穹顶-阻挡的伤害", 171 | "Bombardment: Kills": "轰炸-击杀数", 172 | "GunShield: Damage Blocked": "枪盾-阻挡的伤害", 173 | 174 | # 命脉 175 | "D.O.C. Drone: Squadmates Revived": "D.O.C无人机-已复活小队成员", 176 | "D.O.C. Drone: Healing": "D.O.C无人机-治疗量", 177 | "Droppod: Items for Squadmates": "降落仓-小队成员获得的物品", 178 | 179 | # 探路者 180 | "Grapple: Travel Distance": "抓钩-移动距离", 181 | "Zipline: Times used by Squad": "滑索-小队使用次数", 182 | "Survey: Beacons Scanned": "侦察-扫描信标数", 183 | 184 | # 恶灵 185 | "Voices: Warnings Heard": "声音-听到的警告次数", 186 | "Into the void: Time": "踏入虚空-时间", 187 | "Rifts: Squadmates Phased": "裂隙-相位移动的小队成员", 188 | 189 | # 班加罗尔 190 | "Double Time: Distance": "双倍时间-距离", 191 | "Smoke Grenade: Enemies Hit": "烟雾弹-击中的敌人", 192 | "Rolling Thunder: Damage": "雷声滚滚-伤害", 193 | 194 | # 侵蚀 195 | "Gas Trap: Times Activated": "毒气陷阱-触发次数", 196 | "NOX: Gas Damage Dealt": "NOX-毒气造成的伤害", 197 | "NOX: Gassed Enemies Killed": "NOX-毒气的击杀数", 198 | 199 | # 幻象 200 | "Encore: Executions Escaped": "再来一次-逃脱处决次数", 201 | "Decoys Created": "制造诱饵", 202 | "Bamboozles": "骗术成功次数", 203 | 204 | # 动力小子 205 | "Stim Distance Traveled": "兴奋剂移动距离", 206 | "Jump Pad Allies Launched": "跳板发射队友", 207 | "Passive Health Regenerated": "被动恢复生命值", 208 | 209 | # 沃特森 210 | "Breaches Detected": "检测到违规", 211 | "Friendly Shields Charged": "友方护盾已充能", 212 | "Enemy Ordnance Intercepted": "已拦截敌方轰炸火力", 213 | 214 | # 密客 215 | "Neurolink: Enemies Scanned": "神经连接-扫描到敌人", 216 | "Drone EMP: Shield Damage": "无人机 电子脉冲-护盾伤害", 217 | "Drone EMP: Devices Hit": "无人机 电子脉冲-设备命中", 218 | 219 | # 亡灵 220 | "Silence: Enemies Silenced": "静默-被静默的敌人", 221 | "Silence: Silenced Knockdowns": "静默-静默击倒", 222 | "Death Totem: Activations": "死亡图腾-激活", 223 | 224 | # 罗芭 225 | "Loot Pinged Through Walls": "透过墙壁标记的战利品数", 226 | "Meters Teleported": "传送距离", 227 | "Loot Taken by Allies": "队友拿到的战利品数", 228 | 229 | # 兰伯特 230 | "Wall: Bullets Amped": "墙体-强化子弹", 231 | "Wall: Damage Blocked": "墙体-阻挡伤害", 232 | "Turret: Bullets Fired": "炮台-发射子弹", 233 | 234 | # 地平线 235 | "Spacewalk: Impacts Avoided": "太空漫步-避免猛烈冲击", 236 | "Gravity Lift: Teammates Lifted": "重力电梯-承载过的队友", 237 | "Black Hole: Damage Done": "大逃杀 黑洞-伤害", 238 | 239 | # 暴雷 240 | "Grenades: Distance Thrown": "手雷-远距离投掷", 241 | "Knuckle Cluster: Total Hits": "集束炸弹-总命中次数", 242 | "Motherload: Enemies Captured": "广域轰炸-捕获敌人数", 243 | 244 | # 瓦尔基里 245 | "VTOL Jets: Distance Travelled": "垂直起降喷射器-移动距离累计", 246 | "Missile Swarm: Enemies Hit": "飞弹流星-击中的敌人数量", 247 | "Skyward Dive: Allies Repositioned": "天际俯冲-移动队友次数", 248 | 249 | # 希尔 250 | "Heart Seeker: Heartbeats Heard": "觅心者-已听到心跳数", 251 | "Focus of Attention: Enemies Hit": "聚焦之眼-击中的敌人", 252 | "Exhibit: Enemies Tracked": "一览无余-追踪到的敌人", 253 | 254 | # 艾许 255 | "Marked for Death: Enemies Marked": "死亡印记-标记敌人", 256 | "Arc Snare: Enemies Tethered": "电弧陷阱-绊索敌人", 257 | "Phase Breach: Players Phased": "相位突破-已传送玩家", 258 | 259 | # 疯玛吉 260 | "Warlord's Ire: Highlight Time": "战争领主之怒-高亮时间", 261 | "Riot Drill: Drill Distance": "暴乱训练-训练距离", 262 | "Wrecking Ball: Boosted Travel Distance": "破坏球-提升移动距离", 263 | 264 | # 纽卡斯尔 265 | "Retrieve the Wounded: Revive Distance": "救助伤员-急救距离", 266 | "Mobile Shield: Damage Blocked": "机动护盾-阻挡的伤害", 267 | "Castle Wall: Allies Rescued": "护城铁壁-救援的盟友", 268 | } 269 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | from nonebot import on_command 2 | from nonebot.params import CommandArg, ArgStr 3 | from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, Event, PrivateMessageEvent, GroupMessageEvent 4 | from services.log import logger 5 | from PIL import Image, ImageDraw, ImageFont 6 | from utils.http_utils import AsyncHttpx 7 | from .config import * 8 | from .utils import * 9 | from datetime import datetime 10 | import json 11 | 12 | __zx_plugin_name__ = "APEX查询工具" 13 | __plugin_usage__ = """ 14 | usage: 15 | 查询APEX地图轮换、制造机轮换、猎杀信息、玩家信息 16 | 指令: 17 | a地图: 查询地图轮换 18 | a制造: 查询复制器轮换 19 | a猎杀: 查询当前赛季各平台猎杀信息 20 | a查询: 查询绑定的[烂橘子ID]的玩家信息 21 | a绑定 [烂橘子ID]: 将[烂橘子ID]与当前QQ绑定 22 | a查询 [烂橘子ID]: 查询[烂橘子ID]的玩家信息 23 | 注: 命令中的[烂橘子ID]使用时不带中括号,示例: a查询 ABC 24 | 查看此插件帮助: 派帮助/派命令/a帮助/a命令 25 | """.strip() 26 | __plugin_des__ = "查询APEX地图轮换、制造机轮换、猎杀信息、玩家信息" 27 | __plugin_cmd__ = ["a地图", "a制造", "a猎杀", "a绑定 烂橘子ID", "a查询/a查询 [烂橘子ID]"] 28 | __plugin_version__ = 1.8 29 | __plugin_author__ = "AreCie" 30 | __plugin_settings__ = { 31 | "cmd": ["派派", "派", "Apex", "apex", "APEX"] 32 | } 33 | 34 | apexdt = on_command("a地图", aliases={"A地图"}, priority=5, block=True) 35 | apexzz = on_command("a制造", aliases={"A制造"}, priority=5, block=True) 36 | apexls = on_command("a猎杀", aliases={"A猎杀"}, priority=5, block=True) 37 | apexcx = on_command("a查询", aliases={"A查询"}, priority=5, block=True) 38 | apexbind = on_command("a绑定", aliases={"A绑定"}, priority=5, block=True) 39 | apexhelp = on_command("派命令", aliases={"a帮助", "a命令", "派帮助"}, priority=5, block=True) 40 | 41 | 42 | async def GetData(bot: Bot, url: str): 43 | text = None 44 | isSucc = False 45 | 46 | try: 47 | res = await AsyncHttpx.post(url, timeout=180) 48 | code = res.status_code 49 | logger.info(f'请求{url}时返回的状态码:【{code}】') 50 | if res.is_error: 51 | if code == 400: 52 | await bot.send(f"API请求出错,请稍后再试吧>w<") 53 | elif code == 403: 54 | await bot.send(f"【403】API密钥出错,请联系管理员修复>w<") 55 | elif code == 404: 56 | if "API key doesn't exist !" in res.text: 57 | await bot.send(f"API请求出错,未填入API Token!") 58 | else: 59 | await bot.send(f"未找到该玩家,请检查名称后重试>w<") 60 | elif code == 405: 61 | await bot.send(f"【405】外部API错误,请联系管理员修复>w<") 62 | elif code == 410: 63 | await bot.send(f"未知平台,请联系管理员修复>w<") 64 | elif code == 429: 65 | await bot.send(f"API速率限制,请稍后再试吧>w<") 66 | elif code == 503: 67 | await bot.send(f"似乎API服务器不可用,请稍后再试吧") 68 | else: 69 | if code == 200: 70 | logger.info(f'获取【{url}】数据成功') 71 | if 'Unauthorized format' in res.text: 72 | await bot.send(f"API请求出错,未填入API Token!") 73 | else: 74 | tempJson = json.loads(res.text) 75 | if 'Error' in tempJson: 76 | logger.info(f'错误数据:{tempJson}') 77 | if 'Player' in tempJson['Error'] and 'not found' in tempJson['Error']: 78 | await bot.send(f"未找到该玩家信息,请检查烂橘子ID的正确性") 79 | else: 80 | await bot.send(f"API请求出错,错误下信息:{tempJson['Error']}") 81 | else: 82 | isSucc = True 83 | text = res.text 84 | else: 85 | await bot.send(f"API请求出错,状态码{code}") 86 | except Exception as e: 87 | isSucc = False 88 | await bot.send(f"API请求出错,请稍后再试吧>w<") 89 | logger.error(f"Apex_Tool访问接口错误 {type(e)}:{e}") 90 | 91 | return text, isSucc 92 | 93 | 94 | async def SendMsg(bot: Bot, event, msg): 95 | if isinstance(event, PrivateMessageEvent): 96 | await bot.send_private_msg(user_id=event.user_id, message=msg) 97 | elif isinstance(event, GroupMessageEvent): 98 | await bot.send_group_msg(group_id=event.group_id, message=msg) 99 | else: 100 | bot.send(msg) 101 | 102 | 103 | @apexdt.handle() 104 | async def _(bot: Bot, event: MessageEvent): 105 | url = f"https://api.mozambiquehe.re/maprotation?auth={Tool_Token}&version=1" 106 | dataRet = await GetData(apexdt, url) 107 | if dataRet[1]: 108 | retdata = json.loads(dataRet[0]) # 地图数据 109 | tmpimgs = [] 110 | selMap = ["battle_royale", "ranked", "ltm"] 111 | for data in selMap: 112 | dat = retdata[data] # 当前游戏模式数据 113 | current = dat["current"] # 当前地图 114 | nextmap = dat["next"] # 下一地图 115 | 116 | await isHasImg(f"{Map_Path}/{current['map']}.jpg", current["asset"]) # 当前地图图片 117 | 118 | im = Image.open(f"{Map_Path}/{current['map']}.jpg") 119 | x, y = im.size 120 | im = im.resize((960, 300), Image.ANTIALIAS) 121 | 122 | await addText(im, 50, GameMode_Dict[data], 20, 20) # 地图类型 123 | await addText(im, 60, Map_Dict[current['code']] if current['code'] in Map_Dict else current['map'], 20, 124 | 90) # 地图名称 125 | await addText(im, 30, f"剩余时间:{current['remainingTimer']}", 20, 170) 126 | await addText(im, 30, f"下一轮换:{Map_Dict.get(nextmap.get('code', '未知地图'), '未知地图')}", 20, 220) 127 | 128 | tmpimg = f'{Temp_Path}/{data}_{current["code"]}.jpg' 129 | tmpimgs.append(tmpimg) 130 | im.save(tmpimg) 131 | 132 | # 设置画布(格式,尺寸,背景色) 133 | image = Image.new('RGB', (960, 900), (255, 255, 255)) 134 | for i, img in enumerate(tmpimgs): 135 | image.paste(Image.open(img), (0, i * 300)) 136 | 137 | tmpMapPath = f"{Temp_Path}/map_ok.jpg" # 地图路径 138 | logger.info(f"保存地图【{tmpMapPath}】") 139 | image.save(tmpMapPath) 140 | image_file = f"file://{tmpMapPath}" 141 | 142 | msg = f"[CQ:image,file={image_file}]" 143 | try: 144 | logger.info(f"发送地图【{tmpMapPath}】") 145 | await SendMsg(bot, event, msg) 146 | # await bot.send_group_msg(group_id=event.group_id, message=msg) 147 | except Exception as e: 148 | # await bot.send_group_msg(group_id=event.group_id, message=f"出错啦!\n错误信息:{e}") 149 | await SendMsg(bot, event, f"出错啦!\n错误信息:{e}") 150 | logger.info(e) 151 | 152 | 153 | @apexzz.handle() 154 | async def _(bot: Bot, event: MessageEvent): 155 | url = f"https://api.mozambiquehe.re/crafting?auth={Tool_Token}" 156 | dataRet = await GetData(apexdt, url) 157 | if dataRet[1]: 158 | retdata = json.loads(dataRet[0]) # 制造机数据 159 | zday = retdata[0]["bundleContent"] # 每天轮换 160 | zwek = retdata[1]["bundleContent"] # 每周轮换 161 | items = [zday[0]["itemType"], zday[1]["itemType"], zwek[0]["itemType"], zwek[1]["itemType"]] 162 | image = Image.new('RGB', (800, 800), (255, 255, 255)) 163 | for i, item in enumerate(items): 164 | localImg = f"{Make_Path}/{item['name']}.jpg" 165 | await isHasImg(localImg, item["asset"]) 166 | im = Image.open(localImg) 167 | im = im.resize((400, 400), Image.ANTIALIAS) 168 | image.paste(im, (400 if bool(i & 1) else 0, 400 if i > 1 else 0)) 169 | 170 | await addText(image, 50, "当日", 350, 345) 171 | await addText(image, 50, "本周", 350, 405) 172 | image.save(f"{Temp_Path}/mark_ok.jpg") 173 | image_file = f"file://{Temp_Path}/mark_ok.jpg" 174 | msg = f"[CQ:image,file={image_file}]" 175 | try: 176 | # await bot.send_group_msg(group_id=event.group_id, message=msg) 177 | await SendMsg(bot, event, msg) 178 | except Exception as e: 179 | # await bot.send_group_msg(group_id=event.group_id, message=f"出错啦!\n错误信息:{e}") 180 | await SendMsg(bot, event, f"出错啦!\n错误信息:{e}") 181 | logger.info(e) 182 | 183 | 184 | @apexls.handle() 185 | async def _(bot: Bot, event: MessageEvent): 186 | url = f"https://api.mozambiquehe.re/predator?auth={Tool_Token}" 187 | dataRet = await GetData(apexdt, url) 188 | if dataRet[1]: 189 | resp = json.loads(dataRet[0]) 190 | try: 191 | ls = Image.open(f"{Template_Path}/ls.jpg") # 加载模板 192 | for i, res in enumerate(resp): 193 | rank = resp[res] 194 | for j, ter in enumerate(rank): 195 | terr = rank[ter] 196 | lastRank = terr["foundRank"] 197 | rankScore = terr["val"] 198 | rankTotal = terr["totalMastersAndPreds"] 199 | x, y = 60 if i == 0 else 430, 650 + (j * 300) 200 | await addText(ls, 40, f"最低排名:{lastRank}", x, y) 201 | await addText(ls, 40, f"排位分数:{rankScore}", x, y + 50) 202 | await addText(ls, 40, f"大师总数:{rankTotal}", x, y + 100) 203 | ls = ls.convert('RGB') 204 | ls.save(f"{Temp_Path}/ls_ok.jpg") 205 | image_file = f"file://{Temp_Path}/ls_ok.jpg" 206 | msg = f"[CQ:image,file={image_file}]" 207 | # await bot.send_group_msg(group_id=event.group_id, message=msg) 208 | await SendMsg(bot, event, msg) 209 | except Exception as e: 210 | # await bot.send_group_msg(group_id=event.group_id, message=f"出错啦!\n错误信息:{e}") 211 | await SendMsg(bot, event, f"出错啦!\n错误信息:{e}") 212 | logger.info(e) 213 | 214 | 215 | @apexbind.handle() 216 | async def _(bot: Bot, event: Event, text: Message = CommandArg()): 217 | args = [] 218 | if len(text) > 0: 219 | args = text[0].data['text'].split(' ') 220 | if len(args) < 1: 221 | await apexbind.send('绑定ID使用方式:[a绑定 烂橘子ID]') 222 | return 223 | 224 | EA_ID = args[0] 225 | url = f"https://api.mozambiquehe.re/bridge?auth={Tool_Token}&player={EA_ID}&platform=PC" 226 | dataRet = await GetData(apexdt, url) 227 | if dataRet[1]: 228 | try: 229 | QQ_EA = loadEAIDJson() 230 | QQ = event.get_user_id() 231 | QQ_EA[QQ] = EA_ID 232 | writeEAID(QQ_EA) 233 | await apexbind.send(f'成功将【{QQ}】与【{EA_ID}】绑定!') 234 | except Exception as e: 235 | await bot.send(f"出错啦!\n错误信息:{e}") 236 | logger.info(e) 237 | 238 | 239 | @apexcx.handle() 240 | async def _(bot: Bot, event: Event, text: Message = CommandArg()): 241 | args = [] 242 | uid = "" 243 | lastRankCheck = False 244 | 245 | if len(text) > 0: 246 | args = text[0].data['text'].split(' ') 247 | 248 | if len(args) >= 1: 249 | uid = args[0] 250 | else: 251 | QQ = event.get_user_id() 252 | QQ_EA = loadEAIDJson() 253 | if QQ_EA.get(QQ) is None: 254 | await apexcx.send(f'{QQ}未绑定EA账号!如需绑定,请回复\na绑定 你的Origin_ID') 255 | return 256 | uid = QQ_EA[QQ] 257 | # print(uid) 258 | url = f"https://api.mozambiquehe.re/bridge?auth={Tool_Token}&player={uid}&platform=PC" 259 | dataRet = await GetData(apexdt, url) 260 | if dataRet[1]: 261 | response = json.loads(dataRet[0]) 262 | 263 | Rank_Data = loadRankJson() 264 | uidnum = response["global"]["uid"] 265 | if Rank_Data.get(uidnum) is None: 266 | Rank_Data[uidnum] = {} # 如果uid不存在于Rank_Data中,创建一个空字典 267 | lastRankCheck = False 268 | else: 269 | lastScore = Rank_Data[uidnum].get('rankScore') # 使用.get()方法获取rankScore的值 270 | lastTime = Rank_Data[uidnum].get('time') # 使用.get()方法获取time的值 271 | lastRankCheck = True 272 | 273 | rankPimg = "" 274 | arenaPimg = "" 275 | img = Image.open(f"{Template_Path}/info.jpg") # 信息页模板 276 | 277 | try: 278 | user = response["global"] # 账号数据 279 | toNextLevelPercent = user["toNextLevelPercent"] / 100 # 经验进度比 280 | progressBar(img, (255, 255, 255), (130, 170, 0), 1100, 185, 300, 20, toNextLevelPercent) # 添加进度条 281 | await addText(img, 60, user["name"] if user["name"] else uid, 1080, 63) # 添加名字 282 | levWid = 780 if user["level"] >= 200 else 785 if user["level"] >= 100 else 790 if user[ 283 | "level"] >= 10 else 795 284 | await addText(img, 32, str(user["level"] if user["level"] < 500 else 500), levWid, 216, (0, 0, 0)) # 添加等级 285 | for rk in range(1): 286 | # 若双排位归来,则将此处range改为2 287 | rname = ["rank", "排位"] if rk == 0 else ["arena", "竞技场"] 288 | rank = user[rname[0]] 289 | rankName = rank["rankName"] 290 | rankDiv = rank["rankDiv"] 291 | rankImg = rank["rankImg"] 292 | 293 | rimgPath = f"{Rank_Path}/{rankName}{rankDiv}.png" 294 | await isHasImg(rimgPath, rankImg) 295 | rimgdraw = Image.open(rimgPath).convert("RGBA") 296 | rimgdraw = rimgdraw.resize((250, 250), Image.ANTIALIAS) 297 | rimgdraw.save(rimgPath) 298 | 299 | if rk == 0: 300 | rankPimg = rimgPath 301 | else: 302 | arenaPimg = rimgPath 303 | ix, iy = (982, 600) 304 | # ix, iy = (765, 600) if rk == 0 else (1200, 600) 305 | # 此处注释为双排位 306 | rankScore = rank["rankScore"] 307 | ladderPosPlatform = rank["ladderPosPlatform"] 308 | 309 | await addText(img, 40, f"{rname[1]}:{rankScore}", ix, iy) 310 | await addText(img, 40, f"猎杀排名:{str(ladderPosPlatform) if ladderPosPlatform > 0 else '无'}", ix, 311 | iy + 50) 312 | if lastRankCheck: 313 | if rk == 0: 314 | if rankScore - lastScore != 0: 315 | await addText(img, 40, f"上次分数:{lastScore}", ix, iy + 100) 316 | await addText(img, 40, f"分数变动:{rankScore - lastScore}", ix, iy + 150) 317 | else: 318 | await addText(img, 40, f"分数变动:{rankScore - lastScore}", ix, iy + 100) 319 | 320 | realtime = response["realtime"] 321 | now = datetime.now() 322 | thisTime = now.strftime("%Y-%m-%d %H:%M") 323 | if lastRankCheck: 324 | await addText(img, 40, "上次查询:", 680, 800) 325 | await addText(img, 40, lastTime, 900, 800) 326 | 327 | await addText(img, 40, "查询时间:", 680, 850) 328 | await addText(img, 40, thisTime, 900, 850) 329 | await addText(img, 40, "当前状态:", 680, 900) 330 | await addText(img, 40, "在线" if realtime["isOnline"] else "离线", 900, 900) 331 | await addText(img, 40, "正在游戏" if realtime["isInGame"] else "未在游戏", 1070, 900) 332 | await addText(img, 40, "小队已满" if realtime["partyFull"] else "小队未满", 1300, 900) 333 | 334 | legends = response["legends"]["selected"] 335 | LegendName = legends["LegendName"] 336 | icon = legends["ImgAssets"]["icon"] 337 | iconPath = f"{Legend_Path}/{LegendName}.png" 338 | if not (await isHasImg(iconPath, icon)): 339 | nopic = Image.open(f"{Template_Path}/nopic.png") 340 | await addText(nopic, 50, Legend_Dict[LegendName] if LegendName in Legend_Dict else LegendName, 230, 150, 341 | (0, 0, 0)) 342 | iconPath = f"{Temp_Path}/{LegendName}_nopic.png" 343 | nopic.save(iconPath) 344 | 345 | await addText(img, 60, Legend_Dict[LegendName] if LegendName in Legend_Dict else LegendName, 170, 33) 346 | lengData = legends["data"] 347 | for i, dat in enumerate(lengData): 348 | y = 120 + (i * 75) 349 | await addText(img, 30, 350 | f"{isHasKey(dat['name'], Tracker)[1] if isHasKey(dat['name'], Tracker)[0] else dat['name']}:", 351 | 100, y) 352 | await addText(img, 30, str(dat["value"]), 500, y) 353 | 354 | icoPimgh = Image.open(iconPath).convert("RGBA") 355 | rankPimgh = Image.open(rankPimg).convert("RGBA") 356 | 357 | img.paste(rankPimgh, (980, 320), mask=rankPimgh) 358 | img.paste(icoPimgh, (0, 270), mask=icoPimgh) 359 | img = img.convert('RGB') 360 | img.save(f"{Temp_Path}/{uid}_info.jpg") 361 | image_file = f"file://{Temp_Path}/{uid}_info.jpg" 362 | msg = f"[CQ:image,file={image_file}]" 363 | 364 | try: 365 | Rank_Data[uidnum]['name'] = uid 366 | Rank_Data[uidnum]['time'] = thisTime 367 | Rank_Data[uidnum]['rankScore'] = rankScore 368 | writeRankData(Rank_Data) 369 | except Exception as e: 370 | await SendMsg(bot, event, f"RandData出错啦!\n错误信息:{e}") 371 | logger.info(e) 372 | 373 | # await bot.send_group_msg(group_id=event.group_id, message=msg) 374 | await SendMsg(bot, event, msg) 375 | except Exception as e: 376 | # await bot.send_group_msg(group_id=event.group_id, message=f"出错啦!\n错误信息:{e}") 377 | await SendMsg(bot, event, f"出错啦!\n错误信息:{e}") 378 | logger.info(e) 379 | 380 | 381 | @apexhelp.handle() 382 | async def _(bot: Bot, event: Event): 383 | await SendMsg(bot, event, __plugin_usage__) 384 | --------------------------------------------------------------------------------