サイトの改ざんをみつけてしまった

下記サイトに「Hacked By GeNErAL」が表示されているので、改ざんされているようなのですが、問い合わせ先に連絡できず。

Hacked By GeNErAL

ページ中にある下記の文字列を Google で検索すると、同様のページがたくさん検索結果に表示されます。

Greetz : Kuroi’SH, RxR, ~

Subversion リポジトリのバックアップとレストア

CentOS 上でのSVN(Subversion)リポジトリを新しいサーバに移動する必要があったのでその簡単な方法の備忘録です。
手順は現行サーバーのリポジトリをバックアップ(dump)して、それを新サーバーでレストア(load)するだけです。

1. リポジトリのバックアップ

# svnadmin dump /var/www/svn/projects > projects.dump

2. リポジトリのレストア
※ レストアの前に、こちらの手順で予めサブバージョンのインストールとレポジトリを作成しておきます。

# svnadmin load /var/www/svn/projects < projects.dump

Microsoft Bing API Speech to Text で音声ファイルをテキスト化

音声ファイルをテキスト化する Microsoft Bing Speech to Text の試用をしてみました。STT にはクライアントライブラリとREST API が提供されています。お手軽な REST API の方を試してみます。シェルスクリプトのサンプルを元にPHPで書いてみました。

<?php
//
//  Microsoft Bing API Speech to Text
//

define("BING_TOKEN_URL", "https://api.cognitive.microsoft.com/sts/v1.0/issueToken");
define("BING_BASE_URL", "https://speech.platform.bing.com/speech/recognition");
define("BING_SERVICE", "/cognitiveservices");
define("BING_VERSION", "/v1");
define("BING_SUBSCRIPTION_KEY", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

define("BING_LANG", "ja-JP");
define("BING_LOCALE", "ja-JP");
define("AUDIO_TYPE", "audio/wav");

/*
 * Recognition modes:
 * interactive: a user makes short requests and expects the application
 *              to perform an action in response.
 * conversation: users are engaged in a human-to-human conversation.
 *
 * dictation: users recite longer utterances to the application
 *            for further processing.
 */
define("RECOGNITION_MODE", "conversation");
/*
 * Output format:
 * simple: A simplified phrase result containing the recognition status 
 *         and the recognized text in display form.
 * detailed: A recognition status and N-best list of phrase results
 *           where each phrase result contains all four recognition forms
 *           and a confidence score.
 */
define("OUTPUT_FORMAT", "simple");


function Get_Token($url, $subscriptionKey) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Content-type: application/x-www-form-urlencoded",
        "Content-Length: 0",
        "Ocp-Apim-Subscription-Key: {$subscriptionKey}"
    ));
    $token = @curl_exec($ch);
    return $token;
}

function Speech_to_Text($url, $token, $audioFile, $audioType) {
    $size = filesize($audioFile);
    $data = file_get_contents($audioFile);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Transfer-Encoding: chunked",
        "Content-Type: {$audioType}; codec=\"audio/pcm\"; samplerate=16000",
        "Authorization: Bearer {$token}"
    ));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_INFILESIZE, $size);
    $res = @curl_exec($ch);
    return $res;
}

// Main

if (empty($argv[1])) {
	echo "Please, specify a file to transcribe.".PHP_EOL;
	exit;
}

$filename = trim($argv[1]);
if (!file_exists($filename)) {
	echo "The file specified doesn't exist.".PHP_EOL;
	exit;
}

$token = Get_Token(BING_TOKEN_URL, BING_SUBSCRIPTION_KEY);

if (!empty($token)) {
	$url = BING_BASE_URL."/".RECOGNITION_MODE;
	$url .= BING_SERVICE.BING_VERSION;
	$url .= "?language=".BING_LANG;
	$url .= "&locale=".BING_LOCALE;
	$url .= "&format=".OUTPUT_FORMAT;
	$url .= "&requestid=rest_sample_request_id";
	$res = Speech_to_Text($url, $token, $filename, AUDIO_TYPE);
	var_dump($res);
} else {
	echo "Failed to get token.".PHP_EOL;
}
?>

Bing Speech to Text REST API では 15秒以下という制限があるため、音声の始まりの部分しかテキスト化できませんが、ちゃんと日本語テキストとして出力してくれています。いくつか試してみました。

出力結果:

outbound_only.wav:「お電話ありがとうございます。発信専用ダイアルのためおつなぎすることが出来ません・・・」

# php sample.php outbound_only.wav 
string(125) "{"RecognitionStatus":"Success","DisplayText":"お電話ありがとうございます","Offset":19100000,"Duration":19100000}"
busy.wav: 「ただいま電話が大変混み合っております。・・・」

# php sample.php busy.wav 
string(141) "{"RecognitionStatus":"Success","DisplayText":"ただいま電話 ga 大変混み合っております","Offset":12500000,"Duration":34500000}"
outoofservice.wav: 「ただいまのお時間は受付を終了しております。・・・」

# php sample.php outofservice.wav 
string(146) "{"RecognitionStatus":"Success","DisplayText":"ただいまのお時間は受付を終了しております","Offset":16600000,"Duration":40700000}"

Asterisk 13 FAX送信

Asterisk のFAX送信機能を使ってみます。

参考:http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/Fax_id290275.html

FAXを送受信するためにはspandspライブラリが必要になります。インストール手順はこちらの投稿を参考にしてください。

