图形验证插件,百度编辑器拓展功能,NodeJs消息机制以及聊天室,Python做爬虫

图形验证插件

网上找了很多图形验证插件,比较推荐verify.js

<link rel="stylesheet" type="text/css" href="css/verify.css"><script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/verify.js"></script>
<div id="mpanel4"></div>
<script type="text/javascript">
        $('#mpanel4').slideVerify({
            type: 2,
            vOffset: 5,
            vSpace: 5,
            imgName: ['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg'],
            imgSize: {
                width: '400px',
                height: '200px',
            },
            blockSize: {
                width: '40px',
                height: '40px',
            },
            barSize: {
                width: '400px',
                height: '40px',
            },
            ready: function () {},
            success: function () {
                $(".verify-left-bar .verify-msg").html('成功');
                $(".verify-left-bar .verify-msg").css('color','#5cb85c');
            },
            error: function () {}
        });
    </script>

百度编辑器拓展功能

红框内就是自定义的功能

引入百度编辑器后

ueditor.all.js

//为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起
    var btnCmds = ['translation《--这是你新加的功能','undo', 'redo', 'formatmatch',
        'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase',
        'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent',
        'blockquote', 'pasteplain', 'pagebreak',
        'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink',
        'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow',
        'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts'];

ueditor.config.js

, toolbars: [['translation《--和上面保持一样的名字', '|',
            'fullscreen', 'source', '|', 'undo', 'redo', '|',
            'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
            'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
            'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
            'directionalityltr', 'directionalityrtl', 'indent', '|',
            'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
            'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
            'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',
            'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',
            'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
            'print', 'preview', 'searchreplace', 'drafts', 'help'
        ]]
        //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准
        //,labelMap:{
        //    'anchor':'', 'undo':''
        //}
                           , labelMap: {
            'translation': '翻译《--鼠标放上去的提示'
        }

在初始化编辑器之前增加命令

UE.commands['translation'] = {

        execCommand: function () {
            var translation = UE.getEditor(this.key);//富文本
              点击后触发的事件
        },
        queryCommandState: function () {

        }
    };

    var ue = UE.getEditor('editor');

效果,我再百度编辑器上新增的翻译功能

NodeJs 做聊天室

NodeJs 可以在服务器上运行,做JS的服务端。与客户端NodeJs 保持长连接。业务上可以做及时沟通。

引用socket.io.js

服务端代码:

  

var httpd = require('http').createServer(handler);
var io = require('socket.io').listen(httpd);
var fs = require('fs');

引用三个比较关键的资源

httpd.listen(3000);

监听3000端口,一般是8077.。。

function handler(req, res) {
  fs.readFile(__dirname + '/index.html',
    function(err, data) {
      if (err) {
       res.writeHead(500);
       return res.end('Error loading index.html');
      }

      res.writeHead(200);
      res.end(data);
    }
  );
}

创建HTTP链接

io.sockets.on('connection', function (socket) {
  socket.on('clientMessage', function(content) {
    socket.emit('serverMessage', 'You said: ' + content);
    var username = null;

    if (socket.username) {
        username = socket.username;
    }
      socket.broadcast.emit('serverMessage', username + ' said: ' +
        content);
  });

  socket.on('login', function(username) {
    socket.username = username;
    socket.emit('serverMessage', 'Currently logged in as ' + username);
    socket.broadcast.emit('serverMessage', 'User ' + username +
      ' logged in');
  });

  socket.emit('login');

});

以上是NodeJs服务端相应事件的主体代码

<script src="http://localhost:3000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
        var messagesElement = document.getElementById('messages');
        var lastMessageElement = null;
        var id = 1;
        function addMessage(message) {
            var newMessageElement = document.createElement('div');
            var newMessageText = document.createTextNode(message);

            newMessageElement.appendChild(newMessageText);
            messagesElement.insertBefore(newMessageElement,
                lastMessageElement);
            lastMessageElement = newMessageElement;
        }

        var socket = io.connect('http://localhost:3000');
        socket.on('serverMessage', function (content,id) {
            addMessage(content+id );
        });

        socket.on('login', function () {
            var username = prompt('What username would you like to use?');
            socket.emit('login', username);
        });

        var inputElement = document.getElementById('input');

        inputElement.onkeydown = function (keyboardEvent) {
            if (keyboardEvent.keyCode === 13) {
                socket.emit('clientMessage', inputElement.value,'11');
                inputElement.value = '';
                return false;
            } else {
                return true;
            }
        };
    </script>

以上是客户端相应事件的主体代码

接下来说下消息机制吧

客户端   var socket = io.connect('http://localhost:3000');

