diff --git a/README.md b/README.md new file mode 100644 index 0000000..266f6cd --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# PagerMaid-Plugins +PagerMaid-Pyro 的插件。 + +## 关于分支 +`master` 分支用来存放 PagerMaid-Modify 的插件。 +`v2` 分支用来存放 PagerMaid-Pyro 的插件。 + +⚠ **请注意,不同版本的插件不通用。** + +⚠ **当前分支为 `v2` ,PagerMaid-Modify 版插件请前往 [master 分支](https://github.com/TeamPGM/PagerMaid_Plugins/tree/master)**。 diff --git a/bc/main.py b/bc/main.py new file mode 100644 index 0000000..8b09048 --- /dev/null +++ b/bc/main.py @@ -0,0 +1,112 @@ +""" PagerMaid Plugin Coin by Pentacene """ +# ______ _ +# | ___ \ | | +# | |_/ /__ _ __ | |_ __ _ ___ ___ _ __ ___ +# | __/ _ \ '_ \| __/ _` |/ __/ _ \ '_ \ / _ \ +# | | | __/ | | | || (_| | (_| __/ | | | __/ +# \_| \___|_| |_|\__\__,_|\___\___|_| |_|\___| +# + +from asyncio import sleep +from sys import executable +import urllib.request +from pyrogram import Client +from pagermaid.listener import listener +from pagermaid.utils import Message, pip_install + +pip_install("python-binance", alias="binance") +pip_install("xmltodict") + +from binance.client import Client +import xmltodict + + +API = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" +CURRENCIES = [] +DATA = {} +BINANCE_API_KEY = '8PDfQ2lSIyHPWdNAHNIaIoNy3MiiMuvgwYADbmtsKo867B0xnIhIGjPULsOtvMRk' +BINANCE_API_SECRET = 'tbUiyZ94l0zpYOlKs3eO1dvLNMOSbOb2T1T0eT0I1eogH9Fh8Htvli05eZ1iDvra' + + +def init() -> None: + """ INIT """ + with urllib.request.urlopen(API) as response: + result = response.read() + try: + global CURRENCIES, DATA + rate_data = xmltodict.parse(result) + rate_data = rate_data['gesmes:Envelope']['Cube']['Cube']['Cube'] + for i in rate_data: + CURRENCIES.append(i['@currency']) + DATA[i['@currency']] = float(i['@rate']) + CURRENCIES.sort() + except Exception as e: + raise e + + +@listener(command="bc", + description="coins", + parameters=" ") +async def coin(_: Client, message: Message) -> None: + """ coin change """ + init() + action = message.arguments.split() + binanceclient = Client(BINANCE_API_KEY, BINANCE_API_SECRET) + if len(action) < 3: + await message.edit('输入错误.\n-bc 数量 币种1 币种2') + return + else: + prices = binanceclient.get_all_tickers() + try: + number = float(action[0]) + except ValueError: + await message.edit('输入错误.\n-bc 数量 币种1 币种2') + return + _from = action[1].upper().strip() + _to = action[2].upper().strip() + front_text = '' + text = '' + rear_text = '' + price = 0.0 + _to_USD_rate = 0.0 + + if (CURRENCIES.count(_from) != 0) and (CURRENCIES.count(_to) != 0): + # both are real currency + text = f'{action[0]} {action[1].upper().strip()} = {float(action[0])*DATA[_to]/DATA[_from]:.2f} {action[2].upper().strip()}' + + else: + if CURRENCIES.count(_from) != 0: + # from virtual currency to real currency + number = number * DATA["USD"] / DATA[_from] + _from = 'USDT' + front_text = f'{action[0]} {action[1]} = \n' + + if CURRENCIES.count(_to) != 0: + # from real currency to virtual currency + _to_USD_rate = DATA[_to] / DATA["USD"] + _to = 'USDT' + + for _a in prices: + if _a['symbol'] == str(f'{_from}{_to}'): + price = _a['price'] + if _to == 'USDT': + if action[2].upper().strip() == 'USDT': + rear_text = f'\n= {number * float(price) * DATA["CNY"]/DATA["USD"]:.2f} CNY' + else: + rear_text = f'\n= {number * float(price) * _to_USD_rate:.2f} {action[2].upper().strip()}' + if float(price) < 1: + text = f'{number} {_from} = {number * float(price):.8f} {_to}' + else: + text = f'{number} {_from} = {number * float(price):.2f} {_to}' + break + elif _a['symbol'] == str(f'{_to}{_from}'): + price = 1 / float(_a['price']) + text = f'{number} {_from} = {number * float(price):.8f} {_to}' + break + else: + price = None + + if price is None: + text = f'Cannot find coinpair {action[1].upper().strip()}{action[2].upper().strip()} or {action[2].upper().strip()}{action[1].upper().strip()}' + + await message.edit(f'{front_text}{text}{rear_text}') diff --git a/bin/main.py b/bin/main.py new file mode 100644 index 0000000..99a22d9 --- /dev/null +++ b/bin/main.py @@ -0,0 +1,66 @@ +import json +import requests +from json.decoder import JSONDecodeError +from pyrogram import Client +from pagermaid.listener import listener +from pagermaid.utils import Message + + +@listener(command="bin", + description="查询信用卡信息", + parameters="") +async def card(_: Client, message: Message): + await message.edit('正在查询中...') + try: + card_bin = message.arguments + except ValueError: + await message.edit("出错了呜呜呜 ~ 无效的参数。") + return + try: + r = requests.get("https://lookup.binlist.net/" + card_bin) + except: + await message.edit("出错了呜呜呜 ~ 无法访问到binlist。") + return + if r.status_code == 404: + await message.edit("出错了呜呜呜 ~ 目标卡头不存在") + return + if r.status_code == 429: + await message.edit("出错了呜呜呜 ~ 每分钟限额超过,请等待一分钟再试") + return + + try: + bin_json = json.loads(r.content.decode("utf-8")) + except JSONDecodeError: + await message.edit("出错了呜呜呜 ~ 无效的参数。") + return + + msg_out = [] + msg_out.extend(["BIN:" + card_bin]) + try: + msg_out.extend(["卡品牌:" + bin_json['scheme']]) + except (KeyError, TypeError): + pass + try: + msg_out.extend(["卡类型:" + bin_json['type']]) + except (KeyError, TypeError): + pass + try: + msg_out.extend(["卡种类:" + bin_json['brand']]) + except (KeyError, TypeError): + pass + try: + msg_out.extend(["发卡行:" + bin_json['bank']["name"]]) + except (KeyError, TypeError): + pass + try: + if bin_json['prepaid']: + msg_out.extend(["是否预付:是"]) + else: + msg_out.extend(["是否预付:否"]) + except (KeyError, TypeError): + pass + try: + msg_out.extend(["发卡国家:" + bin_json['country']['name']]) + except (KeyError, TypeError): + pass + await message.edit("\n".join(msg_out)) diff --git a/calculator/main.py b/calculator/main.py index ac5d9c2..02c8787 100644 --- a/calculator/main.py +++ b/calculator/main.py @@ -4,7 +4,7 @@ from pagermaid.utils import Message, execute @listener(command="cal", - description="计算\n示例:\n`-cal 1+1`加法\n`-cal 2-1`减法\n`-cal 1*2`乘法\n`-cal 4/2`除法\n`-cal 4^2`幂运算\n`-cal sqrt(4)`开方", + description="计算\n示例:\n`,cal 1+1`加法\n`,cal 2-1`减法\n`,cal 1*2`乘法\n`,cal 4/2`除法\n`,cal 4^2`幂运算\n`,cal sqrt(4)`开方", parameters="<基本运算>") async def cal(_: Client, message: Message): command = message.arguments @@ -22,7 +22,7 @@ async def cal(_: Client, message: Message): return @listener(command="con", - description="换算\n示例:\n`-con 2 99`将99转换为2进制", + description="换算\n示例:\n`,con 2 99`将99转换为2进制", parameters="<进制(数字)> <数值>") async def con(_: Client, message: Message): command = message.arguments.split() diff --git a/list.json b/list.json index b8e3d30..d0c1687 100644 --- a/list.json +++ b/list.json @@ -69,6 +69,46 @@ "supported": true, "des-short": "Base64编码/解码。", "des": "Base64编码/解码。\n命令:,b64e ,b64d" + }, + { + "name": "bc", + "version": "1.232", + "section": "chat", + "maintainer": "Pentacene", + "size": "4.2 kb", + "supported": true, + "des-short": "查询含虚拟货币在内的货币价格", + "des": "命令:bc 数量 货币1 货币2" + }, + { + "name": "bin", + "version": "1.021", + "section": "daily", + "maintainer": "paulkm", + "size": "2.09 kb", + "supported": true, + "des-short": "查询信用卡bin信息。", + "des": "使用binlist api查询,1分钟限额10次否则报错。使用方法:-bin xxx (xxx为信用卡卡号前4-8位,推荐6位)" + }, + { + "name": "tel", + "version": "1.111", + "section": "daily", + "maintainer": "KorenKrita、xtaodada", + "size": "1 kb", + "supported": true, + "des-short": "查询手机号码归属地等信息", + "des": "查询电话号码归属地,号码段,卡类型,运营商及通信标准。命令:tel。" + }, + { + "name": "news", + "version": "1.0", + "section": "daily", + "maintainer": "xtaodada", + "size": "1.3 kb", + "supported": true, + "des-short": "每日新闻、历史上的今天、天天成语、慧语香风、诗歌天地", + "des": "每日新闻、历史上的今天、天天成语、慧语香风、诗歌天地。\n指令:-news" } ] } diff --git a/news/main.py b/news/main.py new file mode 100644 index 0000000..86c9e4c --- /dev/null +++ b/news/main.py @@ -0,0 +1,34 @@ +from pyrogram import Client +from pagermaid.listener import listener +from pagermaid.utils import Message, client + + +@listener(command="news", + description="每日新闻、历史上的今天、天天成语、慧语香风、诗歌天地") +async def news(_: Client, context: Message): + msg = context.arguments + if not msg: + await context.edit("获取中 . . .") + try: + data = await client.get("https://news.topurl.cn/api") + data = data.json()["data"] + text = "📮 每日新闻 📮\n" + for i in range(12): + text += f"{i + 1}. [{data['newsList'][i]['title']}]({data['newsList'][i]['url']})\n" + + text += "\n🎬 历史上的今天 🎬\n" + for i in data["historyList"]: + text += f"{i['event']}\n" + + text += "\n🧩 天天成语 🧩\n" + text += f"{data['phrase']['phrase']} ----{data['phrase']['explain']}\n" + + text += "\n🎻 慧语香风 🎻\n" + text += f"{data['sentence']['sentence']} ----{data['sentence']['author']}\n" + + text += "\n🎑 诗歌天地 🎑\n" + text += f"{''.join(data['poem']['content'])} " \ + f"----《{data['poem']['title']}》{data['poem']['author']}" + await context.edit(text) + except Exception as e: + await context.edit(f"获取失败\n{e}") diff --git a/tel/main.py b/tel/main.py new file mode 100644 index 0000000..456de3a --- /dev/null +++ b/tel/main.py @@ -0,0 +1,30 @@ +import json +import sys, codecs + +sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) +from requests import get +from pyrogram import Client +from pagermaid.listener import listener +from pagermaid.utils import Message + + +@listener(command="tel", + description="手机号码归属地等信息查询。") +async def tel(_: Client, context: Message): + await context.edit("获取中 . . .") + try: + message = context.arguments + except ValueError: + await context.edit("出错了呜呜呜 ~ 无效的参数。") + return + req = get("https://tenapi.cn/tel?tel=" + message) + if req.status_code == 200: + data = json.loads(req.text) + if not 'msg' in data: + res = '电话号码:' + str(data['tel']) + '\n' + str(data['local']) + '\n' + str(data['duan']) + '\n' + str( + data['type']) + '\n' + str(data['yys']) + '\n' + str(data['bz']) + else: + res = data['msg'] + await context.edit(res) + else: + await context.edit("出错了呜呜呜 ~ 无法访问到 API 服务器 。")