教程七 在Go中使用Energy创建跨平台GUI - Cookies

news2025/1/14 18:40:28

 教程-示例-文档 


介绍

本文介绍在energy中的cookie操作

在energy中可以对cookie的增加、修改和删除以达到某种目的

对cookie操作时,是以调用功能函数后触发事件的方式返回调用功能函数的结果

运行此示例,需要安装好Go和Energy开发环境:教程一 环境安装

此示例中采用了内置http服务访问内嵌资源: 内置http服务

功能函

  • VisitAllCookies 获取所有cookie
  • ​VisitURLCookies 获取指定URL cookie
  • DeleteCookies 删除cookie
  • SetCookie 设置cookie

事件函数

  • OnCookiesVisited 调用功能函数VisitURLCookies 和 VisitAllCookies 时触发
  • OnCookiesDeleted 调用功能函数 DeleteCookies 时触发
  • OnCookieSet 调用功能函数 SetCookie 时触发
  • OnCookieVisitorDestroyed 调用功能函数 VisitURLCookies 和 VisitAllCookies ,有销毁时触发

使用方式

在主进程中,使用事件机制监听,用于在html javascript中使用事件方式调用Go函数

ipc.IPC.Browser().SetOnEvent

在主进程主窗口初始化时设置事件监听

cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) 

事件监听在Go中监听的事件, 用于在Go的其它进程或渲染(Render)进程(web html)中调用

event.On

在事件监听中获取主窗口信息

在主窗口对象中获得chromium对象
var info = cef.BrowserWindow.GetWindowInfo(context.BrowserId())

在javascript代码使用ipc.emit触发Go监听的事件

ipc.on 事件监听

ipc.emit 事件触

Go代码示例

package main

import (
	"embed"
	"encoding/json"
	"fmt"
	"github.com/energye/energy/cef"
	"github.com/energye/energy/common/assetserve"
	"github.com/energye/energy/consts"
	"github.com/energye/energy/ipc"
	"github.com/energye/golcl/lcl"
	"time"
)

//资源目录,内置到执行程序中
//go:embed resources
var resources embed.FS

//这个示例使用了几个事件来演示下载文件
func main() {
	//全局初始化 每个应用都必须调用的
	cef.GlobalCEFInit(nil, &resources)
	//创建应用
	cefApp := cef.NewApplication(nil)
	//主窗口的配置
	//指定一个URL地址,或本地html文件目录
	cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/cookie.html"

	ipc.IPC.Browser().SetOnEvent(func(event ipc.IEventOn) {
		//监听获取cookie事件
		event.On("VisitCookie", func(context ipc.IIPCContext) {
			fmt.Println("VisitCookie")
			info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
			info.Chromium().VisitURLCookies("https://www.baidu.com", true, 1)
			info.Chromium().VisitAllCookies(1)
			context.Result().SetString("执行成功,结果将在 SetOnCookiesVisited 事件中获得")
		})
		//监听删除cookie
		event.On("DeleteCookie", func(context ipc.IIPCContext) {
			info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
			info.Chromium().DeleteCookies("", "", false)
			context.Result().SetString("执行成功,结果将在 SetOnCookiesDeleted 事件中获得")
		})
		//监听设置cookie
		event.On("SetCookie", func(context ipc.IIPCContext) {
			info := cef.BrowserWindow.GetWindowInfo(context.BrowserId())
			info.Chromium().SetCookie("https://www.example.com", "example_cookie_name", "1234", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_UNSPECIFIED, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 0)
			info.Chromium().SetCookie("https://www.example.com", "example_cookie_name2", "123422", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_UNSPECIFIED, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 0)
			info.Chromium().SetCookie("https://www.baidu.com", "demo_name", "4321", "", "/", true, true, false, time.Now(), time.Now(), time.Now(), consts.Ccss_CEF_COOKIE_SAME_SITE_NO_RESTRICTION, consts.CEF_COOKIE_PRIORITY_MEDIUM, false, 1)
			context.Result().SetString("执行成功,结果将在 SetOnCookieSet 事件中获得")
		})
	})
	//在SetBrowserInit中设置cookie事件,这些事件将返回操作后的结果
	cef.BrowserWindow.SetBrowserInit(func(event *cef.BrowserEvent, browserWindow *cef.TCefWindowInfo) {
		//获取cookie时触发
		event.SetOnCookiesVisited(func(sender lcl.IObject, cookie *cef.ICefCookie) {
			fmt.Printf("SetOnCookiesVisited: %+v\n", cookie)
			//将结果返回到html中
			args := ipc.NewArgumentList()
			data, _ := json.Marshal(cookie)
			args.SetString(0, string(data), true)
			browserWindow.Chromium().Emit("VisitCookieResult", args, nil)
		})
		//删除cookie时触发
		event.SetOnCookiesDeleted(func(sender lcl.IObject, numDeleted int32) {
			fmt.Printf("SetOnCookiesDeleted: %+v\n", numDeleted)
		})
		//设置cookie时触发
		event.SetOnCookieSet(func(sender lcl.IObject, success bool, ID int32) {
			fmt.Println("SetOnCookieSet: ", success, ID)
		})
		event.SetOnCookiesFlushed(func(sender lcl.IObject) {
			fmt.Println("OnCookiesFlushed")
		})
		event.SetOnCookieVisitorDestroyed(func(sender lcl.IObject, ID int32) {
			fmt.Println("OnCookieVisitorDestroyed")
		})
	})
	//在主进程启动成功之后执行
	//在这里启动内置http服务
	//内置http服务需要使用 go:embed resources 内置资源到执行程序中
	cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022               //服务端口号
		server.AssetsFSName = "resources" //必须设置目录名和资源文件夹同名
		server.Assets = &resources
		go server.StartHttpServer()
	})
	//运行应用
	cef.Run(cefApp)
}

