Server : nginx/1.20.2
System : Linux VM-4-4-centos 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022 x86_64
User : www ( 1000)
PHP Version : 5.6.40
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Directory :  /www/wwwroot/greatapp.cn/application/common/model/
Upload File :
Current Directory [ Writeable ] Root Directory [ Writeable ]


Current File : /www/wwwroot/greatapp.cn/application/common/model/Word.php
<?php
namespace app\common\model;
/**
 * Created by PhpStorm.
 * User: zzj
 * Date: 2018/1/30
 * Time: 16:52
 */
class Word extends Base
{

    /**
     * 查询单词详细信息
     * @param $word
     * @return array|bool|null|static
     */
    public function getWordDetail($word){
        $data = [];
        //查询数据库
        try {
            $data = $this->get(['word'=>$word]);
//            halt($this->getLastSql());
            if ($data){
                //数量加一
                $this->where(['en' => $word])->setInc("view_count");
                $this->where(['en' => $word])->update(['update_time'=>time()]);
            }
        }catch (\Exception $e){
            return null;
        }

        if (!$data) {
            //从扇贝取数据
            $sb_data = $this->queryShanbay($word);
            //为空到词霸取
            if (empty($sb_data) || empty(trim($sb_data['cn']))){
                $sb_data = $this->queryIciba($word);
            }


            if (empty($sb_data) || !is_array($sb_data)){
                return null;
            }

            //对翻译中特殊字符处理
            $sb_data['cn'] = str_ireplace("&lt;","<",$sb_data['cn']);
            $sb_data['cn'] = str_ireplace("&gt;",">",$sb_data['cn']);

            try {
                $id = $this->add($sb_data);

                if (!$id){
                    return null;
                }

            }catch (\Exception $e){
                return null;
            }

            $data = $sb_data;
            $data['id'] = $id;
        }

        //如果发音不存在,则也要去取发音和音频
        if (!empty($data) && empty($data['audio_name'])){
            //从扇贝取数据
            $audio_name = $data['en'].".mp3";
            $audio_url = "http://dict.youdao.com/dictvoice?audio=".$data['en']."&type=1";

            $down_data = getFile($audio_url,"audio",$audio_name);
            if ($down_data && !empty($down_data['file_name'])){
//更新发音和音频文件名
                $this->save([
                    'audio_name' => $audio_name
                ],['en'=>$data['en']]);
                //更新data,不单独查了
                $data['audio_name'] = $audio_name;
            }
        }

        return $data;
    }

    /**
     * 例句很全:
     * https://www.shanbay.com/bdc/mobile/preview/word?word=big
     * 有道的,没有音频
     * http://fanyi.youdao.com/openapi.do?keyfrom=youdao111&key=60638690&type=data&doctype=xml&version=1.1&q=school
     */

    private function queryShanbay($word){
        $word = strtolower($word);
        //从扇贝取数据
        $data = [];
        $url = "https://api.shanbay.com/bdc/search/?word=".urlencode($word);

        $str = http($url);

        $result = json_decode($str,true);
        //不转码
        $json = json_encode($result,JSON_UNESCAPED_UNICODE);

        if ($result && $result['msg'] == "SUCCESS"){
            $data['word'] = $word;

            $en = strtolower($result['data']['content']);

            //数据处理,使用美式发音,并存入数据库
            $data['en'] = $en;
            $data['cn'] = $result['data']['definition'];
            $data['pron'] = $result['data']['pron'];
            $data['audio'] = $result['data']['audio'];
            $data['note'] = $json;
            //下载音频
            $audio_name = $en.strrchr($data['audio'],".");

            $down_data = getFile($data['audio'],"audio",$audio_name);
            if ($down_data && !empty($down_data['file_name'])){
                $data['audio_name'] = $down_data['file_name'];
            }
        }
        return $data;
    }

    //爱词霸
    private function queryIciba($word){
        $word = strtolower($word);
        $result = file_get_contents("http://dict-co.iciba.com/api/dictionary.php?w={$word}&type=json&key=4ECE0B4F899D35A6BD5FD08A63508E6E");

        $result = json_decode($result,true);
        //不转码
        $json = json_encode($result,JSON_UNESCAPED_UNICODE);

        $data = [];

        //判断是否查到
        if (empty($result['word_name'])){
            return $data;
        }

        //处理翻译
        $detailArr = $result['symbols'][0];
//        halt($detailArr);
        $cn = '';
        foreach ($detailArr['parts'] as $part){
            $cn.=$part['part']." ".implode(',',$part['means']).'\n';
        }
        $cn = trim($cn,'\n');

        //数据处理,使用美式发音,并存入数据库
        $en = strtolower($result['word_name']);
        $data['word'] = $word;
        $data['en'] = $en;
        $data['cn'] = $cn;
        $data['pron'] = $detailArr['ph_am'];
        $data['note'] = $json;

        //下载音频
        //处理下载链接
        $audio_url = $detailArr['ph_am_mp3'];
        if ($audio_url == ''){
            $audio_url = "http://media.shanbay.com/audio/us/".strtolower($word).".mp3";
        }
//        $explode = explode("/",$audio_url);
//        $audio_name = end($explode);
        $audio_name = $en.strrchr($audio_url,".");

        $down_data = getFile($audio_url,"audio",$audio_name);
        if ($down_data && !empty($down_data['file_name'])){
            $data['audio_name'] = $down_data['file_name'];
        }
        return $data;
    }

    /**
     * 目前思路:
     * 先查扇贝,再查爱词霸,如果爱词霸的MP3是空的(ph_en_mp3),就直接使用扇贝的MP3,地址是:
     * http://media.shanbay.com/audio/us/easy.mp3
     * http://dict.youdao.com/dictvoice?audio=these&type=1
     *  用的是美式发音
     */

}