首页
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
Search
1
职教云小助手重构更新,职教云助手最新版下载地址【已和谐】
14,388 阅读
2
职教云-智慧职教,网课观看分析(秒刷网课)
11,645 阅读
3
gradle-5.4.1-all.zip下载
9,651 阅读
4
职教云-智慧职教,签到补签分析(逆天改命系列)
8,251 阅读
5
一个优秀的程序员从写文档开始:免费领14个月语雀云笔记会员
7,063 阅读
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
登录
/
注册
Search
Lan
累计撰写
618
篇文章
累计收到
629
条评论
首页
栏目
学习笔记
Web
Python
转载文章
算法刷题
JS逆向
综合笔记
安卓
物联网
Java
C
资源收集
软件收藏
网络资源
影视专辑
TED英语角
随便写写
随手拍
页面
畅所欲言
友情链接
壁纸大全
数据统计
推荐
工具箱
在线白板
搜索到
618
篇与
的结果
2020-08-07
OPQ机器人框架插件开发之Python模板
今天了解到还有个OPQ的框架似乎还不错,于是研究了一下,比酷Q还方便(因为我之前用的air版,图片都发不了)并且支持多平台,但是最新的版本居然阉割了Windows下的许多功能不过问题不大,满足我之前的需求了。于是参考了一下原本iot的python模板然后进行了修改,更加符合自己的用法习惯吧。然后就是代码:botConfig->configInfo.py(用于存放接口地址,以及机器人QQ)robotQQ = "{机器人QQ}" webapi = "{接口地址,后面无需加/}"botConfig ->botClass.py (用于存放一些对消息的解析类)import json import requests from .configInfo import * """ By : Lan Website : """ # 群组消息接受类 class GroupMess: def __init__(self, message): self.FromQQG = message['FromGroupId'] # 来源QQ群 self.QQGName = message['FromGroupName'] # 来源QQ群昵称 self.FromQQ = message['FromUserId'] # 来源QQ self.FromQQName = message['FromNickName'] # 来源QQ名称 self.Content = message['Content'] # 消息内容 self.MsgTime = message['MsgTime'] # 消息时间 # 私发消息接受类 class PrivateMess: def __init__(self, message): self.FromQQ = message['ToUin'] # 来源QQ号 self.ToQQ = message['FromUin'] # 目标QQ号 self.Content = message['Content'] # 消息内容 self.MsgType = message['MsgType'] # 消息类型 # 发送消息类 class SendMessage: def __init__(self, toUser=0, sendToType=0, sendMsgType='', groupId=0, content='', atUser=0, voiceUrl='', picUrl='', picBase64Buf='', voiceBase64Buf=''): self.data = { "toUser": toUser, # 欲发给的对象 群或QQ好友或私聊对象 "sendToType": sendToType, # 发送消息对象的类型 1好友 2群3私聊 "sendMsgType": sendMsgType, # 欲发送消息的类型 TextMsg、PicMsg、VoiceMsg "content": content, # 发送的文本内容 "groupid": groupId, # 发送私聊消息是 在此传入群ID 其他情况为0 "atUser": atUser, # At用户 传入用户的QQ号 其他情况为0 "picUrl": picUrl, # 发送图片的网络地址 "picBase64Buf": picBase64Buf, # 发本地送图片的buf 转 bas64 编码 "voiceUrl": voiceUrl, # 发送语音的网络地址 "voiceBase64Buf": voiceBase64Buf, # 发本地送语音的buf 转 bas64 编码 "fileMd5": "" } ''' 发送图片消息需要有:toUser sendToType sendMsgType picUrl ''' def send(self): print(self.data) requests.post(url=f'{webapi}/v1/LuaApiCaller?qq={robotQQ}&funcname=SendMsg&timeout=10', data=json.dumps(self.data)) return 200main.py (用于存放主文件)# coding=utf-8 import logging import time import socketio from botConfig.botClass import * from botConfig.configInfo import * sio = socketio.Client() """ By : Lan Website : https://gitlab.com/Vastsa/lanpicbed/-/raw/master/ """ def beat(): while True: sio.emit('GetWebConn', robotQQ) time.sleep(60) @sio.event def connect(): print('connected to server') sio.emit('GetWebConn', robotQQ) # 取得当前已经登录的QQ链接 beat() # 心跳包,保持对服务器的连接 @sio.on('OnGroupMsgs') def OnGroupMsgs(message): """ 监听群组消息""" data = GroupMess(message['CurrentPacket']['Data']) print(data) return @sio.on('OnFriendMsgs') def OnFriendMsgs(message): """ 监听好友消息 """ data = PrivateMess(message['CurrentPacket']['Data']) print(data) return @sio.on('OnEvents') def OnEvents(message): """ 监听相关事件""" print(message) def main(): try: sio.connect(webapi, transports=['websocket']) sio.wait() except BaseException as e: logging.info(e) print(e) if __name__ == '__main__': main()GitHub地址:https://github.com/vastsa/OPQBot-Pyhon
2020年08月07日
3,277 阅读
15 评论
0 点赞
2020-08-06
使程序在Linux下后台运行
一、为什么要使程序在后台执行我们计算的程序都是周期很长的,通常要几个小时甚至一个星期。我们用的环境是用putty远程连接到日本Linux服务器。所以使程序在后台跑有以下三个好处:1:我们这边是否关机不影响日本那边的程序运行。(不会像以前那样,我们这网络一断开,或一关机,程序就断掉或找不到数据,跑了几天的程序只能重头再来,很是烦恼)2:不影响计算效率2:让程序在后台跑后,不会占据终端,我们可以用终端做别的事情。二、怎么样使程序在后台执行方法有很多,这里主要列举两种。假如我们有程序pso.cpp,通过编译后产生可执行文件pso,我们要使pso在linux服务器后台执行。当客户端关机后重新登入服务器后继续查看本来在终端输出的运行结果。(假设操作都在当前目录下)方法1在终端输入命令: # ./pso > pso.file 2>&1 & 解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。 当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命令:#cat pso.file )。 方法2在终端输入命令:# nohup ./pso > pso.file 2>&1 &解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命令:#cat pso.file )。三、常用任务管理命令# jobs //查看任务,返回任务编号n和进程号# bg %n //将编号为n的任务转后台运行# fg %n //将编号为n的任务转前台运行# ctrl+z //挂起当前任务# ctrl+c //结束当前任务 注:如果要使在前天执行任务放到后台运行,则先要用ctrl+z挂起该任务,然后用bg使之后台执行。 附: 在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh &对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:$ ./test.sh [1]+ Stopped ./test.sh $ bg %1 [1]+ ./test.sh & $ jobs -l [1]+ 22794 Running ./test.sh &但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)$ echo $$ 21734 $ nohup ./test.sh & [1] 29016 $ ps -ef | grep test 515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh 515 29713 21734 0 11:47 pts/12 00:00:00 grep test$ setsid ./test.sh & [1] 409 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 413 21734 0 11:49 pts/12 00:00:00 grep test上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:$ ./test.sh & [1] 2539 $ jobs -l [1]+ 2539 Running ./test.sh & $ disown -h %1 $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 2542 21734 0 11:52 pts/12 00:00:00 grep test另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:$ (./test.sh &) $ ps -ef | grep test 515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh 515 12483 21734 0 11:59 pts/12 00:00:00 grep test注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:$ screen -dmS screen_test $ screen -list There is a screen on: 27963.screen_test (Detached) 1 Socket in /tmp/uscreens/S-jiangfeng. $ screen -r screen_test
2020年08月06日
750 阅读
0 评论
0 点赞
2020-08-06
vue+axios实现评论留言板
效果如图这里的评论数据以及添加数据都是用的FastAPI,然后再用axios发送请求,获取评论以及添加评论。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>工程快捷报备系统——By:Lan</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <script src="https://cdn.jsdelivr.net/npm/vue"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <link rel="stylesheet" href="static/css/bootstrap.min.css"> <style> .content { margin-top: 1.5rem; } </style> </head> <body> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <ul class="nav nav-tabs"> <li> <a href="./index.html">健康报备</a> </li> <li> <a href="./who.html">谁没报备</a> </li> <li> <a href="./ele.html">电费查询</a> </li> <li class="active"> <a href="./comment.html">留言板</a> </li> </ul> <div class="content" id="box"> <form action="" role="form"> <div class="form-group"> <label class="col-sm-1 control-label">昵称</label> <div class="col-sm-11"> <input v-model='newNick' type="text" class="form-control" id="nikename" v-model='newComment' placeholder="请输入昵称"> </div> <div class="form-group"> <label for="content" class="col-sm-1 control-label">内容</label> <div class="col-sm-11"> <textarea id="content" v-model='newComment' class="form-control" rows="3"></textarea> </div> </div> <div class="form-group" style="text-align: center;"> <input type="button" name="" value="添加" @click='addcomment' class="btn btn-primary"> <input type="reset" name="" value="重置" class="btn btn-danger"> </div> </div> </form> <table class="table table-bordered table-hover"> <caption class="text-success"> <h4>评论列表</h4> </caption> <thead> <tr class="text-info"> <th class="text-center">昵称</th> <th class="text-center">内容</th> <th class="text-center">时间</th> </tr> </thead> <tbody> <tr v-for="(item,index) in list" :key="index" class="text-warning text-center"> <td>{{item.nick }}</td> <td>{{item.comment}}</td> <td>{{item.add_Time | fmtTime('-')}}</td> </tr> <tr v-if="list.length === 0"> <td colspan="3">暂无评论,快来评论吧!</td> </tr> </tbody> </table> </div> </div> </div> </div> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="./static/js/bootstrap.min.js"></script> <script> Vue.filter('fmtTime', function(sourceTime, sep) { sourceTime = new Date(sourceTime); let y = sourceTime.getFullYear(); let m = sourceTime.getMonth() + 1; let d = sourceTime.getDate(); let h = sourceTime.getHours(); let M = sourceTime.getMinutes(); return y + sep + m + sep + d + ' ' + h + ':' + M; }); var app = new Vue({ el: '#box', data: { newNick: '', newComment: '', list: [], searchVal: '' }, mounted() { this.getcomment(); }, methods: { getcomment() { axios.get('/get_comment/', { params: { page: 1 } }) .then(res => { this.list = res.data; }) .catch(err => { console.error('获取数据失败' + err); }) }, addcomment() { axios.get('/add_comment/', { params: { nick: this.newNick, comment: this.newComment } }) .then(res => { alert('添加成功'); // 添加成功之后,重新获取列表数据 this.getcomment(); this.newComment = ''; }) .catch(err => { console.error(err); }) } }, }) </script> </body> </html>
2020年08月06日
1,015 阅读
0 评论
0 点赞
2020-08-05
多事之周,当事情多的时候不要急躁,逐一击破。
消失了近一个星期,我又回来了,总结一下这一周都有哪些麻烦事。首先,阿里云高校实践计划白嫖的服务器要到期了,然后续费要求通过一个巨难的考试,然后还得90分,很不幸的没通过,服务器上面还挂着机器人啥的一些小程序呢,可惜了,还得另寻机器来挂东西了。然后就是8月1号,2号的专升本考试,本科专业选的是软件工程,然后这次要考的四门分别是近代史,马克思,计算机网络基础,软件工程,这件事也一直没怎么上心,就是考试前几天才翻了下笔记这些,毕竟时间都用来研究编程了,哪有兴趣去学这些,结果自然而然咯,感觉凉凉了,让我最气的就是计算机网络基础,上课的时候老师着重的讲了IP地址这些,还有一个送分的HTMl,结果考试的时候,题目呢???亏我还把IP地址那个研究了一下,就连送分的HTML影子都没看见,不过也要看开点,自己付出了多少,也就收获了多少吧,10月份还有一次呢。天空真好看最糟心的就是手机一滑,后盖碎了,个人只有贴钢化膜的习惯,没有戴手机壳的习惯,因此那叫一个惨。于是自己从某宝买了一块后盖,在今天下午刚刚换好,幸运的是没出啥问题,完美的换下了后盖。第一次自己换后盖,还是有点小激动的,看视频都是使用吹风机这样的东西加热的,个人感觉有点暴力,于是打了两把游戏,让手机自热,哈哈,然后遇到了很有意思的一把,打着打着对面四个人全部掉线了。不过还好,成功的换下来了,果然是祸不单行呀。这一个星期网络上也发生了许多事情,比如几乎市面上所有的机器人框架纷纷关闭,从一开始的晨风404,然后就是酷Q,都是泪呀,才开始研究QQ机器人呢,目前还有一个机器人正在使用呢。用的是CQHTTP,结果没用几个月就没了,可惜了,不过刚好我白嫖的服务器也到期了,于是又将主要功能转移至WEB端,涂涂改改又是一晚上。然后呢,又将之前写的电费智能提醒系统改善了一下,新增了寝室的空调电费查询(部分寝室,空调和照明电量是分开的),又将公众号的模板消息替换了一下。事情总是组团来群殴我,一开始的时候遇到这么多事情还是很烦的,但是既来之则安之,反正躲不了,一个一个解决呗,解决的结果已经不重要了,至少去做了。当事情多的时候不要急躁,逐一击破他它。
2020年08月05日
983 阅读
3 评论
0 点赞
2020-07-29
176. 第二高的薪水
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2 | 200 || 3 | 300 |+----+--------+例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。+---------------------+| SecondHighestSalary |+---------------------+| 200 |+---------------------+来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/second-highest-salary著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。官方答案:SELECT (SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary我写的时候没有弄他为null的情况,今天逛力扣才发现还有sql查询语句的题目。SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1
2020年07月29日
931 阅读
0 评论
0 点赞
2020-07-26
Microsoft E5第二次迷之续费
今天刚好是距离到期还有一个月,然后又自动续费到了11月份最近这段时间都没怎么用OneDrive以及调用API了,随缘续费。又能白嫖3个月的Microsoft365全家桶了。
2020年07月26日
1,336 阅读
0 评论
0 点赞
2020-07-25
按数字批量重命名文件
今天在网上看到一个壁纸压缩包,是滴是滴,就是壁纸,文件是这样的本着互联网的分享精神,准备做一个随机图片,但是人家名字都不一样,咱也不好写代码,于是花了几分钟敲了几行代码,一秒钟就命名了530张图片。结果就是这样滴。咳咳,代码如下 def plRename(): sourcename = os.listdir('./') for index, value in enumerate(sourcename): try: os.rename(value, str(index) + '.' + value.split('.')[-1]) except EnvironmentError: print(EnvironmentError) print(f'{value}失败') input('完成!')
2020年07月25日
1,016 阅读
0 评论
0 点赞
1
...
47
48
49
...
89