html代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>cookie</title>
    <style type="text/css">
        button {
            margin: 10px;
        }
    </style>
    <script type="application/javascript">
        function message() {
            return document.getElementById("message");
        }
        //显示cookie
        function VisitCookie() {
            message().innerHTML = "";
            //触发go中监听的事件
            ipc.emit("VisitCookie", function (data) {
                message().innerHTML = data;
            });
        }
        //显示cookie的结果,从go中返回到html
        ipc.on("VisitCookieResult", function (data) {
            message().innerHTML = message().innerHTML + data + "<br><br>";
        });

        //删除cookie
        function DeleteCookie() {
            message().innerHTML = "";
            //触发go中监听的事件
            ipc.emit("DeleteCookie", function (data) {
                message().innerHTML = data;
            });
        }

        //设置cookie
        function SetCookie() {
            message().innerHTML = "";
            //触发go中监听的事件
            ipc.emit("SetCookie", function (data) {
                message().innerHTML = data;
            });
        }
    </script>
</head>
<body style="overflow: hidden;margin: 0px;padding: 0px;">
<button onclick="VisitCookie()">查看cookie</button>
<button onclick="DeleteCookie()">删除cookie</button>
<button onclick="SetCookie()">设置cookie</button>
<br>
<div id="message">

</div>
</body>
</html>

示例效果图 - cookie

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有问题直接说问题,问什么在不在???

有什么问题可以直接说&#xff0c; 比如把你的项目地址、需求、错误复现步骤通过任何方式告诉我 比如&#xff1a; CSDN&#xff1a;发送消息&#xff0c;博客评论等&#xff0c;禁止发"在吗" 发邮件&#xff1a;xuxiaoweixuxiaowei.com.cn。 微信群&#xff1a; 禁…

麦芽糖-紫杉醇maltose-Paclitaxel

麦芽糖-紫杉醇maltose-Paclitaxel 中文名称&#xff1a;麦芽糖-紫杉醇 英文名称&#xff1a;maltose-Paclitaxel 别称&#xff1a;紫杉醇修饰麦芽糖&#xff0c;PTX-麦芽糖 还可以提供PEG接枝修饰麦芽糖&#xff0c;麦芽糖-聚乙二醇-紫杉醇,Paclitaxel-PEG-maltose,紫杉…

redis配置文件详解

一、概述 redis的配置文件中&#xff0c;有着许多说明和可配置项&#xff0c;了解它们能够更好的使用redis去解决开发中遇到的困难。 此配置文件基于linux下的redis-6.2.4版本。 二、单位换算描述-units 在配置文件开头就有这么一段&#xff1a; 这里描述了一些基本的度量…

信息流广告投放的技巧

随着互联网的发展&#xff0c;信息时代已经到来&#xff0c;信息流广告逐渐受到众多广告主的青睐。 做广告&#xff0c;不仅需要投入大量的精力&#xff0c;还需要一定的资金&#xff0c;花这么多&#xff0c;自然是要收获不错的收益。广告主在广告信息流的时候都追求高ROI&am…

蓝牙耳机什么牌子好?安卓蓝牙耳机性价比推荐

戴耳机所听到的音效是完全不同的&#xff0c;体验感也是完全不一样&#xff01;而有线的耳机戴起来一点也不方便&#xff0c;因此更多的人选择无线蓝牙耳机&#xff0c;但是很多新手发帖不知道蓝牙耳机啥牌子好&#xff1f;安卓手机的配置越来越好&#xff0c;深受大众的欢迎&a…

Python中的dump() 、load()和dumps()、loads()使用及示例

Python中的dump() 、load()和dumps()、loads() 结论&#xff1a; 1.不加s的标识对json文件的读写&#xff0c;将内存中值读取写入到json后缀文件&#xff0c;或者将json后缀文件中内容读取到内存 2.加了s的主要是字符串类型和其他数据类型的互转 JSON(JavaScript Object No…

