有名な会社MikrotikのRouterOSは、通常の手段を使用してロシア語でTelegramにメッセージを送信することを許可していません。ロシア語の文字は、UTF-8エンコーディングで送信された場合、メッセージに適切に表示できます。さて、コードは知られています、なぜトランスコーダーを書いてみませんか?
タスクを単純化するために、変換アルゴリズムを使用しませんでしたが、キーの形式で、文字列と大文字のレイアウトのロシア文字自体、および対応する値(UTF-8のこれらの文字のコード)を含むキー配列を作成しました。
このデータの配列は、他のタスクにも役立つ場合があります。
ロシア語のアルファベットの文字のキー配列とUTF8のコードの値
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {""="D090"; ""="D091"; ""="D092"; ""="D093"; ""="D094"; ""="D095"; ""="D096"; ""="D097"; ""="D098"; ""="D099"; ""="D09A"; ""="D09B"; ""="D09C"; ""="D09D"; ""="D09E"; ""="D09F"; ""="D0A0"; ""="D0A1"; ""="D0A2"; ""="D0A3"; ""="D0A4"; ""="D0A5"; ""="D0A6"; ""="D0A7"; ""="D0A8"; ""="D0A9"; ""="D0AA"; ""="D0AB"; ""="D0AC"; ""="D0AD"; ""="D0AE"; ""="D0AF"; ""="D0B0"; ""="D0B1"; ""="D0B2"; ""="D0B3"; ""="D0B4"; ""="D0B5"; ""="D0B6"; ""="D0B7"; ""="D0B8"; ""="D0B9"; ""="D0BA"; ""="D0BB"; ""="D0BC"; ""="D0BD"; ""="D0BE"; ""="D0BF"; ""="D180"; ""="D181"; ""="D182"; ""="D183"; ""="D184"; ""="D185"; ""="D186"; ""="D187"; ""="D188"; ""="D189"; ""="D18A"; ""="D18B"; ""="D18C"; ""="D18D"; ""="D18E"; ""="D18F"; ""="D001"; ""="D191"}]
ここで、文字列コンバータ自体を直接記述します。
入力では、$文字列変数にロシア語またはロシア語と英語の混合テキストを含む文字列が含まれている必要があります。出力は収集された文字列であり、テレグラムに送信する準備ができています。同時に、ラテン語のお気に入りの文字と句読点は、通常メッセンジャーチャットに表示されるため、再コード化されません。ロシア語の文字の代わりに、UTF-8コードの対応する文字が文字列に挿入され、「%」記号で区切られ、Telegramがエンコードされた文字を表示するために使用します。
# encoding of the symbols and ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
これらすべてをFuncStrToTele関数に入れて、RouterOsMikrotikの任意のスクリプトから呼び出すことができるようにします。DUDeでも使用できます。その完全なコードは次のとおりです(RouterOS Mikrotikをスクリプトのリポジトリに挿入し、スクリプトを実行して/システムスクリプト環境に関数を配置できます)。
混合ストリングコンバーター機能
# Function Converter of Russian characters for sending in Telegram
# by Sertik 09/09/2020
# usage [$FuncStrToTele « String .,!+»]
:global FuncStrToTele do={
:local string; :set $string $1;
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {«»=«D090»; «»=«D091»; «»=«D092»; «»=«D093»; «»=«D094»; «»=«D095»; «»=«D096»; «»=«D097»; «»=«D098»; «»=«D099»; «»=«D09A»; «»=«D09B»; «»=«D09C»; «»=«D09D»; «»=«D09E»; «»=«D09F»; «»=«D0A0»; «»=«D0A1»; «»=«D0A2»; «»=«D0A3»; «»=«D0A4»; «»=«D0A5»; «»=«D0A6»; «»=«D0A7»; «»=«D0A8»; «»=«D0A9»; «»=«D0AA»; «»=«D0AB»; «»=«D0AC»; «»=«D0AD»; «»=«D0AE»; «»=«D0AF»; «»=«D0B0»; «»=«D0B1»; «»=«D0B2»; «»=«D0B3»; «»=«D0B4»; «»=«D0B5»; «»=«D0B6»; «»=«D0B7»; «»=«D0B8»; «»=«D0B9»; «»=«D0BA»; «»=«D0BB»; «»=«D0BC»; «»=«D0BD»; «»=«D0BE»; «»=«D0BF»; «»=«D180»; «»=«D181»; «»=«D182»; «»=«D183»; «»=«D184»; «»=«D185»; «»=«D186»; «»=«D187»; «»=«D188»; «»=«D189»; «»=«D18A»; «»=«D18B»; «»=«D18C»; «»=«D18D»; «»=«D18E»; «»=«D18F»; «»=«D001»; «»=«D191»; "№"=«0023»}]
# encoding of the symbols and ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
:return $StrTele;
}
# by Sertik 09/09/2020
# usage [$FuncStrToTele « String .,!+»]
:global FuncStrToTele do={
:local string; :set $string $1;
# table of the codes of Russian letters UTF8
:local rsimv [:toarray {«»=«D090»; «»=«D091»; «»=«D092»; «»=«D093»; «»=«D094»; «»=«D095»; «»=«D096»; «»=«D097»; «»=«D098»; «»=«D099»; «»=«D09A»; «»=«D09B»; «»=«D09C»; «»=«D09D»; «»=«D09E»; «»=«D09F»; «»=«D0A0»; «»=«D0A1»; «»=«D0A2»; «»=«D0A3»; «»=«D0A4»; «»=«D0A5»; «»=«D0A6»; «»=«D0A7»; «»=«D0A8»; «»=«D0A9»; «»=«D0AA»; «»=«D0AB»; «»=«D0AC»; «»=«D0AD»; «»=«D0AE»; «»=«D0AF»; «»=«D0B0»; «»=«D0B1»; «»=«D0B2»; «»=«D0B3»; «»=«D0B4»; «»=«D0B5»; «»=«D0B6»; «»=«D0B7»; «»=«D0B8»; «»=«D0B9»; «»=«D0BA»; «»=«D0BB»; «»=«D0BC»; «»=«D0BD»; «»=«D0BE»; «»=«D0BF»; «»=«D180»; «»=«D181»; «»=«D182»; «»=«D183»; «»=«D184»; «»=«D185»; «»=«D186»; «»=«D187»; «»=«D188»; «»=«D189»; «»=«D18A»; «»=«D18B»; «»=«D18C»; «»=«D18D»; «»=«D18E»; «»=«D18F»; «»=«D001»; «»=«D191»; "№"=«0023»}]
# encoding of the symbols and ssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}
:return $StrTele;
}
コメントからわかるように、関数の唯一のパラメーターは文字の入力文字列です。関数は生成された文字列を返し、変数$ stringに送信し
ます。スクリプトでは、以前に定義した関数を呼び出すことを宣言することを忘れないでください。
:global FuncStrToTele
[$FuncStrToTele ", user !"]
メッセージを送信するには、Telegramでボットを作成し、そのAPIBOTTokenとチャットIDを確認する必要があります。ボットの作成とIDの取得の手順は、何度か公開されています。たとえば、次のリンクを見ることができます。
- Mikrotikテレグラムメッセージ
- MikrotikまたはLinuxからTelegramへのメッセージ
テストメッセージをボットチャットに送信します。
:local botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:local myChatID "YYYYYY" ;
:global FuncStrToTele;
:local string [$FuncStrToTele " Sertik ! - Russian alfabit Telegramm"]
:tool fetch url=("https://api.telegram.org/$botID/sendmes ... xt=$string") keep-result=no
それが私にとってうまくいくことを確認してください。これで、ロシア語のメッセージをTelegramに簡単に送信できます。コメントや追加は大歓迎です。
改行文字コードの送信を追加することをお勧めしますが、それは難しくありません。