python剪切板内容无法同步到雷电模拟器

在用python的 pyperclip.copy() 将内容放入剪切板,再通过 ctrl + v 将内容复制到雷电模拟器的输入框的时候,发现只有第一次的内容是正确的,后面粘贴的内容都是第一次的内容。

for i in "123":
    text = random.randint(1000, 9999)
    print(text)
    pyperclip.copy(text)
    pyautogui.click({雷电模拟器输入框位置})
    pyautogui.hotkey('ctrl', 'v')

如上面的代码,每次生成的 text 内容不一样,但是雷电模拟器输入框看到的效果却是粘贴了三次一样的内容(第一次生成的text)

此时只要在生成text后,再点击一下python执行窗口就可以了

for i in "123":
    text = random.randint(1000, 9999)
    print(text)
    pyautogui.click({python脚本窗口位置})
    pyperclip.copy(text)
    pyautogui.click({雷电模拟器输入框位置})
    pyautogui.hotkey('ctrl', 'v')

快试试吧!
© 二皮

debian开机自启动

debian开机自启动方法一:

将脚本移动至/etc/init.d/文件夹下,并赋可执行权限

设置开机自启:
updaterc.d xx.sh defaults

删除开机自启:
updaterc.d f xx.sh remove

注意用户权限问题

开启CDN后出现301循环重定向的问题

CDN加速域名解析切换到CDN的CNAME之后,访问出现301循环重定向的现象。

一般出现这种现象是由于http–>https的跳转造成的。

详细查看回源策略,发现回源协议使用的是http,原因就找到了。客户端请求使用的是https,到达cdn服务器后转成了http回源,源服务器发现是http,给出301到https的跳转,cdn拿到301后返回给客户端,客户端301到https,https到cdn后再转http。。。如此循环重定向就出来了

将回源协议改为https就好了

github.com/go-vgo/robotgo 引入后执行报错undefined: hook.Event

一直想自己开发一个改键程序,打魔兽争霸单机的时候能使用,最近突然想试试用GO语言来实现,万能的互联网一搜,果然有,import  “github.com/go-vgo/robotgo”就可以了,带着兴奋的心情开始尝试。

go是1.20版本,

按教程
go  get  github.com/go-vgo/robotgo
直接错!因为 github.com 在国内不好使。

继续请教万能互联网

go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/

再执行 go  get  github.com/go-vgo/robotgo ,舒服了。。。

然后测试输出版本

package main

import (
   "github.com/go-vgo/robotgo"
)

func main() {
   robotgo.keyTap(`control`, `esc`)
}

继续报错!错误信息如下:

# github.com/go-vgo/robotgo
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:30:29: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:31:14: undefined: hook.Start
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:36:7: undefined: hook.End
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:43:24: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:44:14: undefined: hook.Start
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:60:36: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:65:69: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:92:40: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:107:38: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:137:20: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:44:14: too many errors

继续请教万能的互联网!
请教。。。。
请教。。。
请教。。
请教。
额。
不万能了,网上没有一篇文章是介绍出现这个问题的解决办法的!

所以我也不知道怎么解决!

暂时认为是没有GCC的问题,下载了 MinGW-w64 还是不行,那么不是官方包有问题(可能性不大),就是本地系统有问题。

系统问题猜想,当前用户没有权限执行hook?用管理员终端 [ 右击开始->终端(管理员) ] 重走一遍流程,发现成了报 robotgo.keyTap undefined 了。。。

再看源码,keyTap的首字母K得是大写,改一下,再执行,没报错了(会不会不是是权限问题,一直就是大小写问题啊0.0!)。但是按键命令没效果。。。

至此 hook.Event undefined 问题没有了,至于按键没效果,还得继续查是什么原因。。。

经过测试发现按键顺序不能乱放,正常顺序是 robotgo.KeyTap(`esc`,`control`),改完顺序,终于打开  开始菜单 面板了。。。

接下来是监听键盘,修改输出

fmt.Println("开启改键")

// 注册监听键盘按下事件,当按下q的时候,程序按一下小键盘7,按下d的时候,程序按一下小键盘8
robotgo.EventHook(hook.KeyDown, []string{}, func(e hook.Event) {
   if e.Keychar == 'q' {
       robotgo.KeyTap("num7")
   }
   if e.Keychar == 'd' {
       robotgo.KeyTap("num8")
   }
})
//开始监听
s := robotgo.EventStart()
// 忽略来自进程的值,防止报错
<- robotgo.EventProcess(s)

本来想实现改键的,发现robotgo只能监听消息,不能修改消息(理想情况是按下q实际系统收到的是num7,现在的情况是按下q的时候,系统 和 robotgo 都知道按下q了,然后robotgo又按了下num7),所以只能做成这种效果了,运行游戏试了下,能满足需求!!!

想要完美实现功能,还得研究windows系统接口,先到这里就打住吧。。。

一点小调整

fmt.Println("开启改键") 

// 注册监听键盘按下事件,当按下q的时候,程序按一下小键盘7,按下d的时候,程序按一下小键盘8
robotgo.EventHook(hook.KeyDown, []string{}, func(e hook.Event) {
    // 获取当前活跃窗口名称
    title := robotgo.GetTitle()
    // 如果是 War3 程序,则帮忙按键
    if(title == "Warcraft III"){
        if e.Keychar == 'q' {
            robotgo.KeyTap("num7")
        }
        if e.Keychar == 'd' {
            robotgo.KeyTap("num8")
        }
    }
})
s := robotgo.EventStart()
<- robotgo.EventProcess(s)

 

