Compare commits

...

3 Commits

3 changed files with 46 additions and 34 deletions

View File

@ -2,7 +2,6 @@ import time
import random
import asyncio
import traceback
import multiprocessing
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')
@ -87,6 +86,10 @@ async def require_auth(salt: str, versions: Dict[str, str]):
await sio.emit('auth', signature.signature)
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')
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 sio.emit('sendMessage', message.to_json())
elif data['message']['content'] == 'jrrp':
randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp')
elif data['message']['content'] == '!!jrrp':
randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp-v2')
result = randomer.randint(0, 50) + randomer.randint(0, 50)
print(f'{sender_name} 今日人品值为 {result}')
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};
use rust_socketio::{ClientBuilder, Payload, RawClient, Event};
use std::time::Duration;
mod client;
static KEY: &str = "";
static HOST: &str = "";
use ed25519_dalek::{Signature, Signer, SigningKey};
use rust_socketio::{ClientBuilder, Event, Payload, RawClient};
use std::time::Duration;
#[allow(unused)]
fn require_auth_callback(payload: Payload, client: RawClient) {
let key = std::env::args().nth(2).expect("No key given");
let auth_key = match payload {
Payload::String(str) => Some(str),
Payload::Binary(_) => None,
}
.unwrap();
// 去除前后的 "
.expect("Payload should be String");
let auth_key = &auth_key[1..auth_key.len() - 1];
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 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 sign = hex::encode(signature.to_bytes());
let sign = signature.to_bytes().to_vec();
@ -44,10 +46,12 @@ fn ws_main() {
let connect_call_back = |payload: Payload, _client: RawClient| {
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
let socket = ClientBuilder::new(HOST)
let socket = ClientBuilder::new(host)
// .namespace("/admin")
.on_any(any_event)
.on("connect", connect_call_back)
@ -60,26 +64,6 @@ fn ws_main() {
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() {
sign_main();
ws_main();
}