服务端  io.sockets.on('connection', function (socket) {

}

只要没报500,就说明连接正常,这时候客户端可以主动向服务端推送消息,服务端也可以像客户端推送消息。

socket.on('login', function (content) {

        socket.emit('serverMessage', '单方面回复非广播' + content);

        socket.broadcast.emit('serverMessage', '全部回复广播' + content)
    })
    socket.emit('login');

服务端定义了用户登录,并在连接成功后主动发起Login请求

socket.on('login', function () {
            var username = prompt('What username would you like to use?');
            socket.emit('login', username);
        });

客户端响应服务端Login 传入登录的用户名

服务端 以 serverMessage 单方面响应请求的客户端机器(非所有客户端机器),broadcast 广播除请求客户端机器以外的所有机器

客户端响应服务端 serverMessage

socket.on('serverMessage', function (content,id) {
            addMessage(content+id );
        });

将消息加入Html中展示,完成服务端端主动推送消息机制

inputElement.onkeydown = function (keyboardEvent) {
            if (keyboardEvent.keyCode === 13) {
                socket.emit('clientMessage', inputElement.value,'11');

客户端文本框写入消息并摁下回车,响应clientMessage

socket.on('clientMessage', function (content,id) {
       socket.emit('serverMessage', '单方面回复非广播' + content ,id);

        socket.broadcast.emit('serverMessage', '全部回复广播' + content)

    })

服务端响应clientMessage,并以serverMessage回应请求客户端IP,broadcast回应其他客户端IP.完成客户端主动推送消息机制

Python做网络爬虫

options = webdriver.FirefoxOptions()//使用火狐模拟器做爬虫,可以发送和跟踪鼠标点击翻页等事件
options.add_argument('--headless') //无窗口模式
driver = webdriver.Firefox(options=options)
driver.get("http://registers.centralbank.ie/FirmRegisterDataPage.aspx?firmReferenceNumber=C53877&register=32")//目表地址
html = etree.HTML(driver.page_source) //#分析HTML,返回DOM根节点

spanList=html.xpath("//div[@id='ctl00_cphRegistersMasterPage_c1wrptFirmRegisterData']//span")//也可以使用类似得Xpath获取到指定节点
while index<len(spanList):
            model=spanList[index]
            # Name:
            if (model.text=='Name:'):
                name=spanList[index+1].text
            else:
                pass

也可以用循环每个元素体的方式,获取每个元素的TITLE,比如找到SPAN的文本为:Name,那下一个Span 的值就是要要被抓取的元素

(0)

相关推荐

  • 用NodeJS完成简单的身份验证

    本文是我翻译自 Danial Khosravi 博客的一篇文章.简单易懂,而且其将源码放到 GitHub 上,运行即可. 好了.我们开始.使用 NodeJS 完成身份验证的功能,这里除了 expres ...

  • 通过测试 grep 插件,一起了解验证插件功能的方法

    " 本文是 filter_grep 过滤插件的使用示例,同时也演示了测试插件功能的一般性方法." Fluentd 以插件丰富著称,我们不可能了解和使用所有的插件. 在使用一个新插件 ...

  • 开启百度云隐藏功能!这3款浏览器插件,太强了!

    你电脑里的浏览器软件用的是哪一款? 谷歌.Edge.QQ还是360安全? 作为电脑里最常使用的浏览器软件,你怎么能不安装一些插件呢? 集合超多实用工具.高度定制标签页--下面这些实用.免费又方便的插件 ...

  • 飞越语言鸿沟,百度输入法翻译功能打破沟通障碍

    当下,中国在国际化的道路上越走越远,如果说以往是中国人走出国门去,现在则是更多的外国友人进到国门里,尤其是在经济.贸易.教育等领域,如果不精通一门外语,跨越国别的语言和文字就让沟通变得低效而艰难.百度 ...

  • thinkphp3.2嵌入百度编辑器ueditor的实例代码

    本文介绍了thinkphp3.2嵌入百度编辑器ueditor,分享给大家,希望此文章对各位有所帮助 因为排版要求,很多时候我们需要嵌入富文本编辑器,输出带html标签的文本内容.因为我最近做一个后台管 ...

  • tp3怎么嵌入百度编辑器ueditor?

    载入百度ueditor编辑器并配置的方法分享 其实很简单,不过读取数据的时候需要用htmlspecialchars_decode($str);函数转义一下,不然读取到的内容有点小问题,具体看详情 因为 ...

  • 编辑器优化功能上线通知

    2020.8.28 为方便馆友高效编辑文章,提升文章美观度,个人图书馆对撰写编辑器进行了功能优化,并且已经上线.具体功能调整为: 1.双击"格式刷",可重复刷取字体样式:再次点击或 ...

  • (.net core环境下)图形验证,人机交互,一个不够我给你两个

    做软件,遇到一些通用性的功能,我想绝大多数同学都是去网上(或自己之前的项目中)搜一段代码出来,贴到项目中,修修改改,完成任务. 但身为一个有追求的软件工程师,怎么能一直忍受这种低级的操作呢?插件化,模 ...

  • 360doc小助手2:编辑器优化功能上线通知

    360doc小助手2 20-08-28 14:51:21       为方便馆友高效编辑文章,提升文章美观度,个人图书馆对撰写编辑器进行了功能优化,并且已经上线.具体功能调整为: 1.双击" ...

  • oppo内存拓展功能有什么用

    oppo内存扩展技术有用,在前不久,oppo在COlorOS系统中加入了内存拓展功能,但是很多用户对于这项功能不是很了解,那具体有什么用呢,好用吗,下面就和小编一起来看看吧. 内存拓展"技术 ...