浏览器打开摄像头

本文介绍如何使用JavaScript来启用摄像头进行拍摄、拍照。

第一步:获取摄像头权限

在使用摄像头之前,需要获取用户的摄像头权限。使用getUserMedia()函数可以获取摄像头权限,该函数返回一个带有视频流的Promise对象。如果用户拒绝了摄像头权限,Promise会被拒绝。

getUserMedia()函数的参数是一个对象,包含要请求的媒体类型和一些可选的约束条件。以下是请求摄像头权限的示例代码:

navigator.mediaDevices.getUserMedia({
    video: true,
    audio: false
}).then(function(stream) {
    // stream即为获取的视频流,可以用来显示视频或拍照
}).catch(function(err) {
    // 用户拒绝了摄像头权限或其他错误console.log(err);
});

在上面的代码中,我们请求了视频流,同时禁用了音频流。如果用户同意了摄像头权限,就会调用then()方法并把视频流传递给它。如果用户拒绝了摄像头权限或出现了其他错误,则会调用catch()方法并打印错误信息。

第二步:显示视频流

获取了视频流之后,接下来就可以把它显示到网页上了。使用HTML5的video元素可以很方便地显示视频流。以下是显示视频流的示例代码:

var video = document.createElement('video');
video.srcObject = stream;
video.play();
document.body.appendChild(video);

在上面的代码中,我们创建了一个video元素,并把获取的视频流赋值给它的srcObject属性。然后调用play()方法来播放视频,最后把video元素添加到网页的body中。

第三步:拍照

拍照是使用摄像头最常见的功能之一。在前面的示例中,我们已经成功获取了摄像头的视频流并把它显示到了网页上。接下来,我们可以把视频流转换成图片,并把它显示到网页上。以下是拍照的示例代码:

var canvas = document.createElement('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
var context = canvas.getContext('2d');
context.drawImage(video, 0, 0, canvas.width, canvas.height);
var img = document.createElement('img');
img.src = canvas.toDataURL('image/png');
document.body.appendChild(img);

在上面的代码中,我们创建了一个canvas元素,并设置它的宽高与video元素相同。然后获取了canvas的2D上下文,并把video元素的图像绘制到canvas中。最后,把canvas转换成图片并创建一个img元素来显示它。

总结

使用JavaScript启动摄像头是一个非常有用的功能,可以用于实现视频聊天、拍照等应用。本文介绍了如何使用getUserMedia()函数来获取摄像头权限,如何使用video元素来显示视频流以及如何把视频流转换成图片并显示到网页上。可以根据这些基本的知识来实现更复杂的摄像头应用。

原文地址:https://www.wodianping.com/javascript/2023-05/55928.html

ueditor地图不显示

1. 打开编辑器根目录下面的ueditor.all.js文件,找到:
  table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled")
  在这句代码下面加一行:
  table.setAttribute("style", "border-collapse:collapse;");
2. 在ueditor.all.js文件中找到:
  return '<table style="border-collapse:collapse;"><tbody>' + html.join('') + '</tbody></table>'
  改为:
  return '<table style="border-collapse:collapse;"><tbody>' + html.join('') + '</tbody></table>'

3. 修改配置文件ueditor.config.js 找到:
  whitList
  下一行添加:
  iframe: ['frameborder','border','marginwidth','marginheight','width','height','src','id'],//动态地图

文章来源:https://www.cnblogs.com/CcPz/p/10012122.html

百度地图经纬度转化成腾讯地图经纬度

百度地图和 腾讯、高德 地图,获取经纬度的算法不一样,下面是百度地图获取经纬度转化为腾讯地图可用经纬度的算法,(实际测试,转换后还存在一定的偏差)

    private function baidu2qqMap($longi, $lati) {
        if ($longi== '' || $lati== ''){
            return false;
        }
        $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        $x = $longi- 0.0065;
        $y = $lati- 0.006;
        $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
        $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
        $qqlongi = $z * cos($theta);
        $qqlati = $z * sin($theta);
        return [
            "longi"=>$qqlongi,
            "lati"=>$qqlati
        ];
    }

post请求体(Body)中from-data和raw的区别

1. from-data
就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;

由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

2.x-www-form-urlencoded
就是application/x-www-from-urlencoded,会将表单内的数据转换为键值对,比如,username=张三
Content-Type

3.raw
以上传任意格式的文本,可以上传text、json、xml、html等
content-type= text/html(HTML 文档);text/plain(纯文本);text/css(CSS 样式表);application/json (json字符串)

4.binary
相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

MULTIPART/FORM-DATA与X-WWW-FORM-URLENCODED区别
multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,
x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的,只是最后会转化为一条信息。
@RequestParam

用来处理(前端)Content-Type: 为 application/x-www-form-urlencoded或者form-data编码的内容
该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;
@RequestBody

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
前端规定的是raw方式,那么就需要使用@RequestBody接收参数,注意这里Headers里需要以application/json作为Content-type
————————————————
版权声明:本文为CSDN博主「吃了个饭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Eat_a_meal/article/details/124198611