Compare commits

...

3 Commits

3 changed files with 46 additions and 34 deletions

View File

@ -2,7 +2,6 @@ import time
import random import random
import asyncio import asyncio
import traceback import traceback
import multiprocessing
from typing import Dict, List, Tuple, Any, Optional, Union, Literal from typing import Dict, List, Tuple, Any, Optional, Union, Literal
@ -67,7 +66,7 @@ class Message(Options):
} }
sio = socketio.AsyncClient() sio: socketio.AsyncClient = socketio.AsyncClient()
@sio.on('connect') @sio.on('connect')
@ -87,6 +86,10 @@ async def require_auth(salt: str, versions: Dict[str, str]):
await sio.emit('auth', signature.signature) await sio.emit('auth', signature.signature)
print(f"{Fore.BLUE}send auth emit{Style.RESET_ALL}") print(f"{Fore.BLUE}send auth emit{Style.RESET_ALL}")
# @sio.on('requireAuth')
# def require_auth(*data: Dict[str, Any]):
# print(f"{Fore.BLUE}requireAuth: {data}{Style.RESET_ALL}")
@sio.on('auth') @sio.on('auth')
def auth(data: Dict[str, Any]): def auth(data: Dict[str, Any]):
@ -223,8 +226,8 @@ async def add_message(data: Dict[str, Any]):
await asyncio.sleep(random.random() * 2) await asyncio.sleep(random.random() * 2)
await sio.emit('sendMessage', message.to_json()) await sio.emit('sendMessage', message.to_json())
elif data['message']['content'] == 'jrrp': elif data['message']['content'] == '!!jrrp':
randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp') randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp-v2')
result = randomer.randint(0, 50) + randomer.randint(0, 50) result = randomer.randint(0, 50) + randomer.randint(0, 50)
print(f'{sender_name} 今日人品值为 {result}') print(f'{sender_name} 今日人品值为 {result}')
reply = ReplyMessage(id=data['message']['_id']) reply = ReplyMessage(id=data['message']['_id'])

25
ica-rs/src/client.rs Normal file
View File

@ -0,0 +1,25 @@
use ed25519_dalek::{Signature, Signer, SigningKey};
pub struct IcalinguaSinger {
pub host: String,
pub pub_key: SigningKey,
}
impl IcalinguaSinger {
pub fn new(host: String, pub_key: &str) -> Self {
let array_key: [u8; 32] = hex::decode(pub_key).unwrap().try_into().unwrap();
let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
Self {
host,
pub_key: signing_key,
}
}
pub fn sign_for_salt(&self, salt: String) -> Vec<u8> {
let salt: Vec<u8> = hex::decode(salt).unwrap();
let signature: Signature = self.pub_key.sign(salt.as_slice());
signature.to_bytes().to_vec()
}
}

View File

@ -1,27 +1,29 @@
use ed25519_dalek::{Signature, Signer, SigningKey}; mod client;
use rust_socketio::{ClientBuilder, Payload, RawClient, Event};
use std::time::Duration;
static KEY: &str = ""; use ed25519_dalek::{Signature, Signer, SigningKey};
static HOST: &str = ""; use rust_socketio::{ClientBuilder, Event, Payload, RawClient};
use std::time::Duration;
#[allow(unused)] #[allow(unused)]
fn require_auth_callback(payload: Payload, client: RawClient) { fn require_auth_callback(payload: Payload, client: RawClient) {
let key = std::env::args().nth(2).expect("No key given");
let auth_key = match payload { let auth_key = match payload {
Payload::String(str) => Some(str), Payload::String(str) => Some(str),
Payload::Binary(_) => None, Payload::Binary(_) => None,
} }
.unwrap(); .expect("Payload should be String");
// 去除前后的 "
let auth_key = &auth_key[1..auth_key.len() - 1]; let auth_key = &auth_key[1..auth_key.len() - 1];
println!("auth_key: {}", auth_key); println!("auth_key: {}", auth_key);
let array_key: [u8; 32] = hex::decode(KEY).unwrap().try_into().unwrap(); let array_key: [u8; 32] = hex::decode(key)
.expect("Key should be hex")
.try_into()
.expect("Key should be 32 bytes");
let signing_key: SigningKey = SigningKey::from_bytes(&array_key); let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
let salt = hex::decode(auth_key).unwrap(); let salt = hex::decode(auth_key).expect("Got an invalid salt from the server");
let signature: Signature = signing_key.sign(salt.as_slice()); let signature: Signature = signing_key.sign(salt.as_slice());
// let sign = hex::encode(signature.to_bytes()); // let sign = hex::encode(signature.to_bytes());
let sign = signature.to_bytes().to_vec(); let sign = signature.to_bytes().to_vec();
@ -44,10 +46,12 @@ fn ws_main() {
let connect_call_back = |payload: Payload, _client: RawClient| { let connect_call_back = |payload: Payload, _client: RawClient| {
println!("Connect callback: {:#?}", payload); println!("Connect callback: {:#?}", payload);
}; };
// 从命令行获取 host 和 key
let host = std::env::args().nth(1).expect("No host given");
// get a socket that is connected to the admin namespace // get a socket that is connected to the admin namespace
let socket = ClientBuilder::new(HOST) let socket = ClientBuilder::new(host)
// .namespace("/admin") // .namespace("/admin")
.on_any(any_event) .on_any(any_event)
.on("connect", connect_call_back) .on("connect", connect_call_back)
@ -60,26 +64,6 @@ fn ws_main() {
socket.disconnect().expect("Disconnect failed") socket.disconnect().expect("Disconnect failed")
} }
fn sign_main() {
// 生成 SingningKey
let array_key: [u8; 32] = hex::decode(KEY).unwrap().try_into().unwrap();
let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
// 要签名的东西
let data = "187d0b21becfa7a49e97afc00646e169";
let data = hex::decode(data).unwrap();
// 签名
let signature: Signature = signing_key.sign(data.as_slice());
// 生成签名
let sign = hex::encode(signature.to_bytes());
println!("sign: {} {:?} {}", sign, signature.to_bytes(), signature.to_bytes().len());
// println!("hex: {}", hex::encode());
}
fn main() { fn main() {
sign_main();
ws_main(); ws_main();
} }