京东价格监控软件开发技术探讨十五:通过酷Q和ZeroMQ实现推送变价变库消息到QQ群-程序员宅基地

技术标签: 爬虫实战:电商采数令  酷Q NetMQ  

在对该需求展开进行说明前,我们需要先了解几个基本名词。

1、酷Q是什么?

简单来说,酷Q是一个QQ机器人软件,能在QQ群里回答、发布信息。相关的机器人软件比较多,如QQLight、

2、ZeroMQ是什么?

简单来说,ZeroMQ是一个网络层的数据通信组件,支持TCP或UDP发送数据。具体到C#,有一个NetMQ的组件,简单好用。

酷Q的使用就不多说了,可以加入酷Q官网或者相关技术群进行学习。

NetMQ的使用非常简单,我们需要创建一个服务端和一个客户端。服务端接收数据,客户端发送数据。

第一步:引用两个类库,AsyncIO和NetMQ,可直接在NuGet下载。

第二步:创建服务端,通过While(true)保持监听

using (NetMQSocket serverSocket = new ResponseSocket())
{
    serverSocket.Bind("tcp://127.0.0.1:5555");
    while (true)
    {
        string message1 = serverSocket.ReceiveFrameString();
        Console.WriteLine("Receive message :\r\n{0}\r\n", message1);
        string[] msg = message1.Split(':');
        string message = msg[1];

        serverSocket.SendFrame(message);
        if (message == "exit")
        {
            break;
        }
    }
}

第三步:创建客户端

 using (NetMQSocket clientSocket = new RequestSocket())
 {
    clientSocket.Connect("tcp://127.0.0.1:5555");
    string message = "Hello";
    clientSocket.SendFrame(num + ":" + message);

    string answer = clientSocket.ReceiveFrameString();
    Console.WriteLine("Answer from server:{0}", answer);
 }

 需要特别注意的是,客户端必须接收服务端的回馈信息,否则会报异常。

上面三步就已经搭建起了基本的NetMQ通信框架。现在我们将这段代码移植到酷Q插件中去。

在插件加载的事件中,将酷QAPI的对象存储下来,然后创建一个NetMQHelper类,在该类的Push(方法名称随意)事件中,编写如下代码。

Task.Factory.StartNew(() =>
                {
                    using (this.Socket = new ResponseSocket($"@tcp://{Common.NetMQSrv}:{Common.ZeroMqPort}"))
                    {
                        BEnable = true;
                        while (BEnable)
                        {
                            //log.Info("ZeroMQ", "Execing");
                            string msg = this.Socket.ReceiveFrameString();
                            if (!string.IsNullOrEmpty(msg))
                            {
                                //log.Info("ZeroMQ", msg);
                                File.AppendAllText($@"{Common.RunDirectory}/Logs/NetMQ.log", $"{DateTime.Now} 收到 {msg}\r\n");
                                if (OnMessage != null)
                                {
                                    OnMessage(msg);
                                }

                            }
                            Socket.SendFrame(msg);
                            //Console.WriteLine("进行 线程" + Thread.CurrentThread.ManagedThreadId);
                        }
                    }
                }, TaskCreationOptions.LongRunning);

其中的OnMessage是一个代理事件,当通过NetMQ接收到数据后,可通过OnMessage和其它业务关联起来进行业务处理,比如调用酷Q的群消息推送。

操作原理就是这样了,赶紧去试试,不明白的可以加群一起讨论。在此说明下,插件的开发是使用的Native.SDK开发框架,在网上搜搜,此处就略过不表。

杀京东 做最走心的电商舆情监控平台 免费开源的价格监控软件 欢迎加入QQ群415014949一起讨论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/36/article/details/105427448

智能推荐

mysql sql语句 引号_sql语句中单引号,双引号的处理方法-程序员宅基地

文章浏览阅读1.5k次。关于Insert字符串 很多同学都在(单引号,双引号)这个方面发生了问题,其实主要是因为数据类型和变量在作怪。下面我们就分别讲述,虽然说的是Insert语句, 但是Select、Update、Delete语句都是一样的。假如有下述表格:mytabe字段1 username 字符串型(姓名)字段2 age 数字型(年龄)字段3 birthday ..._sql单引号里的双引号取值

pandas 难以置信的多重索引2——获取多重索引的值(史上最全)_pandas多重索引取值-程序员宅基地

