akismet.php

来自「Bug tracker, and reporter.」· PHP 代码 · 共 388 行

PHP
388
字号
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Service * @subpackage Akismet * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License * @version    $Id: Akismet.php 8504 2008-03-01 20:15:57Z weppos $ *//** * @see Zend_Version */require_once 'Zend/Version.php';/**    * @see Zend_Service_Abstract */require_once 'Zend/Service/Abstract.php';/** * Akismet REST service implementation * * @uses       Zend_Service_Abstract * @category   Zend * @package    Zend_Service * @subpackage Akismet * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Service_Akismet extends Zend_Service_Abstract{    /**     * Akismet API key     * @var string     */    protected $_apiKey;    /**     * Blog URL     * @var string     */    protected $_blogUrl;    /**     * Charset used for encoding     * @var string     */    protected $_charset = 'UTF-8';    /**     * TCP/IP port to use in requests     * @var int     */    protected $_port = 80;    /**     * User Agent string to send in requests     * @var string     */    protected $_userAgent;    /**     * Constructor     *     * @param string $apiKey Akismet API key     * @param string $blog Blog URL     * @return void     */    public function __construct($apiKey, $blog)    {        $this->setBlogUrl($blog)             ->setApiKey($apiKey)             ->setUserAgent('Zend Framework/' . Zend_Version::VERSION . ' | Akismet/1.11');    }    /**     * Retrieve blog URL     *     * @return string     */    public function getBlogUrl()    {        return $this->_blogUrl;    }    /**     * Set blog URL     *     * @param string $blogUrl     * @return Zend_Service_Akismet     * @throws Zend_Service_Exception if invalid URL provided     */    public function setBlogUrl($blogUrl)    {        require_once 'Zend/Uri.php';        if (!Zend_Uri::check($blogUrl)) {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Invalid url provided for blog');        }        $this->_blogUrl = $blogUrl;        return $this;    }    /**     * Retrieve API key     *     * @return string     */    public function getApiKey()    {        return $this->_apiKey;    }    /**     * Set API key     *     * @param string $apiKey     * @return Zend_Service_Akismet     */    public function setApiKey($apiKey)    {        $this->_apiKey = $apiKey;        return $this;    }    /**     * Retrieve charset     *     * @return string     */    public function getCharset()    {        return $this->_charset;    }    /**     * Set charset     *     * @param string $charset     * @return Zend_Service_Akismet     */    public function setCharset($charset)    {        $this->_charset = $charset;        return $this;    }    /**     * Retrieve TCP/IP port     *     * @return int     */    public function getPort()    {        return $this->_port;    }    /**     * Set TCP/IP port     *     * @param int $port     * @return Zend_Service_Akismet     * @throws Zend_Service_Exception if non-integer value provided     */    public function setPort($port)    {        if (!is_int($port)) {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Invalid port');        }        $this->_port = $port;        return $this;    }    /**     * Retrieve User Agent string     *     * @return string     */    public function getUserAgent()    {        return $this->_userAgent;    }    /**     * Set User Agent     *     * Should be of form "Some user agent/version | Akismet/version"     *     * @param string $userAgent     * @return Zend_Service_Akismet     * @throws Zend_Service_Exception with invalid user agent string     */    public function setUserAgent($userAgent)    {        if (!is_string($userAgent)            || !preg_match(":^[^\n/]*/[^ ]* \| Akismet/[0-9\.]*$:i", $userAgent))        {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Invalid User Agent string; must be of format "Application name/version | Akismet/version"');        }        $this->_userAgent = $userAgent;        return $this;    }    /**     * Post a request     *     * @param string $host     * @param string $path     * @param array  $params     * @return mixed     */    protected function _post($host, $path, array $params)    {        $uri    = 'http://' . $host . ':' . $this->getPort() . $path;        $client = self::getHttpClient();        $client->setUri($uri);        $client->setConfig(array(            'useragent'    => $this->getUserAgent(),        ));        $client->setHeaders(array(            'Host'         => $host,            'Content-Type' => 'application/x-www-form-urlencoded; charset=' . $this->getCharset()        ));        $client->setParameterPost($params);        $client->setMethod(Zend_Http_Client::POST);        return $client->request();    }    /**     * Verify an API key     *     * @param string $key Optional; API key to verify     * @param string $blog Optional; blog URL against which to verify key     * @return boolean     */    public function verifyKey($key = null, $blog = null)    {        if (null === $key) {            $key = $this->getApiKey();        }        if (null === $blog) {            $blog = $this->getBlogUrl();        }        $response = $this->_post('rest.akismet.com', '/1.1/verify-key', array(            'key'  => $key,            'blog' => $blog        ));        return ('valid' == $response->getBody());    }    /**     * Perform an API call     *     * @param string $path     * @param array $params     * @return Zend_Http_Response     * @throws Zend_Service_Exception if missing user_ip or user_agent fields     */    protected function _makeApiCall($path, $params)    {        if (empty($params['user_ip']) || empty($params['user_agent'])) {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Missing required Akismet fields (user_ip and user_agent are required)');        }        if (!isset($params['blog'])) {            $params['blog'] = $this->getBlogUrl();        }        return $this->_post($this->getApiKey() . '.rest.akismet.com', $path, $params);    }    /**     * Check a comment for spam     *     * Checks a comment to see if it is spam. $params should be an associative     * array with one or more of the following keys (unless noted, all keys are     * optional):     * - blog: URL of the blog. If not provided, uses value returned by {@link getBlogUrl()}     * - user_ip (required): IP address of comment submitter     * - user_agent (required): User Agent used by comment submitter     * - referrer: contents of HTTP_REFERER header     * - permalink: location of the entry to which the comment was submitted     * - comment_type: typically, one of 'blank', 'comment', 'trackback', or 'pingback', but may be any value     * - comment_author: name submitted with the content     * - comment_author_email: email submitted with the content     * - comment_author_url: URL submitted with the content     * - comment_content: actual content     *     * Additionally, Akismet suggests returning the key/value pairs in the     * $_SERVER array, and these may be included in the $params.     *     * This method implements the Akismet comment-check REST method.     *     * @param array $params     * @return boolean     * @throws Zend_Service_Exception with invalid API key     */    public function isSpam($params)    {        $response = $this->_makeApiCall('/1.1/comment-check', $params);        $return = trim($response->getBody());        if ('invalid' == $return) {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Invalid API key');        }        if ('true' == $return) {            return true;        }        return false;    }    /**     * Submit spam     *     * Takes the same arguments as {@link isSpam()}.     *     * Submits known spam content to Akismet to help train it.     *     * This method implements Akismet's submit-spam REST method.     *     * @param array $params     * @return void     * @throws Zend_Service_Exception with invalid API key     */    public function submitSpam($params)    {        $response = $this->_makeApiCall('/1.1/submit-spam', $params);        $value    = trim($response->getBody());        if ('invalid' == $value) {            require_once 'Zend/Service/Exception.php';            throw new Zend_Service_Exception('Invalid API key');        }    }    /**     * Submit ham     *     * Takes the same arguments as {@link isSpam()}.     *     * Submits a comment that has been falsely categorized as spam by Akismet     * as a false positive, telling Akismet's filters not to filter such     * comments as spam in the future.     *     * Unlike {@link submitSpam()} and {@link isSpam()}, a valid API key is     * never necessary; as a result, this method never throws an exception     * (unless an exception happens with the HTTP client layer).     *     * this method implements Akismet's submit-ham REST method.     *     * @param array $params     * @return void     */    public function submitHam($params)    {        $response = $this->_makeApiCall('/1.1/submit-ham', $params);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?