HEX
Server: nginx/1.22.1
System: Linux VM-16-9-centos 3.10.0-1160.99.1.el7.x86_64 #1 SMP Wed Sep 13 14:19:20 UTC 2023 x86_64
User: www (1001)
PHP: 7.3.31
Disabled: 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
Upload Files
File: /www/wwwroot/softfox.com.cn/wp-content/plugins/baidu-submit-link/classes/yandex.class.php
<?php


/**
 * Yandex推送
 * Class WB_BSL_Site
 */

class WB_BSL_Yandex extends WB_BSL_Base
{
    public static function init(){

        $cnf = WB_BSL_Conf::cnf(null);

        if(!$cnf['yandex'] || empty($cnf['yandex_id']) || empty($cnf['yandex_pwd'])){
            return;
        }

        add_action('admin_init', [__CLASS__, 'webmasterToken']);
        //add_action('wp_insert_post', [__CLASS__,'edit_post'], 91, 2);
        add_action('wp_insert_post', [__CLASS__,'wb_push_post'], 91, 2);
        add_action('wb_push_post', [__CLASS__,'edit_post'], 91, 2);
    }

    public static function webmasterToken()
    {
        if(!isset($_GET['code']) || !isset($_GET['state'])){

            return;
        }
        if(!get_option('wb_bsl_ver',0)){
            return;
        }
        $code = trim($_GET['code']);
        $state = trim($_GET['state']);
        if(empty($code) || empty($state)){
            return;
        }

        if('yandex-webmaster' !== $state){
            return;
        }
        $cnf = WB_BSL_Conf::cnf(null);
        $data = [
            'sslverify'=>false,
            'timeout'=>10,
        ];
        $data['body'] = [
            'grant_type'    => 'authorization_code',
            'code'          => $code,
            'client_id'     => $cnf['yandex_id'],
            'client_secret' => $cnf['yandex_pwd'],
        ];

        $http    = wp_remote_post( 'https://oauth.yandex.ru/token', $data );
        $error = '';
        do{
            if(is_wp_error($http)){
                self::error('Token API请求出错,'.$http->get_error_message(),'Yandex推送');
                $error = 'yandex get token error,'.$http->get_error_message();
                break;
            }
            $status_code = wp_remote_retrieve_response_code( $http );
            $body = wp_remote_retrieve_body( $http );
            $ret = [];
            if($body){
                $ret = json_decode($body,true);
            }
            if($status_code !== 200){
                $err = isset($ret['error_description']) ? $ret['error_description'] : 'yandex token error';
                self::error('获取Token出错,'.$err,'Yandex推送');
                $error = ($err).',http-code='.$status_code;
                break;
            }
            $yandex_token = [
                'access_token' => isset($ret['access_token']) ? trim($ret['access_token']) : '',
                'refresh_token' => isset($ret['refresh_token']) ? trim($ret['refresh_token']) : '',
                'expires_in' => isset($ret['expires_in']) ? ($ret['expires_in'] + current_time('U')) : 0,
                'user_id' => 0,
                'host_id' => [],
            ];

            if(empty($yandex_token['access_token']) || empty($yandex_token['expires_in'])){
                $error = 'yandex empty token ';
                self::error('获取Token出错,Token为空。 [help-0]','Yandex推送');
                break;
            }

            $yandex_token['user_id'] = self::webmasterUser($yandex_token['access_token']);
            if($yandex_token['user_id']){
                $yandex_token['host_id'] = self::webmasterHost($yandex_token['user_id'],$yandex_token['access_token']);
            }
            //$yandex_token['host_id'] = serialize($yandex_token['host_id']);
            update_option('bsl_yandex_token',$yandex_token,false);



        }while(0);

        update_option('bsl_yandex_error',$error,false);


        wp_safe_redirect(
            add_query_arg(
                'page',
                'wb_bsl#/setting-api',
                admin_url( 'admin.php' )
            )
        );
    }

    public static function webmasterUser($token)
    {
        $param = [
            'headers' => [
                'Authorization' => 'OAuth ' . $token,
                'Content-Type'  => 'application/json',
            ],
            'timeout' => 10,
            'sslverify' => false,
        ];

        $http    = wp_remote_get( 'https://api.webmaster.yandex.net/v4/user/', $param );
        $error = '';
        $user_id = 0;
        do{
            if(is_wp_error($http)){
                self::error('请求 webmaster API 出错,'.$http->get_error_message(),'Yandex推送');
                $error = 'yandex get user error,'.$http->get_error_message();
                break;
            }
            $status_code = wp_remote_retrieve_response_code( $http );
            $body = wp_remote_retrieve_body( $http );
            $ret = [];
            if($body){
                $ret = json_decode($body,true);
            }
            if($status_code !== 200){
                $err = isset($ret['error_message'])?$ret['error_message']:'yandex get user error';
                self::error('获取 webmaster 出错,'.$err,'Yandex推送');
                $error = ($err).',http-code='.$status_code;
                break;
            }
            $user_id = isset($ret['user_id']) ? $ret['user_id'] : 0;

        }while(0);

        update_option('bsl_yandex_error',$error,false);

        return $user_id;
    }