文章浏览阅读2.4w次,点赞14次,收藏45次。我们平时使用到的多重索引,但是网上很少有人介绍如果获取多重索引本身的值,这部分的内容比上一节更加实用获取多重索引的标签值get_level_values()方法将返回一个特定级别上每个位置的标签向量:iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]arrays = pd.MultiIndex.from_product(iterables, names=['first', 'second'])arrays'''MultiInde_pandas多重索引取值

AllWinnerTech A10添加驱动ko模块方法_allwinner tech a10-程序员宅基地

文章浏览阅读3.8k次。【1】添加Linux触摸屏驱动:添加驱动代码文件:lichee\linux-2.6.36\drivers\input\touchscreen\mg-i2c-ts.clichee\linux-2.6.36\drivers\input\touchscreen\mg-i2c-ts.hkconfig文件lichee\linux-2.6.36\drivers\input\touchscree_allwinner tech a10

python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...-程序员宅基地

文章浏览阅读48次。不过小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版!言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习,无法自拔第一阶段:该阶段首先通过介绍不同领域的三种操作系统,操作系统的发展简史以及Linux系统的文件目录结构让大家对Linux系统有一个简单的认识,同时知道为什么要学习Linux命令。然后我们会正式学..._懂中文就能学会python

JAVA基础面试题-程序员宅基地

文章浏览阅读778次,点赞17次,收藏23次。(2)当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。简单来说,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行,BIO方式适用于连接数目比较小且固定的架构。

RunTimeError:element 0 of tensors does not require grad and does not have a grad_fn_runtimeerror: element 0 of tensors does not requir-程序员宅基地

文章浏览阅读2.3k次。这个错误源于Pytorch对Tensor进行 backward() 自动求导时,该Tensor的requires_grad为False,requires_grad参数指定是否记录对Tensor的操作以便计算梯度。在创建Tensor时该参数默认为False,需要手动设置如下。也可以通过loss.requires_grad_(True)设置。_runtimeerror: element 0 of tensors does not require grad and does not have a

随便推点

android 中 getX getRawX的区别(转)-程序员宅基地

文章浏览阅读43次。出处不明= =!总之是转的。。感谢原作者。RawX,RawY 相对于屏幕位置坐标X,Y 相对于容器的位置坐标在学习android时候,看到MotionEvent类里有两个方法,getX getRawX,看解释,很模糊,看不太懂,这到底什么意思?肯定有区别.具体什么区别呢?一看,两个函数都是返回了整型直,那好办了,把这两个直打印出来..._android x rawx区别

最小攻击超过最大攻击_天谕技术贴:关于最小攻击和最大攻击属性的研究-程序员宅基地

文章浏览阅读484次。坊间一直流传着一种说法,就是最大攻击比最小攻击好,究竟是否确有其事,今天我决定用相对来说比较科学的方法,来一探究竟。为此,我准备了两套首饰+主武先上最小套 和最小属性面板然后是最大套 和 最大面板值得注意的是,因为最小套的主武器上附带了83点的暴击 而最大套的主武器 只附带了41点暴击 中间相差了42点,所以最大套的项链 选择了破坏前缀的,而最小套的项链是勇气前缀,因为暂时不准备测定无双技,所以,..._游戏最小攻击和最大攻击

基于SSM的网上选课系统--79766(免费领源码+数据库)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案-程序员宅基地

文章浏览阅读1.4k次,点赞47次,收藏42次。本设计主要实现集人性化、高效率、便捷等优点于一身的网上选课系统,完成系统首页、个人资料、用户管理(管理员、教师用户、学生用户)班级管理、课程分类、课程信息、学生选课、课程成绩、通知公告等功能模块。_基于ssm的网上选课系统

SD卡启动详解_量产卡 启动卡-程序员宅基地

文章浏览阅读2.5k次。一、存储设备的介绍1、主流的外部存储器介绍内存和外存的区别:RAM可以随机访问,以字节为单位,可以操作每一个地址。但是ROM就不可以了,只能以块为单位进行访问。RAM掉电数据丢失,而ROM则不会,掉电后数据是保存的。2、磁盘、CD、软盘、硬盘、光盘的区别与联系存储原理为磁存储,缺点是读写速度、可靠性等问题,优点是技术成熟、加个便宜,广泛使用在桌面电脑中,在嵌入式设备中几乎不使用。..._量产卡 启动卡

J2ME好网址-程序员宅基地

文章浏览阅读544次。http://www.j2medev.com/index.htmlhttp://www.j2medev.com/bbs/index.asp?boardid=1http://www.webstudy8.com/web/jsp/403/069316073210831.html http://lib131451.ku.8844.com/ 手机数据库http://www.pcppc.c

mybatis控制台打印Sql的两种方式_mybatis 打印sql-程序员宅基地

文章浏览阅读6.2k次,点赞2次,收藏3次。第一种方式maven工程下pom.xml 添加 log4j日志<!-- 日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>在resou_mybatis 打印sql

推荐文章

热门文章

相关标签