zoukankan      html  css  js  c++  java
  • 【chrome插件】web版微信接入图灵机器人API实现自动回复

    小贱鸡自动回复API已经不可以用了,现在改良接入图灵机器人API

    360chrome浏览器团队翻译了部分谷歌插件开发文档

    地址:http://open.chrome.360.cn/extension_dev/overview.html

    具体封装插件的方法请参考开发文档。

    具体代码如下:

    background.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    //在当前URL下运行 https://wx.qq.com/
    var status = 0; //0停止 1运行
    //消息传递监听 onRequest
    chrome.extension.onRequest.addListener(
        function (request, sender, sendResponse) {
        var text = request.text;
        var nick = request.nick;
        console.log(sender.tab ?
            "from a content script:" + sender.tab.url :
            "from the extension");
        console.log("收到消息:" + text);
        if (text != null && text.length > 0) {
            console.log("请求机器人获取回复");
            //请求机器人获取回复
            tulingQuery(nick,text, function (content,data) {
                sendResponse({
                    dstContent : content, 
                    reply : data
                });
            });
        else {
            sendResponse({
                reply : "未识别出留言内容"
            });
        }
     
    });
     
    chrome.browserAction.onClicked.addListener(function (tab) {
        if (tab.url.indexOf("wx.qq.com") >= 0) {
            //对 contentScript 发送消息
            if (status == 0)
                status = 1;
            else
                status = 0;
            console.log("send request");
            chrome.tabs.sendRequest(tab.id, {
                status : status
            }, function (response) {
                console.log(response);
            });
            //run();
        else {
            alert("这个只能在微信web运行!");
            console.log("只能在微信web运行");
        }
    });
     
    //图灵机器人回复
    function tulingQuery(userid, txt, callback) {
        $.ajax({
            url : 'http://www.tuling123.com/openapi/api',
            type : 'get',
            data : {
                key : 'e64ad48100081ab77b668aa3105fe552',
                info : txt,
                userid : userid
            },
            success : function (data) {
                console.log(data);
                if (callback)
                    callback(txt, data.text);
            },
            error : function () {}
        });
    }
     
     
    //  chrome.tabs.executeScript(null, {code: "console.log(666);"});

    content_script.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    window.confirm = function () {}
    var GSid, wx = new WX();
    //消息传递监听 onRequest
    chrome.extension.onRequest.addListener(
        function (request, sender, sendResponse) {
        var status = request.status;
        console.log(sender.tab ?
            "from a content script:" + sender.tab.url :
            "from the extension");
        console.log("收到消息:" + status);
        if (status == 1) {
            //运行
            GSid = setInterval(function () {
                    wx.reload();
                    var item = wx.getReply();
                    if (item.title == "红包家族") {
                        wx.openLatestRoom();
                        return;
                    }
     
                    if (!wx.isReplied(item) && item.text != "") {
                        console.log("判断是否回复过了");
                        console.log(item);
                        console.log("未回复过");
                        wx.replyComplete(item);
                        sendToExtension(item, function (content, reply) {
                            //提交回复
                            console.log("机器人回复:" + reply);
                            wx.putReply(item, reply + "[机器人测试回复]");
                        });
                    else {
                        wx.replyComplete(item);
                        wx.openLatestRoom();
                    }
     
                    console.log("扫描回复ing...");
                }, 3000);
     
            alert("自动回复启动");
            console.log("自动回复启动");
        else {
            //停止
            clearInterval(GSid);
            alert("自动回复停止");
            console.log("自动回复停止");
        }
        sendResponse({
            farewell : "contentScript 收到了消息"
        });
    });
     
    //对插件发送消息
    function sendToExtension(item, callbackFun) {
        console.log("send request");
        chrome.extension.sendRequest({
            text : item.text,
            nick : item.nick
        }, function (response) {
            var reply = response.reply;
            var content = response.dstContent;
            console.log(reply);
            if (callbackFun)
                callbackFun(content, reply);
        });
    }
     
    //微信操作对象 var wx = new WX();
    function WX() {
     
        var thisObj = this;
     
        //微信所有者
        this.wxOwner = function () {
            return $(".display_name").text();
        };
     
        //获得最新的回复内容
        this.getReply = function () {
            var reply = {};
            var $lst = $("[ng-switch] .you"); //未回复的列表
            var $info = $lst.not('[reply]').first(); //未回复的记录
            if ($info != null && $info.length > 0) {
                reply["text"] = $info.find(".js_message_plain").text(); //未回复的内容
                reply["nick"] = $info.find(".avatar").attr("title"); //未回复的备注名称
                reply["title"] = $info.parents('.chat_bd.scroll-wrapper:first').prev().find('.title_name').text(); //聊天框title
                reply["touser"] = $info.parents('[jquery-scrollbar]').attr('data-cm');
                reply["touser"] = JSON.parse(reply["touser"]).username;
                reply["index"] = $lst.index($info);
                reply["item"] = $info;
            }
            return reply;
        };
     
        //提交回复
        this.putReply = function (item, replyContent) {
            //$("#editArea").html("回复:[[" + dstContent + "]]        " + replyContent);
            //$(".btn_send").click();
            var json = tl.getJsonMsg(item.touser, "回复:[[" + item.text + "]]     " + replyContent);
            tl.sendMsg(json);
        };
     
        //已经回复过集合
        this.repliedArray = [];
     
        //判断是否回复过
        this.isReplied = function (obj) {
            var md5Str = faultylabs.MD5(obj.title + "" + obj.nick + "" + obj.text);
            if (!thisObj.repliedArray.contains(md5Str)) {
                return false;
            else {
                return true;
            }
        }
     
        //完成回复
        this.replyComplete = function (obj) {
            var md5Str = faultylabs.MD5(obj.title + "" + obj.nick + "" + obj.text);
            if (!thisObj.repliedArray.contains(md5Str)) {
                thisObj.repliedArray.push(md5Str);
            }
        }
     
        //重载处理回复列表
        this.reload = function (callbackFun) {
            var $lst = $("[ng-switch] .you"); //未回复的列表
            $.each($lst.not("[reply]"), function (idx, item) {
                var $info = $(item);
                var reply = {};
                if ($info != null && $info.length > 0) {
                    reply["text"] = $info.find(".js_message_plain").text(); //未回复的内容
                    reply["nick"] = $info.find(".avatar").attr("title"); //未回复的备注名称
                    reply["title"] = $info.parents('.chat_bd.scroll-wrapper:first').prev().find('.title_name').text(); //聊天框title
                    reply["touser"] = $info.parents('[jquery-scrollbar]').attr('data-cm');
                    reply["touser"] = JSON.parse(reply["touser"]).username;
                    reply["index"] = $lst.index($info);
                    reply["item"] = $info;
                }
                if (thisObj.isReplied(reply))
                    $(item).attr("reply""");
                if (callbackFun)
                    callbackFun();
            });
        }
     
        //打开最新的聊天框
        this.openLatestRoom = function () {
            $("[ng-repeat='chatContact in chatList track by chatContact.UserName'] .chat_item .icon:first").click();
        }
    }
     
    //数组拓展方法
    Array.prototype.contains = function (obj) {
        var i = this.length;
        while (i--) {
            if (this[i] === obj) {
                return true;
            }
        }
        return false;
    }
     
    //图灵对象
    var tl = {
        getJsonMsg : function (activeroom, text) {
            var json = {
                "BaseRequest" : {
                    "Uin" : +util.getCookie("wxuin"),
                    "Sid" : util.getCookie("wxsid"),
                    "Skey" : util.getSkey(),
                    "DeviceID" : util.getDeviceID()
                },
                "Msg" : {
                    "Type" : 1,
                    "Content" : text,
                    "FromUserName" : util.getFromUserName(),
                    "ToUserName" : activeroom,
                    "LocalID" : util.Now(),
                    "ClientMsgId" : util.Now()
                }
            };
            return json;
        }, //
        sendMsg : function (json, cbfunc) {
            var jsonStr = JSON.stringify(json);
            $.ajax({
                url : 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg',
                data : jsonStr,
                type : 'POST',
                dataType : 'json',
                success : function (d) {
                    if (cbfunc)
                        cbfunc(d);
                }
            });
        //
    }; //
     
    //工具包
    var util = {
     
        getDeviceID : function () {
            return "e" + ("" + Math.random().toFixed(15)).substring(2, 17)
        },
        Now : function () {
            return  + (+new Date + "" + Math.round(Math.random() * 10000))
        }, //
        getCookie : function (e) {
            for (var t = e + "=", o = document.cookie.split(";"), n = 0; n < o.length; n++) {
                for (var r = o[n]; " " == r.charAt(0); )
                    r = r.substring(1);
                if (-1 != r.indexOf(t))
                    return r.substring(t.length, r.length)
            }
            return ""
        }, //
        getSkey : function () {
            var src = $(".main_inner .header .avatar img").attr("src");
            var result = /@crypt_.{0,41}/.exec(src);
            return result != null && result.length > 0 ? result[0] : "";
        },
        getFromUserName : function () {
            var src = $(".main_inner .header .avatar img").attr("src");
            var result = /&username=(@.+?)&/.exec(src);
            return result != null && result.length > 0 ? result[1] : "";
        }, //
        getActiveRoom : function () {
            var cmStr = $("[ng-repeat='chatContact in chatList track by chatContact.UserName'] .active").attr("data-cm");
            var json = JSON.parse(cmStr);
            return json != null && json.username != null ? json.username : "";
        //
    }; //

    manifest.json

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    {
        "name" "图灵机器人微信自动回复",
        "description" "图灵机器人微信自动回复",
        "version" "1.1",
        "background" : {
            "scripts" : ["jquery.min.js""md5.js""background.js"]
        },
        "content_scripts" : [{
                "matches" : ["https://*.qq.com/*","http://*.qq.com/*"],
                "js" : ["jquery.min.js""md5.js""content_script.js"]
            }
        ],
        "permissions" : [
            "tabs""http://*/*""https://*/*"
        ],
        "icons" : {
            "16" "icon.png",
            "48" "icon.png",
            "128" "icon.png"
        },
        "browser_action" : {
            "default_icon" "icon.png"
        },
        "homepage_url" "http://www.cnblogs.com/mahatmasmile/",
        "manifest_version" : 2
    }

    额外引用的插件:

    jquery.min.js

    md5.js

    文件目录结构如下:

    temp.png

    插件和源文件下载地址:

    http://pan.baidu.com/s/1wPHy2

  • 相关阅读:
    git clone 慢,使用镜像
    Mysql 插入 path 插入不进去值
    os.walk 获取文件夹下所有的文件
    Manjaro安装后你需要这样做(仅有网址)
    Mysql 查询优化
    pandas df.to_csv 可保存为 txt 类型 index 设置索引 header 列名 sep 使用什么进行分隔
    pandas pd.to_markdown() 转换为 Markdown pd.to_latex() 转换为 latex
    pandas 读取txt seq分隔符类型 engine指定引擎 header 不将第一行作为列名
    pandas 读取文件时 header设置列名 index_col 设置索引 usecols 读取哪几列 parse_dates 将哪一列设置为时间类型 nrows 读取数据行数
    numpy cumprod 累乘 cumsum 累加 diff 和前一个元素做差值
  • 原文地址:https://www.cnblogs.com/mahatmasmile/p/4788654.html
Copyright © 2011-2022 走看看