回复
14
查看
1574
收藏
30

0

赠楼

0%

赠楼率

952

蒸汽

61

主题

964

帖子

1619

积分
发表于 2024-10-5 22:59:19 · 江苏 | 显示全部楼层 |阅读模式
本文为 其乐用户(UID:1302508) 发布的原创文章,转摘前请联系该用户获得许可
本帖最后由 1302508 于 2024-10-5 23:22 编辑

站里没找到可以用的和asf交互的qq机器人。


这里的前提是已经能部署了一个可以提供正向ws的qq机器人,并且你的asf开启了ipc
第一行写ws地址,第二行是你的qq号,第三行是asf地址加端口,第四行是asf的ipc的密码,






  1. 注意下面python代码的这块部分
  2. NAPCAT_WS_URL = os.environ.get('NAPCAT_WS_URL')
  3. TARGET_USER_ID = os.environ.get('TARGET_USER_ID')
  4. ASF_API_URL = os.environ.get('ASF_API_URL')
  5. ASF_API_KEY = os.environ.get('ASF_API_KEY')

  6. 上述代码代码修改成下面的形式,就可以直接运行了,不需要别的文件了,要记得改成自己的地址

  7. NAPCAT_WS_URL = "ws://1.1.1.1:3001"
  8. TARGET_USER_ID = "123141270"
  9. ASF_API_URL = "http://1.1.1.1:1242/Api"
  10. ASF_API_KEY = "casdasq"
复制代码





文件夹下放三个文件,三个代码块为三个文件


main.py
  1. import asyncio
  2. import websockets
  3. import json
  4. import requests
  5. import os
  6. # 配置 WebSocket 和 ASF API 的相关信息
  7. NAPCAT_WS_URL = os.environ.get('NAPCAT_WS_URL')
  8. TARGET_USER_ID = os.environ.get('TARGET_USER_ID')
  9. ASF_API_URL = os.environ.get('ASF_API_URL')
  10. ASF_API_KEY = os.environ.get('ASF_API_KEY')



  11. # 发送消息给指定用户
  12. async def send_message_to_user(user_id, message):
  13.     async with websockets.connect(NAPCAT_WS_URL) as ws:
  14.         # 构造发送消息的 JSON 数据
  15.         data = {
  16.             "action": "send_msg",
  17.             "params": {
  18.                 "user_id": user_id,
  19.                 "message": message
  20.             }
  21.         }
  22.         await ws.send(json.dumps(data))

  23. # 调用 ASF 的 play API
  24. def asf_play(botname, gameid):
  25.     url = f"{ASF_API_URL}/Command"
  26.     headers = {
  27.         "Authentication": ASF_API_KEY,
  28.         "Content-Type": "application/json"
  29.     }
  30.     payload = {
  31.         "Command": f"play {botname} {gameid}"
  32.     }
  33.     response = requests.post(url, headers=headers, json=payload)
  34.     return response.json()

  35. # 调用 ASF 的 stop API (实际上是 play 0 命令)
  36. def asf_stop(botname):
  37.     url = f"{ASF_API_URL}/Command"
  38.     headers = {
  39.         "Authentication": ASF_API_KEY,
  40.         "Content-Type": "application/json"
  41.     }
  42.     payload = {
  43.         "Command": f"play {botname} 0"
  44.     }
  45.     response = requests.post(url, headers=headers, json=payload)
  46.     return response.json()

  47. # 调用 ASF 的 redeem API
  48. def asf_redeem(botname, key):
  49.     url = f"{ASF_API_URL}/Command"
  50.     headers = {
  51.         "Authentication": ASF_API_KEY,
  52.         "Content-Type": "application/json"
  53.     }
  54.     payload = {
  55.         "Command": f"redeem {botname} {key}"
  56.     }
  57.     response = requests.post(url, headers=headers, json=payload)
  58.     return response.json()

  59. # 处理接收到的消息
  60. async def handle_message(message):
  61.     try:
  62.         msg_data = json.loads(message)
  63.         user_id = str(msg_data.get("user_id"))
  64.         msg_content = msg_data.get("message")

  65.         # 只处理来自指定用户的消息
  66.         if user_id == TARGET_USER_ID:
  67.             if msg_content.startswith("asf play"):
  68.                 parts = msg_content.split()
  69.                 if len(parts) == 4:
  70.                     botname = parts[2]
  71.                     gameid = parts[3]
  72.                     # 调用 ASF 的 play API
  73.                     result = asf_play(botname, gameid)
  74.                     # 把结果发送给用户
  75.                     await send_message_to_user(user_id, f"ASF Play Result: {result}")
  76.             elif msg_content.startswith("asf stop"):
  77.                 parts = msg_content.split()
  78.                 if len(parts) == 4:
  79.                     botname = parts[2]
  80.                     # 调用 ASF 的 stop API (实际上是 play 0)
  81.                     result = asf_stop(botname)
  82.                     # 把结果发送给用户
  83.                     await send_message_to_user(user_id, f"ASF Stop Result: {result}")
  84.             elif msg_content.startswith("asf"):
  85.                 parts = msg_content.split()
  86.                 if len(parts) == 3:
  87.                     botname = parts[1]
  88.                     key = parts[2]
  89.                     # 调用 ASF 的 redeem API
  90.                     result = asf_redeem(botname, key)
  91.                     # 把结果发送给用户
  92.                     await send_message_to_user(user_id, f"ASF Redeem Result: {result}")

  93.     except Exception as e:
  94.         print(f"Error handling message: {e}")

  95. # 监听 WebSocket 消息
  96. async def listen_to_ws():
  97.     async with websockets.connect(NAPCAT_WS_URL) as ws:
  98.         while True:
  99.             try:
  100.                 message = await ws.recv()
  101.                 await handle_message(message)
  102.             except websockets.ConnectionClosed:
  103.                 print("Connection closed, attempting to reconnect...")
  104.                 await asyncio.sleep(5)
  105.                 await listen_to_ws()  # 尝试重新连接
  106.             except Exception as e:
  107.                 print(f"Error: {e}")

  108. # 主函数
  109. async def main():
  110.     await listen_to_ws()

  111. # 运行事件循环
  112. if __name__ == "__main__":
  113.     asyncio.run(main())


