Help us understand the problem. What is going on with this article?

Pythonで伺かのSSTPを使って通信する方法

SSTPとは

Sakura Script Transfer Protocolの略称で、伺かにおける独自の通信プロトコル。実はIANAにも記載されている国際規格。(Secure Socket Tunneling Protocolではない。というかこっちの方が先だったはず)
ベースウェア(SSP)はこのプロトコルのポートが解放されたサーバーとしての機能を持つ。

SSTPに関する資料(特に具体的なコード)が少なくて苦労したので備忘録として置いておく

サンプル

# -*- coding:utf-8 -*-
import socket

host = "127.0.0.1"  #localhost
port = 9801  #The port number of SSTP

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((host, port))

test = "NOTIFY SSTP/1.5\r\n\
Sender: リサ\r\n\
Event: OnRelease\r\n\
Script: \\0\s[1]This text is sent from Python.\\nCan you see this?\\1This is a test\e\r\n\
Option: nodescript, notranslate\r\n\
Charset: UTF-8\r\n\
\r\n"

client.send(test.encode())
#send() receives in bytes representation

response = client.recv(4096)
#recv() determines the length(bytes) of response
client.close()
print(response.decode())
#The return is also byte-type so decode it

Senderは何でもよい(普通プログラム名にしておく)。Pythonでは\0,\1,\nはエスケープして\\0,\\1,\\nとしないと正常に動かない。
OptionのnodesrciptはSSTPマーカーを非表示、notranslateはSHIORI EVENTのOnTranslateに処理を渡さない用のオプション。必要に応じて付ける。
またNOTIFY以外にもEXECUTEなど別の処理も存在する。http://www.ooyashima.net/db/sstp.html を参照。

この処理はIFGhostを使って次のように書くこともできる:

"NOTIFY SSTP/1.5\r\n\
Sender: test\r\n\
Event: OnRelease\r\n\
IfGhost: リサ\r\n\
Script: \\0\s[1]Lisa is speaking now.\r\n\
IfGhost: エミリ, さくら\r\n\
Script: \\0\s[1]Sakura or Emily is speaking now.\r\n\
Option: nodescript, notranslate\r\n\
Charset: UTF-8\r\n\
\r\n"

IfGhostでヒットしなかった場合は一番上に書いた分岐が採用される(今の場合IfGhost:リサの分岐)

動作例

キャプチャ.PNG

何に使えるか

  • 今までSAORIを使って外部プログラムを実行していた時、YAYA及び里々ではマルチスレッドに対応していなかったのでSAORIの処理が終わるまでゴースト側は何も反応できず、処理に時間がかかるものを実行しているとフリーズしているように見えてしまう問題があった。 そこでSAORIの処理そのものをマルチスレッドで書き、別のスレッドで実行した結果をSSTPで渡すことでこの問題を解決できる。(実際音楽を再生するSAORIであるmciaudior.dllはこの方法を使っている……はず)
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away