- 微信小程序如何做URL encode编码呢?
在发送请求之前需对q字段做URL encode:想做个翻译小程序,但是这个URL encode到底需要如何处理呢?跪求大神赐教,感激不尽……
2020-12-03 - 小程序怎么在电脑上全屏?
[图片] 金山表单中有一个这样的功能点击后就可以全屏,所以这个的话目前可以有什么技术可以实现吗?
2021-07-08 - 在小程序里面如何实现公众号的关注?
[图片] 看了一个其他家的小程序,在小程序中可以直接打开公众号,然后进行关注,这是如何实现的 ?
2021-06-17 - 公众帐号无法被搜索到是什么原因?
你好,公众号搜索建议你通过搜一搜—>公众号,搜一搜tab标签页公众号区域进行搜索,若无法搜索到,请你参考以下几种情况: 1、修改公众号名称,简介无法被搜索到 若公众号帐号修改名称和简介,在审核在此期间,建议你将微信公众号帐号的二维码保存在电脑本地后,通过可过微博、空间、网 站等途径进行推广,让更多的粉丝关注你,与粉丝进行更多的互动。 温馨提醒:修改帐号昵称简介等,会动态影响搜索的相关排序,建议稍后重试。 2、是否在公众号后台设置了禁止被搜索? 若微信公众号帐号昵称无法被搜索到,建议你查看是否设置了禁止被搜索,请你通过以下方法查看和设置; 设置方法:登录微信公众微信平台->设置->帐号信息->隐私设置->允许。 温馨提示: 1)设置禁止用户通过昵称搜到该帐号后,粉丝通过ID和二维码可以搜到该帐号。(搜索公众号一栏,默认是搜索原始ID,如果已设置了微信号,原始ID会被微信号取代) 2)设置设置成功,半小时后即可生效。 [图片] 3、帐号信息登记审核中、未审核通过、封号、冻结、注销等 若你的微信公众号信息登记审核中/未审核通过、公众号违规被封/冻结、或公众号被注销时,他人在手机微信->搜一搜->“搜索公众号名称”或“搜索公众号微信号”,是无法搜索到你的公众号帐号。 4、公众号不在搜一搜全部中展示 你好,搜一搜的入口是可以搜到属于正常的,这个不属于搜不到的范围。关于公众号的搜索问题,我们会通盘考虑公众号运营者和微信搜索用户的搜索需求与使用习惯。大致的排序原则:排序结果受公众号的运营时间,运营频率,历史违规行为,搜索用户的使用行为反馈,搜索关键词的匹配程度等因素共同决定的,请运营者坚持运营,我们相信优质的公众号一定会受到用户的喜爱脱颖而出的。 5、在搜一搜公众号模糊搜索不一定搜得到 你好,公众号召回都是以账号名称、内容和简介为主要依据的,我们会通盘考虑公众号运营者和微信搜索用户的搜索需求与使用习惯。因帐号运营质量过低,无法被召回,建议提高公众号的运营质量 6、通过微信搜公众号昵称的逻辑 微信根据用户搜索习惯及公众号质量等信息进行算法排序,暂时无法手动干预。请你以微信页面的实际展示为准,感谢你对微信的支持。 可通过以下两种搜索公众号的方法: 1)通过微信“查找”功能,通过昵称搜索,未认证的公众号和已认证的公众号都可通过昵称搜索到。 2)通过搜一搜,通过昵称搜索和微信号,点击标签页中公众号区域。未认证的公众号和已认证的公众号都可通过昵称搜索到。 温馨提示:注册成功后,手机端最迟48小时内便可搜索到新注册的公众帐号。 [图片] [图片]
2021-06-04 - 微信小程序跳转小程序,能自定义打开小程序的话术吗,如‘正在打开xx小程序’改为'其它**'?
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/miniprogram-navigate/wx.navigateToMiniProgram.html
2021-06-18 - 微信小程序可以长按识别图中二维码吗?
小程序怎么实现长按识别图中二维码
2021-06-18 - 云开发的小程序只在PC打开,watch中报错,其他设备上都很正常,不知道为什么?
[图片] 排查了好久发现是这个监听的错。之前在pc上也是正常的,突然报的这个错。 试过用get获取数据pc也是可以获取的,就是这个watch报了错 watcher = db.collection(database_name).orderBy('time', 'desc').where({ // openid:wx.getStorageSync('openid'), uid:wx.getStorageSync('id') }).watch({ onChange:function(data){ console.log(data) if(data.docChanges.length==0){ return } //当数据删除的时候 if(data.docChanges[0].dataType=="remove"){ console.log('删除') }else if(data.docChanges[0].dataType=="add"){ // 语音播报 if(data.docChanges[0].doc.msg_type==2){ data_arr.push(data.docChanges[0].doc.msg) console.log(data_arr,'单个语音播报') audio_text(data_arr[0]) } } }, onError:function(err){ watcher.close() } })
2021-06-18 - getUserInfo接口如何替换成getUserProfile超详细说明
微信小程序API近期又做了调整,之前用的好好的getUserInfo做了重大调整,无法直接获取用户信息了,比如昵称头像等等,当然2021年4月13日上线前的小程序不受影响,如果想要再次升级新版本,即必须涉及到更换获取用户授权的修改,将getUserInfo改成getUserProfile接口。 [图片] 这就代表着之前用的获取授权信息的方法要做调整了,先看看哪些模块受到影响。 之前使用如下代码,可以获取用户的相关信息: 之前:(使用上面的方式,会出现授权弹窗,同意后可以直接获取到nickName昵称及avatarUrl用户头像) [图片] 现在:(不会弹窗,直接获取用户信息nickName变成了匿名,avatarUrl用户头像变成了灰色头像) [图片] 授权过后鉴定是否授权同样也无法使用了,下面是app.js中的代码同过wx.getSetting获取scope.userInfo判断是否授权,现在获取不该参数,所有这个在app.js中的写法就无法判断用户有没有登录了。 [图片] 针对上面的文字,下面开始来介绍下我的实现方式,如何用好新接口getUserProfile。 先来看看wx.getUserProfile怎么用:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 上面是官方地址,里面有详细的说明。 getUserProfile不像之前的getUserInfo一样必须放在按钮button上,而且要使用open-type="getUserInfo",新接口直接可以应用在任何标签上,使用点击时间或者其他触发事件直接执行getUserProfile接口,如下所示: 注:desc属性必须填写,不填写可能获取不到数据; 如下图所示,将会出现弹窗授权 [图片] 每次点击都会获取一次授权,这样有个好处就是之前getUserInfo时候拒绝了之后再想同意需要操作很大一圈代码,这个的话,每次点击都会重新弹窗一次这样倒是解决了一大难题。 [图片] 正确的用户信息,包含了昵称及头像等等... 存在的问题: 如果每次点击都授权的话用户体验非常的不友好,比如做了一个博客系统,每次用户想要给某一条信息点赞,点赞前都要授权一次,用户肯定很烦,所以,获取授权第一次的时候就要存储下来,然后再做表单提交或者点赞评论时候,判断数据库中用户信息是否存在就好了。 解决方案: user页面,提醒客户点击登录授权,默认头像及文字提醒,授权过后显示头像及昵称;[图片] user.wxml页面 {{userInfo.nickName}} {{userInfo.country+userInfo.province+userInfo.city}} 点击登录 user.js页面 //没有授权过的话,不要在当前页面存储用户信息,直接跳转到login页面同意处理用户信息 goLogin(){ wx.navigateTo({ url: '/pages/login/login' }) } login登录页面的操作,点击确认授权弹出授权浮窗。[图片] login.wxml页面 确认授权 暂不授权 login.js页面 //获取授权信息 clickUserProfile(){ wx.getUserProfile({ desc: '业务需要', lang:'zh_CN', success:res=>{ this.saveUserInfo(res.userInfo) } }) }, //保存用户信息 saveUserInfo(userInfo){ app.globalData.userInfo=userInfo //使用页面栈的方式,获取了授权信息接着更改用户页面的userInfo属性 var page=getCurrentPages()[getCurrentPages().length-2]; page.setData({ userInfo }) //使用云函数saveuser将用户信息存储到云数据库中 wx.cloud.callFunction({ name:"saveuser", data:{ userInfo } }).then(res=>{ wx.showToast({ title: '授权成功' }) setTimeout(()=>{ this.noLogin(); },1500) }) } saveuser云函数页面 // 云函数入口函数 exports.main = async (event, context) => { const openid = cloud.getWXContext().OPENID const {userInfo}=event; userInfo.openid=openid; //获取数据库中有没有当前用户的信息 var res= await db.collection("userAll").where({ openid:openid }).count() if(res.total>0){ return await db.collection('userAll').where({ openid }).update({ data: userInfo }) }else{ return await db.collection('userAll').add({ data: userInfo }) } } 一旦获取了用户信息,自动会从login页面跳转到user页面,同理user页面中的userInfo就变成了最新的用户数据,user页面也就变成了这样; [图片] 首次进入user页面时候需要从数据库判断是否已经存在该用户信息 app.js页面 //定义hasUserInfo函数,发送云函数,同过返回true和false判断是否已经授权 async hasUserInfo(){ if (this.globalData.userInfo && this.globalData.userInfo.nickName && this.globalData.userInfo.avatarUrl) return true var res= await wx.cloud.callFunction({ name:"getuser" }) if(res.result.code==200){ this.globalData.userInfo=res.result.data[0] return true }else{ return false } } getuser云函数页面 // 云函数入口函数 exports.main = async (event, context) => { const openid = cloud.getWXContext().OPENID var res=await db.collection("userAll").where({ openid }).get(); if(res.data.length){ return {data:res.data,code:200} }else{ return {code:400} } } 在需要的位置就可以使用app.js中的hasUserInfo方法了,比如user页面 user.js页面 //页面载入时 onLoad:async function (options) { await app.hasUserInfo() this.setData({ userInfo:app.globalData.userInfo }) } 比如对一个点赞按钮操作时候先判断有没有用户信息时候: //点赞操作 async clickZan(){ if(await app.hasUserInfo()){ console.log("可以点赞"); }else{ wx.navigateTo({ url: '/pages/login/login' }) } } 还有一种不保存用户信息,只负责在页面中展现的可以直接使用open-data组件,不用授权就可以轻松获取用户信息; 组件地址如下: https://developers.weixin.qq.com/miniprogram/dev/component/open-data.html 演示代码如下: 最终效果 [图片] 如果文章没有看懂,还有视频的介绍 https://www.bilibili.com/video/BV1s64y1i7Rw
2021-04-22 - 它迈着矫健的步伐来了 - 「微剪」 1.4 版本剖析
在上一篇文章《小程序端视频剪辑的春天来了?》 一文中介绍了一款小程序端视频剪辑用的插件-微剪,其作为小程序端视频剪辑能力的补齐,相比于晦涩的底层API(小程序:好了好了,再说就多了),还是很有使用价值的。从上一个版本发布后,我也一直在关注着其动态,最近插件更新了1.4.2版本,在原有能力的基础上又多了几个比较有趣新特性,下面就跟大家分享下。 前言:如何升级至1.4.2 app.json 文件修改插件对应的version属性即可,如下所示: [代码] "plugins": { "myPlugin": { "version": "1.4.2", // <- 填写最新的版本号,写文章时是1.4.2 "provider": "wx76f1d77827f78beb", "export": "index.js" // <- 很关键,后面要用 } } [代码] 多段拍摄 之前版本(1.3.x)只支持单段拍摄,新的版本相机组件支持了多段拍摄,最多可以拍摄5段视频,总时长依旧是30s限制。除此之外,还新增了倒计时拍摄模式,使用自定义组件的时候可以自行控制倒计时时间,插件默认是3s。这个功能比较简单,没什么要特别强调的,大家自行下载代码片段体验即可。 [图片] 值得一提的是,相机组件提供了两种不同的拍摄模式:simple和advanced模式,simple模式跟上个版本一样。advanced模式下,新增了对滤镜的支持,也就是说可以像抖音,快手那样拍摄之前设置一个滤镜效果,拍摄完后的视频就自带滤镜了,相比于整体设置滤镜更加灵活,如下图。 [图片] 哎呦,不错哦 通过代码演示下这几个属性的用法 [代码]<wj-camera id='myCamera' mode="advanced" countdown="5" filter="{{customeFilter}}" bindready="onCameraReady" bindmediachanged="onMediaChanged" > <view class="preview-button" catchtap="onClickPreviewBtn"> <navigator data-source="jump" url="../player/player" hover-class="none"> <text>预览效果</text> </navigator> </view> </wj-camera> [代码] mode:相机模式,可选值simple 和 advanced,只有advanced模式下才可以使用滤镜; countdown:倒计时,默认为0,即关闭倒计时,传入正整数开启倒计时模式; filter:拍摄用到的滤镜,仅advanced模式可用,可选值为getFilterList返回数据的key值。 PS:如果到这里你都看得一脸懵逼,wj-camera 是个啥?请自行上翻回顾下第一篇文章中的内容。 这里说几点滤镜的使用注意项: filter的值为字符串,相机组件内置了一部分滤镜,可以通过下述方式获得 [代码]let camera = this.selectComponent("#myCamera") let fiterList = camera.getFilterList() [代码] fiterList 的数据结构如下所示: [代码][ { key: "baixi", name: "白皙" }, ... ] [代码] PS:1.4.2版本增加了新的访问插件内置资源的方法,下文会有介绍。 只能在相机组件 ready 之后再设置滤镜,否则无效。 支持贴纸、表情 1.4.2版本新增了对贴纸和表情的支持,这个是此版本的一大亮点,进一步丰富了素材类型,前一篇文章我们提到了clip的概念,贴纸和表情也是通过一种新的clip类型 - sticker 实现的,插件目前支持的clip类型 插件内置贴纸、表情 可以在app.js中通过下述方式,获取插件内置贴纸(表情): [代码]var myPluginInterface = requirePlugin('myPlugin'); App({ onLaunch: function () { let resources = myPluginInterface.resources global['resources'] = resources let { filters, effects, fonts, stickers } = resources } }) [代码] 上述方式可以获取到插件内置的所有类型的资源,其中stickers就是贴纸资源。相比于旧的api方式更加方便,推荐使用。 stickers的数据结构如下所示: [代码] { category: "default", // 贴纸 list: [ { "key": "guozhi", "name": "果汁", "iconUrl": "https://cdn.cdn-go.cn/mp-video-edit-static/latest/stickerIcon/guozhi.png" }, …… ] }, { category: 'emoji', // 表情 list: [ { "key": "cuolian", "iconUrl": "https://cdn.cdn-go.cn/mp-video-edit-static/latest/emojiIcon/cuolian.png" }, …… ] } [代码] [图片] 值得一提的是,插件不仅内置了一部分贴纸和表情,还提供了扩展的方法,支持用户自定义贴纸和表情,具体请参考文档自定义贴纸 设置字体 还记得上篇文章中那个平平无奇、被我一笔带过的文字输入组件 wj-textEditor 吗?它现在长这个样子: [图片] 1.4.2版本开始新增了对文字字体的支持,插件内置了几个字体,使用的时候请注意以下事项: 由于小程序插件无法调用[代码]wx.loadFontFace[代码]方法,因此需要小程序手动暴露该接口给插件,或者在小程序内提前加载字体后再传入插件渲染。 官方提供的两种解决方案: 方案1:小程序内加载完成后渲染(推荐),参考官方API:wx.loadFontFace 高级模式下如果使用到文字组件,推荐这种方案,配合文字组件的 fontList 属性,实现自定义字体的效果。 [代码]// 在小程序代码中加载字体 loadFontFace({ family: 'familyName', source: "字体文件网络地址", scopes: ['webview','native'], success(res) { console.log('font success') console.log(res.status) resolve() }, fail: function(res) { console.log('font fail') console.log(res.status) reject() } }); [代码] 构造字体用clip,设置其fontloaded属性为true,标记为已加载。 [代码] let mytext = new global['wj-types'].Clip({ type: 'text', content: { content: "文字", // 文字内容 style: { type: 'background', // 文字样式 color: '#ffffff', // 文字颜色 backgroundColor: '#ff00ff', // 文字背景色 fontfamily: 'familyName', // 上述字体名称 fontloaded: true // 标记为已加载,避免重复加载 }, position: { x: 50, y: 90 }, }, section: { start: 0, end: 10, duration: 10 }, }) [代码] 方案2:暴露接口给插件 如果没有自定字体的需求,只使用插件内置的字体,可以采用这种方式。前提是要配置插件的export属性。插件指定 export 属性 [代码]// 小程序根目录 index.js 中添加如下代码(没有index.js就新建一个),将 wx.loadFontFace 方法暴露出来 module.exports = { loadFontFace: wx.loadFontFace } [代码] [代码]// 小程序根目录 app.json 文件指定暴露给插件的内容 "plugins": { "myPlugin": { "version": "1.4.2", "provider": "wx76f1d77827f78beb", "export": "index.js" // <- 这里 } } [代码] 与贴纸、表情一样,插件内置了一部分字体,也提供了扩展的方法,支持用户使用自定义字体,具体请参考文档自定义字体 编辑素材 1.4.2版本新增了对添加到视频中的素材(文字、贴纸、表情)编辑功能,支持 删除、编辑(仅字体可用)、旋转放大、设置展示时间 如下图所示: [图片] 具体使用方式请移步官方文档 编辑控件 总结 如果说1.3.x版本是“小荷才露尖尖角”,1.4.2版本则可称之为“灼灼荷花瑞,亭亭出水中”,插件在原有基础视频剪辑功能的基础上,添加了更多娱乐性的探索,功能板块更加完善,可玩性更强。 横向对比了下抖音与快手等短视频软件的编辑功能,美中不足的是常用的转场动画和视频模板还是缺失的,而且使用久了会出现手机发热的问题(冬日暖手宝,为发热而生?),插件应该还是依赖小程序内置浏览器的内核,与原生的性能相比还是差一些,希望官方团队能优化下。 从插件的几个大版本更新内容来看,其一方面面向普通用户,旨在以类似low code的方式快速将插件应用到小程序中;另一方面面向开发者,在视频剪辑功能的基础上提供了一系列扩展方法,支持开发者根据各自需求自定义插件的内容,这部分对外暴露接口的部分相比于传统的视频剪辑工具还是很灵活的,对开发者也更友好。 微剪作为小程序端的首款视频剪辑类工具,还是很有学习、研究价值的,感兴趣的同学不防亲自试一下,探索更多的插件玩法。当然,也可以向官方提各自的需求,他们内部评审通过的话,响应还是挺积极的。 哦对了,示例代码片段我也更新了,感兴趣的同学自行 点击下载。
2020-11-18 - 小程序加载外部字体
有两种方法,步骤1、2、4是相同的。 1.将下载下来的字体文件上传到文件服务器上,拿到url 2.将url的域名在小程序公众平台配置downloadFile合法域名 ------------------------------------ 第一种方法: 3.在app.js中加载字体 wx.loadFontFace({ family: 'Bitstream Vera Serif Bold', source: 'url("https://sungd.github.io/Pacifico.ttf")', success: console.log }) 第二种方法: 3.在app.css中加载字体文件 @font-face { font-family: 'Bitstream Vera Serif Bold'; src: url('https://sungd.github.io/Pacifico.ttf'); } —————————————————————————— 4.如需全局配置,在app.css中配置全局样式,font-family填字体的英文名称。不用全局的话,page里的font-family可不配置,在页面需要显示的字体上用font-family设置 page { font-family: "Bitstream Vera Serif Bold"; background-color: #34C758; color: #fff; }
2021-01-08 - 关于 wx.loadFontFace 加载字体在真机环境下不能正常显示的实验结果分享及正确解决方案
wx.loadFontFace 必须满足的条件: 跨域 / CORS 下载的字体文件的响应头中必须包含:Access-Control-Allow-Origin: * 这里指出一下,官方文档注意事项描述中的第3点这里有个问题(也可能是我理解错了,望指正): 官方写的是:“字体链接必须是同源下的,或开启了cors支持,小程序的域名是servicewechat.com”; 经过测试后发现如果将 Access-Control-Allow-Origin 设置为:“servicewechat.com” 的话在iOS设备中可以正确下载字体,但在安卓中不能下载,显示的是:“loadFontFace:fail”, 反复测试了一下如果将 Access-Control-Allow-Origin 设置为 * 在安卓真机环境下就可以下载成功并显示了。 响应文件类型 Content-Type 必须设置为正确的字体类型,例如 *.ttf 对应的类型是 “font/ttf” 总结 正确显示字体的必要条件就是: Access-Control-Allow-Origin: * Content-Type: font/ttf | font/woff | font/woff2 | ... *上面这两条配置需要后端在字体文件保存的服务器或者CDN设置 为了让字体快速的加载,尽可能压缩字体文件大小或者精简字体,1mb内的字体大小基本可以在正常4G网络下实时加载出来;wx.loadFontFace需要设置 global 属性,才能全局生效;下载字体文件的域名必须配置到小程序的 downloadFile 合法域名中;下载的字体文件域名需要使用HTTPS协议;以上是个人实验下来的结果和一些经验,如果有不正确的地方可以评论指出。 参考 常见文件类型列表跨域/CORS(跨域资源共享)
2021-02-18 - [已解决]利用云开发解决小程序加载自定义字体无效果问题
终极效果 效果要求:使得最终页面效果在开发者模拟器、安卓、iOS都可正常显示字体效果。 [图片] 问题背景 如何在微信小程序上利用wx.loadFontFace方法加载自己要上传的字体的文件一直是困扰很多开发者的问题,很多人反映使用该方法在开发者工具模拟器上是可以显示的,有的开发者说在模拟器和iOS系统上可以正常显示自定义字体,但是安卓机上无法正常显示。 很多人为了能够实现加载自定义字体想了很多办法,比如 方法1: 字体文件转base64代码(如网站https://www.transfonter.org) ,然后存储在wxss文件中。这也是我曾使用的方法之一,确实很好用,安卓/苹果机上都可以正常实现效果。 缺点:但是面对字体文件包一般都很大的中文字体来说,转换成base64代码是极容易出现仅用来引用字体的wxss代码就超过2M的情况。 根据小程序的开发规矩,即使采用分包形式开发一个小程序,单个分包的代码量也是不能超过2M的,此时就是该方法的鸡肋。 方法2: 也有开发者利用iconfont上的在线引用方法,把自己会用到的字输进入然后点击生成字体,引用一个url即可实现。这种方法也是可行的。 缺点:但是对于部分字多或者可能出现用户输入文字的情况,这种方法就不太方便。 解决方案 今天,和大家讲的就是wx.loadFontFace方法,也是很多人一直在尝试,执着于想要利用这种方法实现。 在小程序开发者文档中,这一段文字是你不陌生的。 wx.loadFontFace(Object object) 基础库 2.1.0 开始支持,低版本需做兼容处理。 本接口从基础库版本 2.15.0 起支持在小程序插件中使用 动态加载网络字体,文件地址需为下载类型。‘2.10.0’起支持全局生效,需在 app.js 中调用。 注意: 字体文件返回的 contet-type 参考 font,格式不正确时会解析失败。 字体链接必须是https(ios不支持http) 字体链接必须是同源下的,或开启了cors支持,小程序的域名是servicewechat.com canvas等原生组件不支持使用接口添加的字体 工具里提示 Faild to load font可以忽略 ’2.10.0’ 以前仅在调用页面生效。 ——来源于《微信小程序开发者文档》 分析: 注意点1是大家一般无需担心的,我们下载到的字体文字很多是ttf文件,都是符合相关要求的。 注意点2也是一般不会犯错的,大家都会避开这个。 注意点3是非常重要的,也是很多开发者不明白的,下面,我会着重讲如何解决这个问题,解决了这个问题,无论调试还是真机都能正常显示。 在开发者文档中,有这样一段代码: [代码]wx.loadFontFace({ family: 'Bitstream Vera Serif Bold', source: 'url("https://sungd.github.io/Pacifico.ttf")', success: console.log }) [代码] 可以看出使用的是https链接,或许你曾经拿这段代码测试过。 或者你也曾经把字体文件上传到一些存储空间然后得到上传后文件的地址,或者说你曾经在开发者社区看到别人上传的字体文件的https链接然后来调用。 在开发者工具模拟器上正常显示,一到真机就显示不了。 当然为了想要使用我自己喜欢的字体,得到该字体的文件链接,我也突然脑洞大开,尝试把字体文件上传到云开发的云存储上,然后得到一个FileID链接和一个下载链接。 随后在页面或者全局的JS中加载该字体文件: 代码: [代码]loadFontFace() { wx.loadFontFace({ family: 'XXX', source: 'url("xxxxxx.ttf")', success(res){ console.log('res', res) }, fail(err){ console.log('err', err) } }) }, [代码] 遗憾的是,也是能在模拟器中显示出自定义字体效果,在安卓的真机上无法正常显示,iOS未知(我没有iOS系统故无法测试)。 到底是怎么回事,问题出在哪呢?于是一遍遍琢磨开发文档中的注意事项“字体链接必须是同源下的,或开启了cors支持,小程序的域名是servicewechat.com”。 后来琢磨后面一句话,我也是不明白啥是cors,于是就搜索了,记得其中一篇文章就讲到腾讯云的cors之类的。 操作步骤 1 进入腾讯云的官网(https://cloud.tencent.com),然后登录账号,选择公众号小程序登录,扫码并选择需要实现自定义字体的小程序进行登录 2 在顶部菜单栏找到“对象存储” [图片] 3 存储桶列表中新建一个存储桶 [图片] 4 给存储桶设置配置,跨域访问中设置好“cors规则”,把https://servicewechat.com域名填写到来源Origin的方框内。 [图片] 现在再来读读“字体链接必须是同源下的,或开启了cors支持,小程序的域名是servicewechat.com”是不是有了新的体会。 5 把需要使用的字体文件上传到该存储桶,然后点击文件右边的“详情”,你就会看到“对象地址”,这个地址就可以粘贴到JS文件的wx.loadFontFace使用。 [图片] 6 不要忘了设置刚刚上传的字体文件“访问权限”为“公有读私有写”,这样每个用户都可以读取这个字体文件了。 源码分享 JS文件 [代码]loadFontFace() { wx.loadFontFace({ family: 'XXX(你给字体拟的名称,最好英文如kaiti)', source: 'url("对象地址")', success(res){ console.log('res', res) }, fail(err){ console.log('err', err) } }) }, [代码] WXSS文件 [代码]page{ font-family: 'XXX'(你给字体拟的名称,最好英文如kaiti); } [代码] 或者 [代码].xxx(class名){ font-family:'xxx(你给字体拟的名称,最好英文如kaiti)' } [代码]
2021-04-13 - 党建答题小程序源码功能分析
一、答题小程序概述: 2021年是我党成立100周年,为迎接建党100周年,我们开发了一款针对党建知识的在线答题小程序,目前该小程序已成功上线,应用于各个企事业单位助力党建答题活动,在线学习党建知识。 该答题小程序主要功能有:个人每日答题、好友一对一PK答题、排位升级答题、多人团队答题。其中多人团队答题又细分为邀请制和随机制。另外又附有每日签到、道具卡、指定白名单使用、绑定企业微信、题目插入图片或视频。功能还是非常强大,基本能满足各种答题活动的需求了。接下来咱们就一一来看一下这些模式: [图片] 二、答题功能模块分析 1、每日签到 签到可以有效的提升用户粘度,每天签到领取积分,连续签到有额外奖励。 [图片] 2、 每日学习答题 [图片] 答题版块每组题目为5道,题目从题库中随机抽取,包括:党建理论基础、红色革命、新时代理论思想等方面知识。 题目比例可自定义,例如党建理论基础3,红色革命1,新时代理论思想1。 点击今日任务进行答题,答题时间计时20秒,在规定的时间内答题,超时放弃答题。答对即可获得积分(答对一题获得100),答错没有积分。 连续答对题目,积分递增。如:连续答对两题获得300分,连续答对三题获得500分,以此类推。中间答错重新开始后按照原来的一题100分开始) 3、好友一对一PK答题 可邀请微信中的好友进行一对一PK答题 [图片] 4、排位升级赛答题 成今日任务后可自由选择是否进行排位赛。个人排位赛分为以下七个段位:青铜、白银、黄金、铂金、钻石、宗师、王者。 [图片] 个人排位为随机匹配对手进行1V1答题比赛,每人每天3次机会。 如果参加排位赛,战胜对手就可以加一星,当前段位星满后,自动开启下一段位,除答题得分外还可得到新段位称号积分奖励;若未达到新的段位,只加星星,每颗星星300积分。如果输掉了排位,不会掉星星;若两人平分,都不加星星。 [图片] 参加个人排位,答对一题100分,答错不扣分,连续答对积分递增。 每次答题5道,每道题时限20秒,超时自动放弃。 [图片] 青铜→白银:一颗星 称号奖励300积分 白银→黄金:二颗星 称号奖励600积分 黄金→铂金:三颗星 称号奖励1000积分 铂金→钻石:四颗星 称号奖励1500积分 钻石→宗师:五颗星 称号奖励2000积分 宗师→王者:六颗星 称号奖励3000积分 达到宗师、王者段位的员工可获得线下奖励 (新增机器人AI答题功能,在没有真人匹配的情况下,系统自动分配机器人进行对战) 5、 团队赛多人答题(邀请制+随机制) [图片] 团队答题是本系统的核心,2V2顾名思义就是2个人对战另外的2个人进行比赛;也就是该模式最少需要4个人参与,邀请微信好友来组队;3V3 5V5大同小异。在团队赛比赛中,每个人都必须答题给出自己的答案,总分高的队伍获胜. [图片] 进入团队对战后,可随机匹配战队,(人数为2±)也可以邀请在线好友一起组队。两个团队成员每人按照顺序答题(他人答题时战队成员只看观看,不可文字提示等),答对一题团队每人可获得200积分,答错不扣分。 [图片] 每次对战10题,每道题目20秒时间为限。 最终积分高的团队获胜,可另外获得1000积分;积分低的团队失败,无另外的积分加成。 [图片] 三、总结 党建答题小程序主要功能有:每日签到、排位赛、好友PK、每日答题,群比赛2V2 3V3 5V5以及道具商店等。完整题型库、自定义分类,自定义答题规则,配置参数等,专业部署服务。适用于各类企业、教育机构、党建政务学习、等行业。 技术方面:该答题小程序为JAVA程序开发、代码开源、拥有自主知识产权,用户可放心使用。
2021-03-13 - 大佬们。这是咋了?搜一搜搜不到了!
[图片] 大佬们。这是咋了?搜索来的流量也没有了! [图片] 也没有违规提示。站内信也没有收到啥消息,好几天了也不知道为啥! 好不容易有个小程序有点流量了。。然后就凉了! 100个字咋弄啊! 求大佬带带。向大佬们学习。学习运营是一件艰难的事情!
2021-01-03 - 云开发云函数定时触发器讲解
任何可以产生事件,触发云函数执行的均可以被称为触发器,而定时触发器则是可以处理周期性的事情,比如时报、日报、周报等通知提醒,也可以处理倒计时任务,比如节假日、纪念日以及你可以指定一个具体时间的倒计时任务,除此之外,定时触发器还可以用来周期性处理一些定时任务。比如定期清理一些不必要的数据,定期更新集合内的数据。 13.5.1 定时触发器使用说明1、定时触发器的配置与部署配置了定时触发器的云函数,会在相应时间点被自动触发,云函数的返回结果不会返回给调用方。在对某个云函数使用定时触发器前,首先要保证该云函数在小程序端可以调用成功,更准确的说是能够在不传入参数的情况下在云开发控制台的云端测试能调试成功(小程序端调用有登录态)。 云函数目录里的 config.json 文件可以用来配置权限和定时触发器,如果你的云函数目录下面没有这个配置文件,可以自己创建一个,创建的结构目录如下: test //云函数目录 ├── config.json //权限和定时触发器等的配置文件 ├── index.js //云函数 ├── package.json //云函数的依赖管理 然后再来在配置文件 config.json 里进行类似如何格式的配置,config.json 严格遵循配置文件所要求的格式,比如数组最后一项不能有逗号[代码],[代码];配置文件里不能有注释等 triggers 字段是触发器数组,但是目前云函数只支持一个触发器,即数组只能填写一个,不可添加多个;name 是触发器的名字,最大支持 60 个字符,支持 a-z, A-Z, 0-9, - 和 _,必须以字母开头;type 为触发器类型,timer 是定时触发器config 是触发器的定时配置,里面为 cron 表达式(后面有介绍),cron 有七个必需字段,不能多也不能少(以下为每天早上 9 点到 12 点每隔 5 秒触发一次);{ "triggers": [ { "name": "tomylove", "type": "timer", "config": "*/5 * 9-12 * * * *" } ] } 当我们在修改触发器配置文件 config.json 后,首先鼠标右键 config.json 选择“云函数增量上传:更新文件”,然后再右键 config.json 选择“上传触发器”。这里的“云函数增量上传:更新文件”是让云函数端的触发器文件更新;而“上传触发器”则是让触发器开始生效执行。如果在云函数端的触发器没有更新的情况下就“上传触发器”来执行定时触发,文件可能没有更新,执行的还是旧的触发器内容。当我们想暂停或删除触发器时,可以右键选择“删除触发器”。 2、Cron 表达式语法Cron 表达式有七个必填字段,按空格分隔,既不能多写也不能少写,每一个字段都有它的含义对应着不同的时间点,表达式的取值都为整数且为时间制的范围(注意月在星期的前面): 第一位第二位第三位第四位第五位第六位第七位秒(0-59 )分钟(0-59)小时(0-23)日(1-31)月(1-12或三个字母的英文缩写)星期(0-6或三个字母的英文缩写)年(1970~2099 ) 下面是 cron 表达式的案例,以及我们需要了解一下 cron 表达式里的通配符以及直接写数字的含义: [代码],[代码],表示并集,在时间的表述里是“和”的意思,比如在“小时”字段中, [代码]1,2,3[代码]表示 1 点、2 点和 3 点;[代码]-[代码],指定范围的所有值,在时间的表述里是“到”的意思,比如在“日”字段中,[代码]1-15[代码]包含指定月份的 1 号到 15 号;[代码]*[代码],表示所有值,在时间的表述里是“每”的意思,比如在“小时”字段中,[代码]*[代码]表示每小时;[代码]/[代码],指定步长,在时间的表述里是“隔”的意思,比如在“秒”字段中,[代码]*/5[代码]表示每隔 5 秒;直接写数字,在时间的表述里是“第”(时间点)的意思,比如在“月”字段中,[代码]5[代码]表示每月的第 5 日;//表示每隔5秒触发一次, */5 * * * * * * //表示在每月的1日的凌晨2点触发 0 0 2 1 * * * //表示在周一到周五每天上午10:15触发 0 15 10 * * MON-FRI * //表示在每天上午10点,下午2点,4点触发 0 0 10,14,16 * * * * //表示在每天上午9点到下午5点内每半小时触发 0 */30 9-17 * * * * //表示在每个星期三中午12点触发 0 0 12 * * WED * 定时触发器的 Cron 语法没法实现每隔 90 秒钟或 90 分钟发送一次这样的效果,因为 90 秒超过了秒的时间制上限 60,而 cron 在跨位组合(比如 90 秒需要结合秒和分)上无法覆盖所有的时间;除此之外,云开发的触发器暂时不支持多个定时触发器的叠加;在 Cron 表达式中的“日”和“星期”字段同时指定值时,两者为“或”的关系,即两者的条件均生效;值得一提的是,尽管云函数的时区为 UTC+0 时区,但是定时触发器的时间还是北京时间。 13.5.2 用定时触发器调用云函数定时触发器的使用非常简单,使用开发者工具新建一个云函数比如 trigger,然后在 index.js 里输入以下代码: const cloud = require("wx-server-sdk"); cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV, }); exports.main = async (event, context) => { console.log(event); return event; }; 再在 trigger 云函数目录下的 config.json(如果没有这个文件,就创建一个),然后输入以下触发器,为了调试方便,我们可以每隔 5 秒触发一次: { "permissions": { "openapi": [ ] }, "triggers": [ { "name": "tomylove", "type": "timer", "config": "*/5 * * * * * *" } ] } 然后分别右键 index.js 和 config.json,选择“云函数增量上传:更新文件”,然后再来右键 config.json 选择“上传触发器”。云函数就会每隔 5 秒自动触发,相关的日志我们可以在开发者工具的云开发控制台以及腾讯云云开发网页控制台的云函数的日志里查看。 注意小程序端调用 trigger 云函数返回的 event 对象,和使用定时触发器返回的 event 对象的不同,用定时触发器触发云函数是获取不到 openId 的,同时这里有一个 Time 时间是时区为 UTC+0 的时间,比北京时间晚 8 个小时: //在小程序端调用trigger云函数之后返回的event对象 { "userInfo":{ "appId":"wxda99******7046", "openId":"oUL-m5F******buEDsn8" } } //使用定时触发器触发云函数之后返回的event对象 { "Message":"", "Time":"2020-06-11T11:43:35Z", "TriggerName":"tomylove", "Type":"timer", "userInfo":{ "appId":"wxda99********46" } } 13.5.3、定时触发器的应用定时触发器的应用非常广泛,以下仅举一些常用案例,并加以说明: 1、结合消息推送这里的消息推送不仅仅只是指订阅消息,还可以是统一服务消息、公众号的消息(可以用云函数开发微信公众号)、小程序内自己开发的通知(只是用户只有在打开小程序时才能看到)、Email 邮件等等。 比如用户订阅了日报、周报、月报等周期性的通知提醒或者我们需要给用户发送一些汇总信息,就可以固定写一个定时触发器,比如我们需要给指定用户发送工作周报,每周五晚上 17 点 30 分就定时从数据库获取数据发送消息,cron 表达式写法如下: * 30 17 * * FRI * 还可以用来处理一些倒计时(指定时间点)的任务,比如节假日、纪念日以及一些活动时间节点(定时触发器目前只能一个云函数配一个触发器,但是可以提前管理),比如我们希望在六一儿童节的早上 9 点调用云函数给指定用户群体发送消息: 0 0 9 1 6 * * 当然这样的具体时间点显得过于的不灵活,但是如果把时间与云开发数据库结合起来,灵活性就会大很多,比如在运营上每天早上 11 点是你们用户访问最多的时间点,你只需要写一个云函数,把所有的活动都在这个时间点来推送,让定时触发器每天这个时间点都触发,有活动(数据库里有数据)就会发消息,如果没有就不发(云函数调用一次的成本极低)。 如果是实时数据,我们还可以把定时触发器的频率调高,每 5 秒就触发一次,比如我们的数据库只要有最新的数据,就会发消息给指定用户。尽管不是完全的实时,但是 5 秒的频率和实时的差别也就不大了。你也可以根据情况,来调整触发器的频率,毕竟 5 秒和 1 分钟的频率给用户的体验差异并没有太大,但是成本却是 12 倍的关系。 可能你还希望在指定的时间段才触发云函数,比如你只希望在工作日、或者在早上 9 点到晚上 18 点才触发,在指定的时间段才触发既可以让触发更精准不扰民,也可以节约成本,比如下面的触发器就是工作日早上 9 点到 12 点和下午 14 点到 18 点这个时间段,每 5 秒触发一次。 */5 * 9-12,14-18 * MON,TUE,WED,THU,FRI * 从以上案例我们可以了解到,云函数的定时触发可以来自于 cron 表达式的配置,我们可以指定时间点时间段和频率来达到我们想要的效果,同时这个时间“也可以来自于数据库的配置”(伪装),意思是我们可以设置触发器的时间段或频率,如果数据库里有数据就发送,没有数据就不发送,这样就可以达到触发器在时间上的灵活性了。 2、实时获取数据有的时候我们的数据并不是来自于数据库,而是来自于第三方服务,比如前面介绍过的历史上的今天的 API,天气的 API,知乎日报的 API 等等,以及一些 webhook,这些 API 和第三方服务提供的是 json 格式的文件,API 的数据也会随时更新,但是它们更新了却并不会主动通知我们,这时我们可以使用定时触发器向这些 API 发起请求,如果数据出现更新,我们就可以将更新的数据存储到我们的数据库或者进行其他处理,比如企业微信的机器人等机器人通知服务就是如此。 当然定期获取的数据还可以是爬虫,比如我们可以定期抓取指定关键词的新闻或者指定网站的动态,当爬虫获取到了不同的数据的时候,就将最新的动态以机器人消息或者其他方式进行及时的处理。 也就是说,我们无法实时监听到第三方 API 或者网站数据的变动,但是可以用定时触发器来发起请求或者爬虫抓取数据,通过数据的变化来达到“实时”获取数据的目的。 3、自动化处理在数据库的设计里,我们就提到有时候需要对数据库里的数据进行定期的备份与删除等清理维护工作,比如超过一定时间的日志,具有很强时效性的活动数据,以及为了性能考虑而做的虚假删除(数据库性能与优化有介绍)等,毕竟数据库有一定的存储成本而且过多无用数据也会影响数据库的性能,我们可以写一个云函数用定时触发器来执行此类任务。 我们还可以在用户并发比较少的时间段(比如凌晨几点)来处理一些比较耗云函数、数据库性能的任务,比如图片的审核与裁剪、缩略等处理,用户评论是否包含敏感词汇(尽管经过安全处理,但是有时候我们还会设置特别的敏感词),数据的汇总,云存储里废弃文件的删除,用户信息是否完整等等。 也就是说,结合定时触发器,我们可以实现一些任务的自动化处理。 4、密集型任务分流我们知道云函数在处理一些复杂性的任务时是有一些限制的,一是执行时间的限制,建议在设置时执行时间一般不要超过 20s,最长不要超过 60s;二是并发的限制,云函数最大的并发为 1000;三是云函数在查询数据库时一次可以获取最多 1000 条的数据,面对这三个限制,我们应该如何处理密集型的任务呢,比如发送 100 万封邮件,导出几百万条数据到 Excel,发送十万级的订阅消息或消息等等,这个时候就可以使用到定时触发器来处理了。 借助于定时触发器,我们可以将需要耗时较长、对并发要求较高以及数据库请求等的任务进行分批处理,比如我们要给 100 万人发邮件:云函数发起数据库请求,一次只请求 1000 条未发送过邮件的用户(用 where 条件查询某个字段,比如[代码]status:false[代码]),然后将邮件发给 1000 个人(可以参考前面的邮件发送),发完邮件并对这 1000 条数据进行标记(比如使用更新指令将 status 改为 true),这样下次查询未发送过邮件的用户时,就不会重复发送了。通过定时触发器,每 2 秒执行一次发送任务,几十分钟就可以处理完任务。
2021-09-10 - 小程序流量主运营技巧
前言(写给入坑的小白) 本文不涉及任何需要资质的小程序(如:视频类目)。小程序流量主是个人和小微企业主要变现途径之一,满1000人即可开通流量主(登录mp.weixin.qq.com,左侧边栏-推广-流量主-开通即可)。开通后,开发者可从流量主-广告位管理添加广告位,目前有6种广告位。 [图片] 正文(本文约很多字,分为四大主类,手里有1-10个小程序建议全部看完;手里有10个以上小程序,可跳过1、2、3,均为个人观点,不喜使劲喷) 一、小程序定位 小程序定位目前有以下四种,均不需要任何资质,个人(商城除外)/小微企业都可以做,由于本人不擅长文字表达,每个类型只选择一个做分析,谅解。 1、工具类 工具类有很多可以做:题库、技术文档、教程、去水印等。目前最火爆的应该属于疫情相关类的工具,关于疫情数据类小程序不做分析,没资质也没权利,主要说疫情周边可运营的工具。头像口罩,代表小程序:头像加口罩、戴个口罩吧、戴上口罩(每日搜索量约等于2000),可参考以下做法: [图片] 以下为近7日访问数据量 [图片] 盈利方式:流量主 延伸参考:如果仅做头像加口罩的话,那么疫情过后,这个小程序会直线下降,将无任何作用。如果开发者手里目前有类似小程序,可参考“头像加口罩”做法,逐渐去延伸头像周边功能,例: ①、头像加字:头像+数字、头像加V、头像加字、头像加圣诞帽、新年头像边框、头像加福、头像加明星等 ②、聊天背景图、壁纸:武汉加油、卡通、美女(不要漏点太多)、二次元、跑车、科技等 ③、趣味九宫格配图:类似朋友圈9张图,中间获取用户自己头像,周围8张图弄点能吸引用户的等 ④、文字秀:微信昵称下标、上标、个性昵称等 运营分析:如果参考以上4点做法,首先你的程序再疫情结束后,不至于直线下滑,最起码能留住一些用户(UI很重要) 个人建议:工具类的好处就是不需要去长时间盯着后台,建议有想法的开发者,可以入门5-10个左右工具类小程序(功能不要相同)。 推广方式:参考本文第四大板块内容 2、返利类 主流返利平台:淘宝、天猫、拼多多、京东、蘑菇街、唯品会、网易考拉,以下参考 [图片] 盈利方式:返利(主)+流量主(辅) [图片] 基础分析:每个人微信里都会有一个或多个微信群是给你们购物优惠券链接的,他们盈利方式主要是靠每个平台的返利,比如淘宝天猫的叫“阿里妈妈”、拼多多的叫“多多进宝”等 运营分析: ①、平台功能:提供所有优惠券、商品返利、代理入驻、提现(个人可做收款码、企业可对接微信支付到零钱) ②、招代理商、可以给代理商(兼职、宝妈)50%以上的返利 ③、除了商品优惠券之外,可以把返利分给一部分给到用户。首先,用户会花更少的钱买到商品;其次,用户买完东西还会赚点小钱,每个月可提现到微信零钱。这样用户会发生裂变,省钱+赚钱。 个人建议:开发者至少有一个类似的返利小程序,每个月只需运营一天,工作内容一是把用户的返利发给用户&代理商,二是自己去各大平台领取每个月的“工资” 推广方式:参考本文第四大板块内容 3、商城类(个人开发者可跳过) 商城类,本人运营的比较少,每天就10-20单左右,卖啥就不做广告了 盈利方式:差价 基础分析:如果自己手里有一些商品低价资源,可以做一个“综合服务商城类目”,然后去试着用广告主去推一下 运营分析: ①、平台功能:砍价、返利、拼团、回购、入驻、积分、抽奖、游戏营销 ②、广告主曝光&点击报价不要最低,也不要最高,理由就是最低的话,80%的钱会给你推到一些质量很差的微信用户,比如我。 ③、对接圈子,虽然圈子刚起步,不确定能不能做大,万一呢? 个人建议:企业一定要有一个自己的商城,哪怕没人买。这种东西怎么说呢,就好比一个企业站,虽然没什么用,但是得放那儿,万一客户要看呢? 推广方式:参考本文第四大板块内容 4、游戏类(非小游戏) 答题、成语、找茬等类似运营的比较多,可自行搜索,不要认为这是游戏,开发者就望而却步,在线教育类目是可以通过的,这个开发者很多都不知道。以下可参考: [图片] 盈利方式:流量主 基础分析:基本所有的模式都是闯关类型,这种类型的小程序,基本都是用户消磨时间用 运营分析:关卡尽量多,入门、初级、中级、高级,高级模式可以做类比循环,形成无限关卡模式,闯关奖励机制,签到机制等。这种类型的小程序比较方便运营,裂变起来也快。 个人建议:裂变模式一定要有,虽然微信会严格把控这方面功能,但是开发者可以做一些技巧,不要让用户强制或者主动去触发,这样微信对开发者还是很友好的。 推广方式:参考本文第四大板块内容 二、小程序开发 有实力的开发者,自己开发,云开发很快,会前端就可以了,没实力的去正规平台买源码,论坛源码也很多,有部分论坛还是嵌入了比特币勒索,自己做好防护。个人建议:开发者能开发尽量自己开发,后期迭代方便,不要像我一样,50多个小程序80%是买现成去运营的。反正各有各的好处,开发者可自行决定,运营者可选择直接购买源码直接上线运营,前提是自己看好功能是不是和自己要的一样。有些SAAS平台的开发者实力还是可以的,支持定制功能。此处不做广告,自行搜索或者询问朋友。 三、广告位位置及利润 开发者的每个页面广告位一定要分开!一定要分开!一定要分开!这样做的目的是为了分析每个广告位的利润,好去做调整,把收益最大化。 失败案例举例:小程序的主页、个人中心页用同一个banner广告位,这样做出来一点好处都没有,后台只能看到banner收益是多少,看不到是哪个页面收益。极端情况,收益全部再首页,个人中心页没有广告收益,这种情况开发者是不知道的,如果把广告位分开,这种情况可以去优化个人页面,或者主页面换成视频banner。广告位分析页面:流量主--数据统计--广告数据--广告指标明细--细分数据 [图片] [图片] 1、很多人表示,疫情期间流量主收入下滑。这个原因不是因为微信调整流量主收益,根本问题是自己的用户质量。举个例子,当你开通流量主之后,你的用户还是这1000个,假如你第一天收益为100,你很开心,1000用户就能赚100,你第二天就放弃推广了,这样的话,你的用户质量是会逐渐下滑,微信方完全可以认定为你这1000人都是自己的号,去刷广告费的。长此以往下去,你的流量主利润会无限趋向于0。举个栗子: [图片] 2、广告位位置一定要合理好看,但是不代表“流氓”,比如全明星代言的某游戏“元宝无限收一刀999”点哪儿哪充值。开发者需要注意的是小程序的质量,需要用户在每个页面停留的时长最起码30秒,这样一个完整的视频广告才能曝光完。 3、banner广告收益是按有效点击计算的。很多人好几千曝光,但是点击只有几个、十几个,这种情况需要不断去优化接入的场景/位置,提高用户点击意愿。个人技巧:banner广告位尽量不要太多,1-2个就可以。尽量多放几个视频广告位,这样曝光也有收益。格子广告没试过,用过都说不好~ 4、激励广告作为流量主最高收益是有一定道理的,用户为了获取某些奖励是必须观看完整的,所以给开发者建议:用户如果可以获得小程序内某些奖励,可以适当多放一些激励广告位。 5、所有的广告位都是根据用户年龄、爱好等参数去调取相应的广告,开发者不需要去考虑 6、广告收益个人认为:激励》视频》插屏》前贴》banner》格子(格子没试过,暂放倒数第一) 四、小程序推广 尽量做成年人主打的小程序,有些开发者觉得好玩儿,做一些儿童益智类的小程序,你是认为儿童有手机,还是认为家长愿意让孩子玩儿手机呢?这个很不解。没有鄙视的意思,也许是情怀吧~~毕竟我做小程序比较俗,就是为了赚钱。 主流推广方式:公众号引流、截流,由于涉及一些不合常规的内容,本文只说常规操作,剩下的自己领悟,或者可以联系我~ 首先小程序的名字至关重要,一个好的名字可以带来无限的流量,再加上裂变功能(邪恶的微笑)。起名字的时候可以用到的工具:搜索小程序-微信指数,查询关键字,尽量找稳定再1000万以上的搜索量,从关键字中摸索自己的小程序名字。这样用户搜索到你的小程序几率会很高~ 1、工具类核心玩儿法(适用于所有小程序推广):文章引流,截取关键字,火爆主题,比如2019年12月19日庆余年全集泄露、2020年疫情(不要发疫情数据内容,要发一些正能量的有内容文章去引流),我阅读过的文章最低的阅读量8000左右,最高的10万+,据说有好几百万的阅读量。如果你的文章写的好,结尾放一个小广告:为防止疫情蔓延,请给您的头像带上口罩~,啪,一个卡片小程序(或二维码),流量自己想~ 推广对象:18-30岁 2、返利类核心玩儿法: ①、可以参考工具类玩儿法 ②、各大微信群、QQ群,去推广,招代理等方式,或者去买一些基础流量,进行裂变,实际运营看下效果,好继续针对用户群体去推广,建立自己的群体系,群内发商品返利链接。微信好友没人?给你举个例子,我这篇文章发完,如果加个我的二维码,最起码能有100人加我,不是我文章写的有多好,是你永远不知道用户有什么样的目的和需求~ 推广对象:18-60岁 3、商城类核心玩儿法 ①、可参考返利类核心玩儿法,拥有自己的客户群体系,发一些自己的商品还是可以的,一定要带分销体系,你懂得~(最高3级,再高就是传销了) ②、广告主、目前效益个人感觉不明显,每次花1000块钱做广告,利润基本没有,和发广告的钱持平,而且用户留存也不是很高,可能是我的商品比较单一等各方面因素吧,不过赚流量还是不错的。 推广对象:18-30岁(以我的商城为例,还需看商城出售的内容) 4、游戏类核心玩儿法(非小游戏) ①、一个好的名字就够了。举例:精选商品橱窗(腾讯官方),微橱窗(我朋友的)。不得不说,这波流量很高,遗憾的是,他不是火爆的游戏类小程序~ [图片] ②、参考工具类玩儿法,文章引流截流 推广对象:18-40岁 五、小程序矩阵 矩阵一定要有,矩阵一定要有,矩阵一定要有,防截流,底配10个小程序。不是纯矩阵,是微信开发规定,每个小程序可以跳转10个小程序,开发者可以利用这个功能去添加自己的矩阵来获取更多的流量收益,保证自己的用户在自己的矩阵圈活动。 [图片] 写这篇文章主要是给大家传授经验,希望小白能学到点东西,入门后的朋友可领悟到更多运营方法,江湖之大,附月账单有缘再见 [图片]
2020-05-25