Compare commits
3 Commits
29c43e64e6
...
27db3d5ef0
Author | SHA1 | Date | |
---|---|---|---|
27db3d5ef0 | |||
d1b27d3825 | |||
ec399233cc |
11
connect.py
11
connect.py
@ -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
25
ica-rs/src/client.rs
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user