2022-03-14 09:26:50 +08:00

248 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()