复制代码
Dockerfile
  1. FROM python:3.12.4
  2. WORKDIR /app
  3. COPY . /app
  4. RUN pip install  -r requirements.txt
  5. ENV NAPCAT_WS_URL="ws://localhost:3001"
  6. ENV TARGET_USER_ID="default_user_id"
  7. ENV ASF_API_URL="http://localhost:1242/Api"
  8. ENV ASF_API_KEY="default_key"
  9. CMD ["python", "main.py"]
复制代码


requirements.txt
  1. websockets==13.1
  2. requests==2.32.3
复制代码


在三个文件都有的目录下执行下述代码,既可打包成docker镜像

  1. docker build -t asf-bot .
复制代码
  1. docker run -d --name asf-bot \
  2.   -e NAPCAT_WS_URL="ws://1.1.1.1:3001" \
  3.   -e TARGET_USER_ID="12312312" \
  4.   -e ASF_API_URL="http://1.1.1.1:1242/Api" \
  5.   -e ASF_API_KEY="123123123" \
  6.   asf-bot

复制代码
再执行上述的就可以运行了,注意这里需要改成自己的地址和密码

asf play [botname] [appid]就是开始游戏
asf stop [botname] [任意数字]就是停止所有游戏
asf [botname] [key] 就是激活游戏
目前只有这两个功能,够和群友从群里抢明key了(

感谢4ks提供的激活码,供我完成激活码测试的工作


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

×
[发帖际遇]: 1302508 在 Steam 喜加一的行为受到 G 胖赞赏,喜加体力 1 点 幸运榜 / 衰神榜

本帖被以下淘专辑推荐:

  • · 淘宝|主题: 844, 订阅: 130
回复

使用道具 举报

浏览本版块需要:
1. 初阶会员或更高等级;
2. (点击此处)绑定Steam账号
您需要登录后才可以回帖 登录 | 注册

本版积分规则

欢迎发帖参与讨论 o(*≧▽≦)ツ,请注意
1. 寻求帮助或答案的帖子请发到问题互助版块,悬赏有助于问题解决的速度。发错可能失去在该板块发布主题的权限(了解更多
2. 表达观点可以,也请务必注意语气和用词,以免影响他人浏览,特别是针对其他会员的内容。如觉得违规可使用举报功能 交由管理人员处理,请勿引用对方的内容。
3. 开箱晒物交易中心游戏互鉴福利放送版块请注意额外的置顶版规。
4. 除了提问帖和交易帖以外,不确认发在哪个版块的帖子可以先发在谈天说地

  作为民间站点,自 2004 年起为广大中文 Steam 用户提供技术支持与讨论空间。历经二十余载风雨,如今已发展为国内最大的正版玩家据点。

列表模式 · · 微博 · Bilibili频道 · Steam 群组 · 贴吧 · QQ群 
Keylol 其乐 ©2004-2024 Chinese Steam User Fan Site.
Designed by Lee in Balestier, Powered by Discuz!
推荐使用 ChromeMicrosoft Edge 来浏览本站
广告投放|手机版|广州数趣信息科技有限公司 版权所有|其乐 Keylol ( 粤ICP备17068105号 )
GMT+8, 2024-12-4 01:27
快速回复 返回顶部 返回列表