当前位置 : 主页 > 网络编程 > PHP >

基于图灵机器人的新浪微博私信自动回复

来源:互联网 收集:自由互联 发布时间:2021-06-30
移植微信公众平台DEMO修改,挂在新浪微博的私信聊天机器人。测试微博@海经院论坛 1. [代码] CallbackDemo.php ?php//接口要求返回的字符串需要是utf8编码。header( 'Content-type: text/html; charset=
移植微信公众平台DEMO 修改,挂在新浪微博的私信聊天机器人。测试微博@海经院论坛

1. [代码]CallbackDemo.php    

<?php
//接口要求返回的字符串需要是utf8编码。
header( 'Content-type: text/html; charset=utf-8' );
//加载SDK
require_once 'CallbackSDK.php';
//设置app_key对应的app_secret
define("APP_SECRET", "*************");
//初始化SDK
$call_back_SDK = new CallbackSDK();
$call_back_SDK->setAppSecret(APP_SECRET);
//签名验证
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
if (!$call_back_SDK->checkSignature($signature, $timestamp, $nonce)) {
    die("check signature error");
}
//首次验证url时会有'echostr'参数,后续推送消息时不再有'echostr'字段
//若存在'echostr'说明是首次验证,则返回'echostr'的内容。
if (isset($_GET["echostr"])) {
    die($_GET["echostr"]);
}
//处理开放平台推送来的消息,首先获取推送来的数据.
$post_msg_str = $call_back_SDK->getPostMsgStr();
/**
 * 设置接口默认返回值为空字符串。
 * 请注意数据编码类型。接口要求返回的字符串需要是utf8编码
 * 需要说明的是开放平台判断推送成功的标志是接口返回的http状态码,
 * 只要应用的接口返回的状态为200就会认为消息推送成功,如果http状态码不为200则会重试,共重试3次。
 */
$str_return = '';
if (!empty($post_msg_str)) {
    //sender_id为发送回复消息的uid,即蓝v自己
    $sender_id = $post_msg_str['receiver_id'];
    //receiver_id为接收回复消息的uid,即蓝v的粉丝
    $receiver_id = $post_msg_str['sender_id'];
    //回复text类型的消息示例。

    $keyword= $post_msg_str['text'];
    //图灵API
     $apiKey = "*****************";
     $apiURL = "http://www.tuling123.com/openapi/api?key=KEY&info=INFO";

// 设置报文头, 构建请求报文
    $reqInfo = $keyword;
    $url = str_replace("INFO", $reqInfo, str_replace("KEY", $apiKey, $apiURL)); 
    $res =file_get_contents($url);
    $result = json_decode($res);
    $jiaoyan=$result->{'code'};
    switch($jiaoyan){
        case "200000":
        $data_type = "text";
        $wz=$result->{'text'};
        $lj=$result->{'url'};
        $xx=$wz.$lj;
        $data = $call_back_SDK->textData("$xx");
        break;
        case "302000":
        //$data_type = "text";
        //$lb=$result->{'list'};
        //$xx=var_export ($lb, TRUE);
        //$data = $call_back_SDK->textData("$xx");
        $data_type = "articles";
        $length = count($result['list']) > 9 ? 9 :count($result['list']);
			for($i= 0;$i< $length;$i++){
				$articles [$i] = array (
						'display_name' => $result['list'][$i]['article'],
						'summary' => $result['list'][$i]['article'],
						'image' => $result['list'][$i]['icon'],
						'url' => $result['list'][$i]['detailurl'] 
				);
			}
        $data = $call_back_SDK->articleData($articles);
        break;
        case "40001":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40002":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40003":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40004":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40005":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40006":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        case "40007":
        $data_type = "text";
        $xx="(>﹏<)我累了,需要休息一下。";
        $data = $call_back_SDK->textData("$xx");
        break;
        default:
        $data_type = "text";
        $xx=$result->{'text'};
        $data = $call_back_SDK->textData("$xx");
    }
    $str_return = $call_back_SDK->buildReplyMsg($receiver_id, $sender_id, $data, $data_type);
}
echo json_encode($str_return);

2. [代码]CallbackSDK.php    

<?php



class CallbackSDK {

    private $app_secret = "";



    /**

     * 设置app_key对应的app_secret。

     * @param $app_secret

     */

    public function setAppSecret($app_secret) {

        $this->app_secret = $app_secret;

    }



    /**

     * 获取推送来的的数据

     * 必须使用 $GLOBALS['HTTP_RAW_POST_DATA']方法获取post过来的原始数据来解析.

     * @return mixed

     */

    public function getPostMsgStr() {

        return json_decode($GLOBALS['HTTP_RAW_POST_DATA'], true);

    }



    /**

     * 验证签名

     * @param $signature

     * @param $timestamp

     * @param $nonce

     * @return bool

     */

    function checkSignature($signature, $timestamp, $nonce) {

        $tmpArr = array($this->app_secret, $timestamp, $nonce);

        sort($tmpArr, SORT_STRING);

        $tmpStr = sha1(implode($tmpArr));

        if ($tmpStr == $signature) {

            return true;

        } else {

            return false;

        }

    }



    /**

     * 组装返回数据

     * @param $receiver_id

     * @param $sender_id

     * @param $data

     * @param $type

     * @return array

     */

    function buildReplyMsg($receiver_id, $sender_id, $data, $type) {

        return $msg = array(

            "sender_id" => $sender_id,

            "receiver_id" => $receiver_id,

            "type" => $type,

            //data字段需要进行urlencode编码

            "data" => urlencode(json_encode($data))

        );

    }



    /**

     * 生成text类型的回复消息内容

     * @param $text

     * @return array

     */

    function textData($text) {

        return $data = array("text" => $text);

    }



    /**

     * 生成article类型的回复消息内容

     * @param $article

     * @return array

     */

    function articleData($articles) {

        return $data = array(

            'articles' => $articles

        );

    }



    /**

     * 生成position类型的回复消息内容

     * @param $longitude

     * @param $latitude

     * @return array

     */

    function positionData($longitude, $latitude) {

        return $data = array(

            "longitude" => $longitude,

            "latitude" => $latitude

        );

    }

}
网友评论