遵照nodejs的http模块通过smartqq实现活动收发qq音讯的顺序

  此post跟上述的并没有太大的例外,不过要专注option的path要变了,以及content-length固定不变,option的代码如下,

看山如故山,看水仍然水,此乃第三地步,这是我正在修炼的人生路程。

我为了操作方便把它封装在了模块中。

任由漂到啥地方,我毕竟是大山的男女,我平昔要带着大山给予自己的丰采去经营好团结的人生。

 

图片 1

从这之后,程序编的大都了,作为并不懂行的noder,自然是有广大欠缺,也指望有大神可以提议。

大家地点有一种药用的木瓜树,结的番木瓜既可以入药,也可以酿酒。那一年木瓜的需求量很大,通公路的地点可以卖到三毛钱一斤,但山上的就只能卖到两毛钱一斤。

var options = {
    host: "d1.web2.qq.com",
    method: "POST",
    path: "/channel/poll2",/*注意此处*/
    headers: {
        'Host': 'd1.web2.qq.com',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
        'Accept': '*/*',
        'Accept-Language': 'en-US,en;q=0.5',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Referer': 'https://d1.web2.qq.com/cfproxy.html?v=20151105001&callback=1',
        'Content-Length': '395',/*我认为由于参数不同你们的不一定是395,自己抓包即可获得长度*/
        'Cookie': '',/*出于安全考虑隐去cookie*/
        'Connection': 'keep-alive'
    }
};

自家是落地在大山里的男女,在十岁往日,不曾见过都市的指南,而书上说的“上海天安门”我觉得是存在于漫长的童话里,所以我对山有着别样的真情实意。

      在smartqq上承受音信的法则是络绎不绝post
poll2当有人发给你音讯时post就会响应,响应内容即为接受内容。那么模拟它即可。