FAX送信はTIFF画像を送信します。ここでは送信したいTIFF画像があることを前提にAsteriskでFAX送信する方法をご紹介します。

FAX送信処理

FAX送信をするためには extensions.conf で以下の関数を呼ぶだけで行えます。

exten => send,1,SendFAX(/tmp/foo.tif,d)

これだけでは、送信する画像が固定なのでいろいろな画像を送信できるように処理を考えてみます。

[send-fax]
exten => send,1,NoOp(**** SENDING FAX ****)
 same => n,SendFAX(${FAXFILE},d)
 same => n,Hangup()
; Hangup.
exten => h,1,NoOp(Hangup send-fax)
 same => n,NoOp(${FAXSTATUS})
 same => n,NoOp(${FAXERROR})

送信するファイルを動的にセットするため、SendFAX関数のパラメータに FAXFILE という変数を指定しています。
では、次にこのファイル名を与えてFAX送信を実行させます。

コール ファイルでFAX送信実行

Asterisk にはコールファイルと呼ばれる構造化されたファイルを使うことで、自動でダイアル発信させる仕組みがあります。FAX送信を行うためこのコールファイルを利用します。

コールファイルの構文はこちらをご覧ください。

TIFF画像をFAX送信するためのコールファイルは以下の通りです。
/tmp/bar.tif 画像を 0311112222 へ送信する例です。

Channel: SIP/0311112222@account
Extension: send
Context: send-fax
Set: FAXFILE=/tmp/bar.tif

上記内容のコールファイルを /var/spool/asterisk/outgoing ディレクトリに配置すると、上記 extensions.conf の send-fax コンテキストの FAXFILE 変数に /tmp/bar.tif がセットされて send エクステンションの 実行されます。 つまり、/tmp/bar.tif 画像が 0311112222 へFAX送信されます。

※ 注意点は、/var/spool/asterisk/outgoing ディレクトリに直接コールファイルを作成せず、一時ディレクトリに作成した後、移動する必要があります。

複数の画像ファイルを順次FAXで送信するには、画像、送信先ごとににコールファイルを作成してスプールさせれば送信できます。電話回線のチャネル数制限がありますので、コールファイル数をうまく調整しないと送信エラーになる場合があります。

Asterisk 13 FAX受信

Asterisk のFAX受信機能を使ってみます。

参考:http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/Fax_id290275.html

Asterisk はFAXを受信してTIFF画像へ保存します。FAXを受信するためにはspandspライブラリが必要になります。

Spandspライブラリのインストール

spandsp をビルドするためには libtiff ライブラリが必要です。

# yum install libtiff libtiff-devel

続いて、spandsp のビルド

# wget https://www.soft-switch.org/downloads/spandsp/spandsp-0.0.6.tar.gz
# tar zxvf spandsp-0.0.6.tar.gz
# cd spandsp-0.0.6
# ./configure
# make
# make install
# cat >> /etc/ld.so.conf.d/usrlocallib.conf   ※ ここで Enter タイプして、次行に続く
/usr/local/lib
ここで CTRL+d をタイプして保存します。
# ldconfig

Asterisk を Spandspライブラリとリビルド

spandsp をインストール後、Asteriskをリビルドします。

# cd /usr/local/src/asterisk-13.13.1    ※ ダウンロードした Asterisk のビルドによります
# ./configure
# make menuselect     ※ make menuselect で res_fax_spandsp を選択
Resource Modules / [*] res_fax_spandsp 
[Save & Exit]
# make
# make install
# service asterisk restart

FAX受信処理

extensions.conf で受信したFAXを TIFF 画像で保存します。

[faxin]
exten => _03XXXXXXX,1,NoOp(Faxin-${EXTEN})
 same => n,Set(FAXOPT(ecm)=yes)
 same => n,Set(FAXOPT(maxrate)=14400)
 same => n,Set(FAXOPT(minrate)=2400)
 same => n,Set(FAXOPT(modem)=v17,v27,v29)
 same => n,Set(TIFF=${EXTEN}-${UNIQUEID}.tif)
 same => n,ReceiveFax(/tmp/${TIFF})
 same => n,Hangup()
; Hangup.
exten => h,1,NoOp(Hangup in-fax)
 same => n,NoOp(FAX Status: ${FAXSTATUS})
 same => n,NoOp(FAXOPT(ecm): ${FAXOPT(ecm)})
 same => n,NoOp(FAXOPT(filename): ${FAXOPT(filename)})
 same => n,NoOp(FAXOPT(headerinfo): ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid): ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate): ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate): ${FAXOPT(minrate)})
 same => n,NoOp(FAXOPT(pages): ${FAXOPT(pages)})
 same => n,NoOp(FAXOPT(rate): ${FAXOPT(rate)})
 same => n,NoOp(FAXOPT(remotestationid): ${FAXOPT(remotestationid)})
 same => n,NoOp(FAXOPT(resolution): ${FAXOPT(resolution)})
 same => n,NoOp(FAXOPT(status): ${FAXOPT(status)})
 same => n,NoOp(FAXOPT(statusstr): ${FAXOPT(statusstr)})
 same => n,NoOp(FAXOPT(error): ${FAXOPT(error)})

備忘録として、受信したTIFF画像をPHP AGIを使ってJPEGへ変換したりするには ImageMagick が便利です。

ImageMagick のインストール

# yum install yum install ImageMagick ImageMagick-devel
# yum install php-pecl-imagick