KubeSphere 社区双周报 | KubeKey v3.0.2 发布 | 2022-11-24

KubeSphere 从诞生的第一天起便秉持着开源、开放的理念&#xff0c;并且以社区的方式成长&#xff0c;如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一。这些都离不开社区小伙伴的共同努力&#xff0c;你们为 KubeSphere 提出了很多建设性意见&#xff0c;也贡献了很多…

扫除知识共享障碍,天翎知识文档管理系统+群晖NAS一体化解决方案

编者按&#xff1a;知识共享是企业知识管理的重要模块&#xff0c;本文阐述了企业知识共享中常遇到的障碍&#xff0c;并指出知识文档管理系统可以帮助解决这些问题&#xff0c;而NAS与知识文档系统的结合更是锦上添花。 关键词&#xff1a;文档分类&#xff0c;版本管理&…

你想要知道的“全电发票接口”

老规矩&#xff0c;即使你看到此文前&#xff0c;你多少知道点“全电发票”的一些知识&#xff0c;这里方便那些还没得空抢先获取的知友小伙伴们梳理下相关知识点。 ** 一、全电发票具体的定义 ** 全电发票是国家税务总局随着金税四期推出的全国统一的电子发票服务平台&…

护眼台灯该怎么样选择?2022如何选择一款好的护眼台灯

随着社会的高度发展&#xff0c;人们的生活水平也渐渐得到提高&#xff0c;大家也慢慢开始在意平时生活中的健康问题了&#xff0c;比如眼睛健康就是一个很重要的点。现在的年轻人&#xff0c;尤其是青少年儿童&#xff0c;走在大街上普遍都能看见带着眼睛&#xff0c;近视情况…

B2B电子商务网站方案:为专用设备行业注入新动力,加快产业数字化转型升级

专用设备是指设备的结构、性能专门针对某一种或一类对象&#xff0c;实现一项或几项功能的工业&#xff0c;包括工程机械、光伏设备、锂电设备、3C设备、半导体设备等。近年来&#xff0c;受市场对专用设备的应用需求不断扩大、产业技术升级趋势加快等影响&#xff0c;我国专用…

段错误,虚拟内存,内存映射 CSAPP

相信写代码的或多或少都会遇到段错误&#xff0c;segmentation fault. 今天终于看到这里面的底层原理 参考&#xff1a; https://greenhathg.github.io/2022/05/18/CMU213-CSAPP-Virtual-Memory-Systems/18-Virtual-Memory-SystemsSimple memory system exampleAddress Trans…

Las Vegas 与回溯组合法解八皇后问题

八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上…

刷爆力扣之卡牌分组

刷爆力扣之卡牌分组 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;每个…

DDOS防护如何建设?

数字化转型发展也推动了云计算、人工智能、大数据、物联网等新一代信息技术应用普及&#xff0c;与此同时&#xff0c;新时代的发展也带来了新的网络威胁和新的安全需求。我们不难发现&#xff0c;近年网络攻击时间层出不穷&#xff0c;全球范围来看&#xff0c;企业因遭受网络…

quilt基本使用

一、简介 quilt是制作补丁和管理的工具。比如想用开源代码做一些项目&#xff0c;我们如果直接在开源代码里进行修改&#xff0c;等到下次开源代码升级后&#xff0c;我们再将我们修改的部分转移到新版本的开源代码中就需要进行大量的新旧版本对比工作。那如果我们将这些改动使…

3D视觉应用案例:引导板件定位抓取

3D引导板件定位抓取 某知名模具钢材集团 项目背景 广州某知名模具钢材集团&#xff0c;需求3D引导板件定位抓取和2D识别信息获取功能。原场景用的桁车设备加人工搬运安全系数极低。 作业流程 • 3D相机视觉识别产品位置后&#xff0c;通过机器人电磁铁完成产品的抓取。 •…

大数据 安装配置centOS

安装vmware workstation 启动vmware workstation 启动【编辑】菜单下的“虚拟网络编辑器” 更改VMnet8 查看DHCP设置 查看NAT设置 安装centos7 链接&#xff1a;https://howard2005.blog.csdn.net/article/details/126830182?spm1001.2014.3001.5502 启动虚拟机 虚拟机 查…

代码调优?从Fibonacci数列的7种写法说起,看完coding能力上一个台阶

开启掘金成长之旅&#xff01;这是我参与「掘金日新计划 12 月更文挑战」的第2天&#xff0c;点击查看活动详情 引子 楼梯有 N阶&#xff0c;上楼可以一步上一阶&#xff0c;也可以一步上二阶。 编一个程序&#xff0c;计算共有多少种不同的走法。 例&#xff1a; 0层&…

【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

typora-root-url: ./ 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计&#xff08;原理图源代码仿真工程答辩PPT答辩论文&#xff09; 文章目录typora-root-url: ./【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计&#xff08;原理图源代码仿真工程答辩PP…