03 山中的成才

     
背景:十一月1日我们实验室的qq群引入了一个闲聊机器人,可实现签到,打劫,玩游戏(如24点,猜字谜等)等的效益,签到,打劫成功,游戏胜利(如24点回答正确)可取得积分,寒假时并未关注群所以开学时自己并非积分,而其他同学都已为富一方,尤其是某学长积分竟达十万之巨,(签到两次100左右,24点回答正确100),遂疑惑,问之,学长曰:无她,刷分耳。于是在一月9日,参考了下学长的笔触(http://www.zhangzaizai.com/2017/02/08/xiaozi-helper/),便开始试着开发一个刷分的辅助。

高校毕业签工作时原本是足以签到故乡县城的,但本身决然的选项了离家。我不可能经受自己拼命了那么多年依然回到原地的规范。

 

看山不是山,看水不是水,此乃第二境界,这映射了本人这想竭力逃出的年青;

   重点在于对响应的拍卖。当自己输入“先河24点”后小紫(机器人)会回来这样一段话:”24点起首!数字(共有6种解法):8,
8, 8, 5将上述数字加减乘除(+,-,*,/)得出24,并列出算式即可。如发送:24点
(4-2)*12/1″,当自家答应正确后会重回:”很勇敢!算式正确。扩张100积分当前数字(共有20种解法):9,
9, 3, 5将上述数字加减乘除(+,-,*,/)得出24,并列出算式即可。如发送:24点
(4-2)*12/1″,我要做的是科学获取多少个数字并防止任何音信烦扰,同时不可能在没拿到音讯,即没人互动时先后整个挂掉(会回到一个HTML网页),还要遵照4个数字总计得出正确的字符串。

01 山中意思

  步骤

突然想到了佛家里的人生三境界:

  技术:我的后端平台是nodejs,其他框架不是学得很深所以用最底部的http模块来发送post请求。用公开传输消息的smartqq来作为post的接受端。

这时候没有知道污染是怎么,放羊的时候玩累了,趴下来咕咚咕咚喝几口山泉水,就觉着无比满意;夏季穿着露趾凉鞋,在山里疯颠着脚都曾经看不到皮肤的颜色了,仍旧认为心花怒放快乐。

       6. 然后就ok了,当屏幕上冒出send
ok时激情仍然蛮感动的,然后相当鼓劲的告诉学长,只听学长一声“你可以发请求头要求它不做gzip压缩的”,遂删去Accept-Encoding。发送信息至此即便成功了。在此向某个被自己拿来做试验的群说声抱歉,我不是故意水的。。

您可能会问:“山里的童年早晚过得很贫困吧?”事实上,童年却是无比喜上眉梢的时节。因为这时自己向来不了然外面世界的儿女们有成千上万玩具,美味的零食,雅观的整圆裙。我觉着在田野里奔跑,在树丛里捉迷藏,去河里抓鱼,就丰富快乐了。

  1.   明白只需发送二种post请求,一是意味着发送新闻的send_qun_msg2,可以看来在F12下post音讯分外详细,那么在nodejs中照本宣科即可。图片 2

    var http = require('http');
    exports.post = function (contents) {
        var options = {
            host: "d1.web2.qq.com",
            method: "POST",
            path: "/channel/send_qun_msg2",
            headers: {
                'Host': 'd1.web2.qq.com',
                'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
                'Accept': '*/*',
                'Accept-Language': 'en-US,en;q=0.5',
                'Content-Type': 'application/x-www-form-urlencoded',
                'Referer': 'https://d1.web2.qq.com/cfproxy.html?v=20151105001&callback=1',
                'Content-Length': contents.length,
                'Cookie': '',/*出于安全考虑隐去cookie*/
                'Connection': 'keep-alive'
            }
        };
        var req = http.request(options, function (res) {});
        req.write(contents);
        req.end();
    };
    

     

     

因为离公路还有一段距离,把粮食从山上运到公路边是一件劳碌的业务,所以农作物也卖不起价。

  1. 从24点算法初叶,我在(http://www.99cankao.com/numbers/24game.php)网页上直接找到了计算24点的代码(如下图)![](https://images2015.cnblogs.com/blog/1036288/201704/1036288-20170422002936868-77582414.png),把输入的交互改成参数传入,并把返回值改成字符串后就可以直接用了,我把它封装在了calc模块中方便调用,代码如下。

    function tdisoper(f0, f1, f2, f3) {
    this[0] = f0;
    this[1] = f1;
    this[2] = f2;
    this[3] = f3;
    }
    disoper = new tdisoper("-", "+", "/", "*");
    function oper(f, m, n) {
    if (f === 3) return (m * n);
    if (f === 2) return (m / n);
    if (f === 1) return (parseFloat(m) + parseFloat(n));
    if (f === 0) return (m - n);
    }
    function tb(i1, i2, i4, i8) {
    this[1] = i1;
    this[2] = i2;
    this[4] = i4;
    this[8] = i8;
    }
    function valid(a,b,c,d) {
    var result = '';
    n = 1;
    b = new tb(a, b, c, d);
    k = 0;
    var output = "";
    for (i1 = 1; i1 <= 8; i1 *= 2)
    for (i2 = 1; i2 <= 8; i2 *= 2)
    for (i3 = 1; i3 <= 8; i3 *= 2)
    for (i4 = 1; i4 <= 8; i4 *= 2) {
    if ((i1 | i2 | i3 | i4) !== 0xf) continue;
    for (f1 = 0; f1 <= 3; f1++)
    for (f2 = 0; f2 <= 3; f2++)
    for (f3 = 0; f3 <= 3; f3++) {
    m = oper(f3, oper(f2, oper(f1, b[i1], b[i2]), b[i3]), b[i4]);
    if (Math.abs(m - 24) < 1e-5) {
    result = result + "((" + b[i1] + disoper[f1] + b[i2] + ")" + disoper[f2] + b[i3] + ")" + disoper[f3] + b[i4];
    if ((n !== 0) && (++k >= n)) return result;
    }
    m = oper(f1, b[i1], oper(f3, oper(f2, b[i2], b[i3]), b[i4]));
    if (Math.abs(m - 24) < 1e-5) {
    result = result + b[i1] + disoper[f1] + "((" + b[i2] + disoper[f2] + b[i3] + ")" + disoper[f3] + b[i4] + ")";
    if ((n !== 0) && (++k >= n)) return result;
    }
    m = oper(f3, oper(f1, b[i1], oper(f2, b[i2], b[i3])), b[i4]);
    if (Math.abs(m - 24) < 1e-5) {
    result = result + "(" + b[i1] + disoper[f1] + "(" + b[i2] + disoper[f2] + b[i3] + "))" + disoper[f3] + b[i4];
    if ((n !== 0) && (++k >= n)) return result;
    }
    m = oper(f1, b[i1], oper(f2, b[i2], oper(f3, b[i3], b[i4])));
    if (Math.abs(m - 24) < 1e-5) {
    result = result + b[i1] + disoper[f1] + "(" + b[i2] + disoper[f2] + "(" + b[i3] + disoper[f3] + b[i4] + "))";
    if ((n !== 0) && (++k >= n)) return result;
    }
    m = oper(f2, oper(f1, b[i1], b[i2]), oper(f3, b[i3], b[i4]));
    if (Math.abs(m - 24) < 1e-5) {
    result = result + "(" + b[i1] + disoper[f1] + b[i2] + ")" + disoper[f2] + "(" + b[i3] + disoper[f3] + b[i4] + ")";
    if ((n !== 0) && (++k >= n)) return result;
    }
    
                                }
                    }
    return result;
    
    exports.cal = function(a,b,c,d){
    return valid(a,b,c,d);
    };
    

     

     

  2. 处理响应体并发送,代码如下,注释基本解释清楚,如有疑问欢迎提问。

    var req = http.request(options, function (res) {
        res.on('data', function (body) {
            if (body.toString().search('<html>') === -1) {/*此处是为了避免长时间未收到数据导致程序直接崩溃*/
                var str;
                str = JSON.parse(body.toString());/*解析响应体为JSON格式*/
                console.log("接受消息  " + str.result[0].value.content);/*获得接受内容*/
                if (str.result[0].value.send_uin === 8888888/*此处出于安全考虑。。*/) {
                    var usethen;/*含有关键4个数字的字符串*/
                    if (str.result[0].value.content.length >= 6)/*避免无关信息干扰*/
                        usethen = str.result[0].value.content[5];
                    if (usethen!==undefined) {
                        var use = usethen.match(/\u89e3[^\n]*\u4ee5/g);/*利用正则表达式获取从'解'到'以'的字符串*/
                        var number;
                        if (use!==undefined)
                            number = use[0].match(/[0-9]/g);  /*利用正则获取4个重要数字*/
                        console.log("获得数字" + number);
                        if (number !== undefined) {
                            var result = calc.cal(number[0], number[1], number[2], number[3]);
                            console.log("得到结果" + result);
                            var reg = /["][^\n]*[",]/;
                            rr.content = rr.content.replace('开始24点', "24点 " + result);/*rr就是上面的rr*/
                            contents2 = encodeURI('r=' + JSON.stringify(rr));
                            contents2 = contents2.replace('+', '%2b');/*为什么有这四个,我要放在下面讲*/
                            contents2 = contents2.replace('+', '%2b');
                            contents2 = contents2.replace('+', '%2b');
                            contents2 = contents2.replace('+', '%2b');
                            post.post(contents2);
                        }
                    }
                }
            }
        });
        res.on('err', function (err) {
            console.log(err);
        })
    });
    req.write(contents);
    req.end();
    

     

    为什么自己要写三个contents =
    contents.replace(‘+’,’%2b’)呢,因为encodeURI函数不会变换加号等特殊字符,导致自身发送出去的字符串从来尚未加号,这里又卡了我弹指间。如有更好的措施,希望有大神教与自家。

  3. 说到底是轮询发送poll2的问题,我一先导从来有error彰显write
    after
    end,后来发现是自个儿从不给req重新赋值,相当于请求截至后连续write自然有错,于是把赋值写在了轮询中。

于是从高中到高校,我初步有点嫌弃大山,嫌弃它给自身的“山里人”身份,嫌弃它的不便宜,嫌弃它的不通。

 

每当看到他俩多少人肩膀上被背篓勒出的丙申革命印痕以及额头上豆大的汗液,我似乎从这时候开首发现到:山里的活着接近并从未那么容易!

  接下去是经受信息。

上大学的时,寒暑假自我在家呆的时刻都极短,一个休假的全职充足自己多少个月的日用了,我不止的想逃离大山,离得越远越好。

  1. 而是这类似简单的代码实际上出过很大的题目,这是本人已经重整过得代码,但是在最初我的content并不是表面的参数,而是自己定义的一个JSON(如下

    var rr = {
        "group_uin": 4111913875,
        "content": "[\"开始24点\",[\"font\",{\"name\":\"宋体\",\"size\":10,\"style\":[0,0,0],\"color\":\"000000\"}]]",
        "face": 210,
        "clientid": 53156849,/*出于安全考虑隐去真实数字,换以同长数字*/
        "msg_id": 62220001,
        "psessionid": ""/*出于安全考虑隐去psessionid*/
    };
    

     

     

     

    ),然则传输老退步,后来精通学长,发现其实传输的情节并不是一贯JSON,而需要通过URLencode加密,于是我调用了nodejs自带的encodeURI函数把上述加密后传输(),后即中标

    var contents2 = encodeURI('r=' + JSON.stringify(rr));
    

     

     

     
    
  2. 但随即我就碰见了另一个题目,我的响应是一堆乱码,尽管给群里发送音信并不需要考虑响应,然则自己post的法子必然是相同的,也就象征我经受群里音信时也是一顿乱码,就更别谈处理了。这些问题大体花了自我两天时间,一初阶怀疑是charset,utf-8的题目,于是在请求头里各样改(比如request.setCharacterEncoding(“utf-8”)),不过并没有用,又怀疑smartqq用的有史以来不是utf-8,一查是的(如下图)图片 3

  3. 接下来继续想,这之间查阅了成百上千网站,比如(http://blog.csdn.net/zsr\_251/article/details/49993911)于是猜测问题在buffer的拼接上,几经周折尝试各种方法(如

    var buf=Buffer.concat(chunks,size);
     var str=iconv.decode(buf,'utf-8');
    

     

     

     
    

    )依然相当。

  4. 说到底打算对于请求头消息一个一个解析发现了那些

    'Accept-Encoding': 'gzip, deflate, br',
    

     

     

     
    

    于是寻求相关消息,发现(http://www.jb51.net/article/61721.htm)这个网站,尝试着解压了下响应体,如

    zlib.unzip(body, function (err, buffer) {
    console.log(buffer.toString());
    }) 
    

     

     

     
    

哪个地方有棵野杏树,何地有覆盆子,什么地方有野葡萄……我都门儿清。

新生自己独自去了天涯海角,在小城市里有了团结的家,再回过头来看时,才猛然发现:原来已经被自己嫌弃的大山却在冥冥之中给了温馨许多力量,比如踏实,比如坚韧,比如吃苦勤苦,比如乐观向上。

首先次体会到大山的辛劳是十岁之后的事务。那时候我哥读初中了,家里的经济负担也就重了起来,但除此之外种粮食,家里并从未太多划算来源。

看着自我和堂哥的学费还没有着落,勤劳的生母便想出了扭亏为盈的路径——和收购木瓜的小贩探讨好,大家在巅峰以两毛的价位收木瓜,然后背到公路边,再以三毛的价格卖给她。

看山是山,看水是水,此乃第一境界,这一境界映似乎射了自家那畅快的时辰候;

02 山中费力

当年早上放学后和放寒暑假的时候,都会和小伙伴们一齐到山顶放羊,所以对于大山的每一个角落都那么的耳熟能详,好像整座大山都是自家的后花园。

新兴上了高中之后,我被同学称为“山里头的人”,其实这只是一个称呼而已,并无恶意。可在当时的我看来,这类似是一件挺不光彩的事宜,因为别人是“县里的人”,而自我是“山里头的人”,仿佛刹那间就矮了一截。

为了赚这每斤一毛钱的差价,阿姨,姑丈,小弟齐上阵,顶着冬季三十多度的高温,一个暑假收了四五千斤的木瓜,然后以单程两海里山路的相距,一背篓又一背篓背到公路边。就如此一个暑假赚了500元钱,凑够了我和兄长的学费。