mirror of
https://github.com/xuthus83/LittlePaimon.git
synced 2024-12-16 13:40:53 +08:00
248 lines
10 KiB
Python
248 lines
10 KiB
Python
import hoshino,json,os,traceback,asyncio
|
||
from hoshino import R,MessageSegment,aiorequests,logger
|
||
from hoshino.typing import CQEvent, Message
|
||
from PIL import Image
|
||
from io import BytesIO
|
||
import datetime
|
||
from nonebot import scheduler
|
||
|
||
from . import get_goods_list,get_address_id
|
||
|
||
sv=hoshino.Service('米游币抢兑')
|
||
|
||
myb_info = {}
|
||
goods_list = {}
|
||
|
||
def load_data():
|
||
path = os.path.join(os.path.dirname(__file__), 'myb_info.json')
|
||
if not os.path.exists(path):
|
||
with open(path,'w',encoding='UTF-8') as f:
|
||
json.dump(myb_info,f,ensure_ascii=False)
|
||
else:
|
||
try:
|
||
with open(path, encoding='utf8') as f:
|
||
data = json.load(f)
|
||
for k, v in data.items():
|
||
myb_info[k] = v
|
||
except:
|
||
traceback.print_exc()
|
||
|
||
def save_data():
|
||
path = os.path.join(os.path.dirname(__file__), 'myb_info.json')
|
||
try:
|
||
with open(path, 'w', encoding='utf8') as f:
|
||
json.dump(myb_info, f, ensure_ascii=False, indent=2)
|
||
except:
|
||
traceback.print_exc()
|
||
|
||
add_list_all = {}
|
||
|
||
@sv.on_fullmatch('米游币兑换')
|
||
async def mys(bot,ev):
|
||
qid = str(ev.user_id)
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'想要派蒙帮抢米游币商品吗?请私聊派蒙 米游币兑换 来使用哦!',at_sender=True)
|
||
return
|
||
res = "Hi旅行者!想要派蒙帮你抢米游社商品吗,请听派蒙的一步步指引哦:\n1.给派蒙发送你的cookie\n2.派蒙会列出你的收货地址,选择要收货的地址\n3.给派蒙发送你要兑换的商品4.告诉派蒙兑换开始的时间\n简单的步骤就是这样啦,接下来派蒙会一步步提示你使用指令\n\ncookie的获取方法如下:\n1.使用浏览器(安卓端用via浏览器,PC端随意)登录网页版米游社\n2.在地址栏删掉原本的链接,粘贴以下代码:\njavascript:(function(){let domain=document.domain;let cookie=document.cookie;prompt('Cookies: '+domain, cookie)})();\n(pc浏览器可能会将前面的javascript:给去掉,手动打上即可)\n3.点击回车前往,弹窗出现的一串字符就是cookie。"
|
||
#res = '诶嘿派蒙帮抢'
|
||
await bot.send(ev,res)
|
||
await asyncio.sleep(2)
|
||
await bot.send(ev,'---1.请发送指令[mybcookie (cookie)],()内为你要填入的信息---')
|
||
|
||
@sv.on_prefix('mybcookie')
|
||
async def choose_cookie(bot,ev):
|
||
qid = str(ev.user_id)
|
||
cookie = ev.message.extract_plain_text()
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'这个功能只能私聊使用哦,请撤回并私聊派蒙')
|
||
return
|
||
add_list = await get_address_id.get_address(cookie)
|
||
if add_list is None:
|
||
await bot.send(ev,'该cookie不能正确获取收获地址,请重新获取')
|
||
elif not add_list:
|
||
await bot.send(ev,'该cookie账号下没有收货地址,请先去添加')
|
||
else:
|
||
myb_info[qid] = {}
|
||
myb_info[qid]['cookie'] = cookie
|
||
save_data()
|
||
add_list_all[qid] = add_list
|
||
msg = ''
|
||
for add in add_list.items():
|
||
msg += f'id:{add[0]} {add[1]}\n'
|
||
await bot.send(ev,'---2.请发送指令[myb地址 (地址id)]来选择收货地址,如 myb地址10---')
|
||
await asyncio.sleep(1)
|
||
await bot.send(ev,msg)
|
||
|
||
@sv.on_prefix('myb地址')
|
||
async def choose_address(bot,ev):
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'这个功能只能私聊使用哦,请撤回并私聊派蒙',at_sender=True)
|
||
return
|
||
qid = str(ev.user_id)
|
||
add = ev.message.extract_plain_text()
|
||
if qid not in add_list_all:
|
||
await bot.send(ev,'你还未输入cookie')
|
||
elif add not in add_list_all[qid]:
|
||
await bot.send(ev,'你的收货地址列表没有该地址id')
|
||
else:
|
||
if qid not in myb_info:
|
||
myb_info[qid] = {}
|
||
myb_info[qid]['address_id'] = add
|
||
save_data()
|
||
await bot.send(ev,'---3.请发送指令[myb商品 (商品关键词)],派蒙会列出含有关键词的商品名和id---')
|
||
|
||
@sv.on_prefix('myb商品')
|
||
async def choose_goods(bot,ev):
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'这个功能只能私聊使用哦,请撤回并私聊派蒙',at_sender=True)
|
||
return
|
||
qid = str(ev.user_id)
|
||
if qid not in myb_info:
|
||
myb_info[qid] = {}
|
||
keyword = ev.message.extract_plain_text().strip()
|
||
goods_list_match = {}
|
||
for good in goods_list.items():
|
||
if keyword in good[0]:
|
||
goods_list_match[good[0]] = good[1]
|
||
msg = '找到的商品有:\n'
|
||
for good in goods_list_match.items():
|
||
msg += f'-名:{good[0]} id:{good[1]}-\n'
|
||
await bot.send(ev,msg)
|
||
await asyncio.sleep(1)
|
||
await bot.send(ev,'---4.请发送指令[myb商品选择 (商品的id)]来添加要兑换的商品,多个商品id间用空格隔开,---')
|
||
|
||
@sv.on_prefix('myb商品选择')
|
||
async def choose_goods_id(bot,ev):
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'这个功能只能私聊使用哦,请撤回并私聊派蒙',at_sender=True)
|
||
return
|
||
qid = str(ev.user_id)
|
||
if qid not in myb_info:
|
||
myb_info[qid] = {}
|
||
if 'goods_id' not in myb_info[qid]:
|
||
myb_info[qid]['goods_id'] = []
|
||
goods_id = ev.message.extract_plain_text().strip()
|
||
goods_id = goods_id.split(' ')
|
||
for good in goods_id:
|
||
if good not in goods_list.values():
|
||
await bot.send(ev,f'{good}不在可兑换的商品中')
|
||
else:
|
||
myb_info[qid]['goods_id'].append(good)
|
||
await asyncio.sleep(1)
|
||
await bot.send(ev,'---5.请发送指令[myb时间 (时间)],格式:米游币时间 2022年02月10日12:00:00---')
|
||
|
||
@sv.on_prefix('myb时间')
|
||
async def choose_date(bot,ev):
|
||
if ev.message_type != 'private':
|
||
await bot.send(ev,'这个功能只能私聊使用哦,请撤回并私聊派蒙',at_sender=True)
|
||
return
|
||
qid = str(ev.user_id)
|
||
date = ev.message.extract_plain_text().strip()
|
||
if qid not in myb_info:
|
||
myb_info[qid] = {}
|
||
try:
|
||
datet = datetime.datetime.strptime(date,'%Y年%m月%d日%H:%M:%S')
|
||
except Exception as e:
|
||
await bot.send(ev,f'时间格式错误,正确格式:myb时间 2022年02月10日12:00:00')
|
||
return
|
||
myb_info[qid]['date'] = date
|
||
save_data()
|
||
try:
|
||
cookie, address, goods = myb_info[qid]['cookie'],myb_info[qid]['address_id'],myb_info[qid]['goods_id']
|
||
except Exception as e:
|
||
del myb_info[info[0]]
|
||
logger.error(f'{info[0]}的信息不全,已删除')
|
||
save_data()
|
||
return
|
||
scheduler.add_job(
|
||
exchange,
|
||
'date',
|
||
args=(qid,cookie,address,goods),
|
||
run_date = datet
|
||
)
|
||
await asyncio.sleep(1)
|
||
await bot.send(ev,'---已成功调好闹钟准备兑换啦!届时会将兑换结果私聊给你---')
|
||
|
||
@sv.on_fullmatch('myb取消')
|
||
async def deletemyb(bot,ev):
|
||
qid = str(ev.user_id)
|
||
if qid in myb_info:
|
||
del myb_info[qid]
|
||
save_data()
|
||
await bot.send(ev,'派蒙已经取消你的商品帮抢')
|
||
else:
|
||
await bot.send(ev,'你没有设置过派蒙帮抢哦')
|
||
|
||
async def exchange(qid,cookie,address,goods):
|
||
url = "https://api-takumi.mihoyo.com/mall/v1/web/goods/exchange"
|
||
headers = {
|
||
"Accept": "application/json, text/plain, */*",
|
||
"Accept-Encoding": "gzip, deflate, br",
|
||
"Accept-Language": "zh-CN,zh-Hans;q=0.9",
|
||
"Connection": "keep-alive",
|
||
"Content-Length": "88",
|
||
"Content-Type": "application/json;charset=utf-8",
|
||
"Cookie": cookie,
|
||
"Host": "api-takumi.mihoyo.com",
|
||
"Origin": "https://webstatic.mihoyo.com",
|
||
"Referer": "https://webstatic.mihoyo.com/",
|
||
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.14.1","x-rpc-app_version": "2.14.1",
|
||
"x-rpc-channel": "appstore",
|
||
"x-rpc-client_type": "1",
|
||
"x-rpc-device_id": "35543DDE-7C18-4584-BF4B-51217D3C8670",
|
||
"x-rpc-device_model": "iPhone10,2",
|
||
"x-rpc-device_name": "%E4%B8%A4%E6%B1%9F%E6%80%BB%E7%9D%A3",
|
||
"x-rpc-sys_version": "15.1"
|
||
}
|
||
for good in goods:
|
||
data = {
|
||
"app_id": 1,
|
||
"point_sn": "myb",
|
||
"goods_id": good,
|
||
"exchange_num": 1,
|
||
"address_id": address
|
||
}
|
||
try:
|
||
bot = hoshino.get_bot()
|
||
res = await aiorequests.post(url=url,headers=headers,json=data)
|
||
mes = await res.json()
|
||
good_name = [k for k,v in goods_list.items() if v==good][0]
|
||
logger.info(f'用户{qid}的商品{good_name}兑换操作成功,结果:{mes}')
|
||
mes = f'你的{good}兑换结果:\n{mes["message"]}'
|
||
try:
|
||
await bot.send_private_msg(user_id=qid,message=mes)
|
||
except Exception as e:
|
||
logger.error(f'商品兑换:向{qid}发送消息失败:{e}')
|
||
except Exception as e:
|
||
logger.error(f'商品兑换:用户{qid}的商品{good}兑换时网络出错:{e}')
|
||
del myb_info[qid]
|
||
save_data()
|
||
|
||
async def makeaction():
|
||
if myb_info:
|
||
for info in myb_info.items():
|
||
try:
|
||
date = datetime.datetime.strptime(info[1]['date'],'%Y年%m月%d日%H:%M:%S')
|
||
qid, cookie, address, goods = info[0], info[1]['cookie'], info[1]['address_id'], info[1]['goods_id']
|
||
except Exception as e:
|
||
del myb_info[info[0]]
|
||
save_data()
|
||
logger.error(f'{info[0]}的信息不全,已删除')
|
||
break
|
||
scheduler.add_job(
|
||
exchange,
|
||
'date',
|
||
args=(qid,cookie,address,goods),
|
||
run_date = date
|
||
)
|
||
@sv.scheduled_job('date',run_date=datetime.datetime.now())
|
||
async def startup():
|
||
load_data()
|
||
await makeaction()
|
||
logger.info('加载米游币兑换信息...')
|
||
goods_list = get_goods_list.get_goods_list()
|
||
|
||
|
||
|
||
|