phpcaptcha在ios上撥放沒有聲音
以前在一個網站的驗證碼處理中發現這個問題,也許新版已經有處理掉這個問題也說不定,在這邊還是另外做一個紀錄。
這篇文章處理的是php常用的驗證碼(https://www.phpcaptcha.org/)在ios上無法放出聲音的問題。
雖然現在多數的網站應該是使用google recaptcha作為驗證碼工具,還是有些網站可能一些因素而選擇是用傳統的驗證碼來處理,在PHP中這是非常常被使用的套件。
當時測試的結果有很大的機率是header的修改對ios不起作用的關係,所以在聲音撥放的時候沒有被當聲音來處理,最後決定稍微修改了程式讓他直接產生聲音檔案。
securimage.php修改
修改原本的檔案增加產生聲音檔的函數,複製public function outputAudioFile()進行修改,把輸出聲音改成存檔。
public function createAudioFile($filePath)
{
set_error_handler(array(&$this, 'errorHandler'));
require_once dirname(__FILE__) . '/WavFile.php';
try {
$audio = $this->getAudibleCode();
} catch (Exception $ex) {
if (($fp = @fopen(dirname(__FILE__) . '/si.error_log', 'a+')) !== false) {
fwrite($fp, date('Y-m-d H:i:s') . ': Securimage audio error "' . $ex->getMessage() . '"' . "\n");
fclose($fp);
}
$audio = $this->audioError();
}
$fileHandle = fopen($filePath, 'w');
fwrite($fileHandle,$audio);
fclose($fileHandle);
restore_error_handler();
}
php呼叫函數產生檔案
$pname = md5(session_id()).'_'.time().'.wav';//產生檔案名稱
$dir = '/secwav/';//檔案存放位置
$this->load->library('securimage/securimage');
$img = new Securimage();
$img->createAudioFile($dir.$pname);
echo '/secwav/'.$pname;
//檢查資料夾內過久的檔案刪除
$clearpath = $dir;
if ($handle = opendir($clearpath))
{
while (false !== ($file = readdir($handle)))
{
if ((time()-filectime($clearpath.$file)) > 180)
{
if (preg_match('/\.wav$/i', $file))
{
unlink($clearpath.$file);
}
}
}
}
html的部分
<a href="#"><img onclick="change_captcha(this);" id="logccimg" src="" class="" alt=""></a><!--顯示-->
<a href="#" onclick="change_captcha(document.getElementById('logccimg'));"><img src="/img/res.png" class="" alt=""></a><!--重新整理用圖片-->
<a href="#" onclick="play_captcha();"><img style="width:24px" src="<?=base_url('assets/securimage/audio_icon.png')?>" class="" alt=""></a><!--播放按鈕-->
<div id="logccimg_audio" style="display:none;">
<audio controls="">
<source src="/captcha/play" type="audio/wav">
</audio>
</div>
javasciprt
//更換驗證碼
function change_captcha(obj){
$(obj).attr('src', '取得新驗證碼網址?' + new Date().getTime());
$.ajax({
url : '產生聲音檔案網址'
,type : "get"
,dataType : "html"
,success : function(response){
$('#logccimg_audio').html('<audio controls="" ><source src="'+response+'" type="audio/wav"></audio>');
}
});
}
//播放
function play_captcha(){
$('#logccimg_audio audio')[0].play();
}