    public static function webmasterHost($user_id,$token)
    {
        $param = [
            'headers' => [
                'Authorization' => 'OAuth ' . $token,
                'Content-Type'  => 'application/json',
            ],
            'timeout' => 10,
            'sslverify' => false,
        ];

        $http    = wp_remote_get( sprintf( 'https://api.webmaster.yandex.net/v4/user/%d/hosts', $user_id ), $param );
        $error = '';
        $host = [];
        do{
            if(is_wp_error($http)){
                self::error('请求 webmaster host API 出错,'.$http->get_error_message(),'Yandex推送');
                $error = 'yandex get host error,'.$http->get_error_message();
                break;
            }
            $status_code = wp_remote_retrieve_response_code( $http );
            $body = wp_remote_retrieve_body( $http );
            $ret = [];
            if($body){
                $ret = json_decode($body,true);
            }
            if($status_code !== 200){
                $err = isset($ret['error_message'])?$ret['error_message']:'yandex get host error';
                self::error('获取 webmaster host 出错,'.$err,'Yandex推送');
                $error = ($err).',http-code='.$status_code;
                break;
            }

            $host = isset( $ret['hosts'] ) ? wp_list_pluck( $ret['hosts'], 'host_id' ) : [];

        }while(0);

        update_option('bsl_yandex_error',$error,false);

        return $host;
    }



    public static function edit_post($post_id,$post){
        self::info('yandex推送','收录推送');
        if(wp_is_post_revision($post)){
            return;
        }
        if(!get_option('wb_bsl_ver',0)){
            return;
        }
        if(!WB_BSL_Conf::check_post_type($post)){
            return;
        }

        do{
            $active = WB_BSL_Conf::cnf('yandex');
            if(!$active){
                break;
            }
            $token = get_option('bsl_yandex_token');
            if(!$token || !is_array($token)){
                break;
            }
            $post_url = get_permalink($post);
            if(!preg_match('#^https?://#',$post_url)){
                $post_url = home_url($post_url);
            }
            self::info('Yandex,推送url:','收录推送');
            self::info($post_url,'收录推送');
            $token_state = true;
            foreach(['access_token','user_id','host_id','expires_in'] as $f){
                if(!isset($token[$f]) || empty($token[$f])){
                    $token_state = false;
                    break;
                }
            }
            if(!$token_state){
                self::error('yandex token 错误,需更新token','Yandex推送');
                self::info('yandex token 错误,需更新token','收录推送');
                break;
            }
            if($token['expires_in'] < current_time('U')){
                self::error('yandex token 失效,需更新token','Yandex推送');
                self::info('yandex token 失效,需更新token','收录推送');
                break;
            }
            $yandex_host = $token['host_id'];
            if(empty($yandex_host) || !is_array($yandex_host)){
                self::error('yandex host id 为空,需要Yandex添加网站','Yandex推送');
                self::info('yandex host id 为空,需要Yandex添加网站','收录推送');
                break;
            }
            $host_id = $yandex_host[0];


            $type = 33;
            $log = WB_BSL_Utils::push_log($post_id,$type);
            if($log && $log->push_status == 1){
                self::info('已经推送过','收录推送');
                break;
            }

            if($log && current_time('timestamp') - strtotime($log->create_date) < 300){
                self::info('已经推送过','收录推送');
                break;
            }


            //webmaster ping
            $api_url = sprintf( 'https://api.webmaster.yandex.net/v4/user/%s/hosts/%s/recrawl/queue', $token['user_id'], $host_id );

            $param = array(
                'sslverify' => false,
                'timeout' => 10,
                'headers' => array(
                    'Authorization' => 'OAuth ' . $token['access_token'],
                    'Content-Type'  => 'application/json',
                ),
                'body'    => wp_json_encode(
                    array(
                        'url' => $post_url,
                    )
                ),
            );


            $ret = ['code'=>1,'desc'=>'fail'];
            do{
                $http    = wp_remote_post( $api_url, $param );
                if(is_wp_error($http)){
                    self::error('API请求出错,'.$http->get_error_message(),'Yandex推送');
                    $ret['desc'] = 'yandex ping error,'.$http->get_error_message();
                    break;
                }
                $status_code = wp_remote_retrieve_response_code( $http );
                $body = wp_remote_retrieve_body( $http );
                $data = [];
                if($body){
                    $data = json_decode( $body, true );
                }
                if(!preg_match('#^2\d+#',$status_code)){
                    $error = isset($data['error_message']) ? $data['error_message'] : 'yandex ping error';
                    $ret['desc'] = $error.',http-code='.$status_code;
                    self::error('推送出错,'.$error.' [help-0]','Yandex推送');
                    break;
                }
                $ret['code'] = 0;
                $ret['desc'] = 'success';

            }while(0);



            self::info('推送结果【'.$ret['desc'].'】','收录推送');

            WB_BSL_Utils::add_push_log($type,$post_id,$post_url,$ret);


        }while(false);


    }

}