个人案例
- 小程序流量主运营技巧
前言(写给入坑的小白) 本文不涉及任何需要资质的小程序(如:视频类目)。小程序流量主是个人和小微企业主要变现途径之一,满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 - 它迈着矫健的步伐来了 - 「微剪」 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 - 低功耗蓝牙使用API设计封装函数模式示例
var bluetooth = { RESET: function(){ // 基础数据配置 this.btName = ""; this.deviceId = ""; this.serviceId = ""; this.write_characteristicId = ""; this.read_characteristicId = ""; clearTimeout(this.sendTimer); this.sendTimer = null; }, START: async function () { // 启动蓝牙,判断用户蓝牙是否已开启 }, SEARCH: async function () { // 搜索设备是否在附近,wx.onBluetoothDeviceFound 记得GPS权限,切勿频繁先调用GPS获取用户地理位置再搜索 await this.START(); return new Promise((reslove, reject)=>{ reslove(); }) }, CONNECT: async function () { // 连接设备 // if(self.btName == device.btName) let sameName = self.btName == device.btName ? true : false; // 记录蓝牙连接是否多次同时快速触发 if(this.waitConnect && sameName){ console.log("正在连接,请稍等...") return; } this.waitConnect = true; await this.SEARCH(); return new Promise((reslove, reject)=>{ this.waitConnect = false; reslove(); }) }, SEND: async function (device, data, callback) { // 发送数据 this.passCheck = device.passCheck //这样写,可以兼容连接设备中,发送指令1,但是连接过程中,又发送指令2,那么连接成功后,处理指令2 this.data= device.data this.callback = device.callback await this.CONNECT(); return new Promise((reslove, reject)=>{ device.sendEnd(); callback(); }) }, receiveDataCallback: function(){ // 接收设备返回的数据到前台 callback(value) }, CLOSE: async function () { // 关闭蓝牙线程 }, DISCONNECT: function(){ // 断开指定设备连接 }, STOP: function(){ // 停止搜索监听 }, ERROR: function(){ /*** * ERROR 错误 * err @params {} * err.ercode @params Number * 0 ok 正常 * 10000 not init 未初始化蓝牙适配器 * 10001 not available 当前蓝牙适配器不可用 * 10002 no device 没有找到指定设备 * 10003 connection fail 连接失败 * 10004 no service 没有找到指定服务 * 10005 no characteristic 没有找到指定特征值 * 10006 no connection 当前连接已断开 * 10007 property not support 当前特征值不支持此操作 * 10008 system error 其余所有系统上报的异常 * 10009 system not support Android 系统特有,系统版本低于 4.3 不支持 BLE * 10012 operate time out 连接超时 * 10013 invalid_data 连接 deviceId 为空或者是格式不正确 */ }, } var device = { btName: "btName", deviceId: "AB:CD:EF:00:00:01", // 实践中设备端地址请勿以 00 开头 00:00:00:AB:CD:EF passCheck: new Date().getTime(), // 记录触发跟设备返回是否为同一事件 sendEnd: function(res){ // 用于记录发送数据给设备成功后,设备一直未返回执行相关命令 clearTimeout(bluetooth.sendTimer); bluetooth.sendTimer = setTimeout(() => { clearTimeout(bluetooth.sendTimer); bluetooth.CLOSE(); }, timeout); }, onBLEConnectionStateChange: function(res){ // 用于监听蓝牙设备操作过程中,设备主动断开(例如:突然把设备断电或手动断开蓝牙捕获异常处理) // if(device.passCheck == ) }, capture: function(err){ // 用于获取操作过程中,蓝牙未启动,操作过程中连接失败或连接操作过程中出现的异常 // if(device.passCheck == ) } } // 使用示例 let data = "00 11 22"; bluetooth.START(device); bluetooth.SEARCH(device); bluetooth.CONNECT(device); bluetooth.SEND(device, data, function (value) { console.log("value=>",value) // 用于收到设备返回数据回调处理 if(value){ bluetooth.passCheck = ""; bluetooth.CLOSE(); } }) 针对连接问题,方法推荐: // timeout 针对特殊手机,如果发现首次连接铁定失败,或首次连接超时较多,可以将时间首次连接改到小于一秒,这样第二次连接timeout=10s, // 成功率较多, // 这种做法可以减少因差手机第一次连太久出现用户手动关闭的情况。毕竟一秒能连上的手机都是性能较好,安卓版本较高的手机。 var allowWaitTime = 15 * 1000; var timeout = 10 * 1000; var startCreateTime = new Date().getTime(); function createBLEConnection(){ wx.createBLEConnection({ // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接 timeout: timeout, // number 否 超时时间,单位ms,不填表示不会超时 deviceId: self.deviceId, // serial: false, // 会闪退的 success(res) { // console.log("createBLEConnection res=>",res) }, fail(err) { // console.log("createBLEConnection err=>",err) let useCreateTime = new Date().getTime() - startCreateTime; // 这样写正常情况下都会按时返回的,例如,请问你的蓝牙 // 连设备多长时间后超时,你可以根据timeout 回答。但这种误差可能造成你无法提供解释的情况,无奈下推荐写个时间计算器, // 时间一到,不管成功与否都弹出失败提示。哪怕最后一秒连上了,也弹出失败。(无奈,无奈,无奈)可以减少与非同行讲解误差。 if (err.errCode == 10012) { // 连接超时,可能 if(useCreateTime >= allowWaitTime) { self.ERROR(err); self.CLOSE(); }else{ setTimeout(()=>{ createBLEConnection(); }, t ); // t 根据测试数据,效果来定 } }else { // (err.errCode == 10003) // (err.errCode == -1) // 10003 底层蓝牙失败,处理大体思路 CLOSE(); START(); CREATE(); } }); } createBLEConnection(); 代码片段示例 https://developers.weixin.qq.com/s/qJ6lORmy7LpS github https://github.com/synctimes163/wxapp-bluetooth
2021-04-26