一种轮回叫时间

十月 16th, 2015

纯干货!初创公司如何获得第一批10万用户

五月 16th, 2015

本文主要针对产品上线不久,以获取10万用户为目的的创业者,当然,对以下两类人基本无用:
1、行业人脉和媒体关系极好,产品上线,立即吸引媒体纷纷专注并报道(也未必是好事儿,想想某场景、瞬时社交App的故事吧)

2、融资能力极强,有足够多的钱可以做推广,这个真没办法,融资能力是核心竞争力

选择创业的时候,我们总是一腔热血,觉得自己的idea多么靠谱,有多少资源可以用,推广的主意多么妙,一年100万用户问题不大,接着一轮接一轮融资,走向人生巅峰,赢取白富美。可现实情况往往和预想相差很大,醒醒吧,少年!

拿到种子投资的创业公司,第一个挑战就是把产品做出来,不少产品并未问世就夭折了,或者找外包公司做的bug满天飞的产品,能组一个靠谱的团队,把产品按照自己想象开发出来,实属不易。当这个挑战跨过去之后,就要开始找用户,不管用什么办法必须拿到10万用户,然后才有机会有下一轮融资,否则基本就拜拜了,至少有80%的公司没有走过这一道坎。

就像这幅创业公司成长曲线所描绘的,很多公司形成不到第一个增长趋势。
9D7D727B-E29F-477F-B280-5B56342F8E99
那么,对于“平凡”的创业者来说,该怎么办呢?

两个“别放”

一、别放太多预算在公开市场推广

公开市场指的是,所有人都知道的渠道:应用市场排名、刷榜、积分墙、微博粉丝通、腾讯广点通等,主要原因是:
1、产品初期各方面都不够完善,转化率、活跃度都是比较低的状态,花钱带来的用户难以留存,不如先把产品做好,或是把钱放在提高创始团队福利上,以提升效率。有的创业者一下子花掉公司10%的钱做推广,是很危险的。
2、公开市场价格较为透明,所有公司做市场的人都盯着,价格较高,即使通过很大努力,ROI可以做到行业平均的1.5倍,但仍然很贵,尤其对于没有收入、商业模式还不清晰的产品

二、别放太多精力在无效的BD上

往往很多“人脉达人”的创业者容易陷进去,导致分心。觉得和朋友公司一起做个活动,导点量很容易。但是好兄弟喝酒是一回事儿,公司业务级别的帮忙很难帮太深的,转化率也会很低。不少朋友都和我聊过一起做活动吧,但是生掰硬扯的活动或者互推真的没什么用。早期时间宝贵,把心思花在更有效的地方吧。
人脉好,有资源是好事儿,但要分清楚哪些是你现阶段真正需要并可以撼动的资源,每一个资源都要想好时机和结合点,充分利用好,否则很浪费时间。

那么创业公司怎么获取第一批种子用户(10万量级),总结下来,主要4个方面:
1、非公开市场/nicht渠道
2、主流渠道,创新的形式,短平快
3、产品上找到一个点和市场紧密配合
4、做好客服,尤其抓住关键人物

下面一个个的说,大部分例子都有据可查,如有错误,请指正

一、非公开市场/niche渠道

现在,往往我们能想到的渠道,就是微博、微信,找段子手、大号来发广告,他们性价比越来越低,反而可能忽略了一些更适合你的“特殊”渠道。这些渠道还没有被广告太侵蚀,初期的效果会很好

举两个例子:

案例1:今夜酒店特价

当时我们抓住了最牛逼的华人色情社区——草榴,13年的时候,草榴每天300万UV,4000万PV。当时基本所有做酒店的都打“约炮订酒店”的点,“今夜”也不例外,看草榴的基本都是男生,社区里核心的帖子就是晒约炮贴,背景全是酒店,精品贴的浏览量至少几十万,免费给如家、7天、锦江打了大量免费广告。我们想如果贴子里如果能提到是用”今夜酒店特价“开的房,效果可能不错。然后费尽九牛二虎之力,摸索出一套在草榴里推广的方式,找到了一帮约炮发帖达人,送他们优惠券,他们写的贴子里都会加一句,是通过“今夜”定的房间,很便宜,顶峰时期,10篇精华帖,6篇都是我们的软文。累计不过花了5000元吧,带来了多少用户呢?10万~几分钱一个用户,效果喜人,接着我们想尽办法获得了一批珍贵的草榴邀请码,做了“草榴订酒店”的App,不过可惜没有通过市场审核,后来听说不少投资人都找天卓、Mars要码,俨然把草榴邀请码当成了见面礼。

后来随着“极客公园”的一篇报道,这个推广方式开始被业内知道并效仿,据说都获得了很好的效果!不过广告也开始污染草榴这片净土…

案例2:女性美容社区—美丽神器App

朋友的公司,做女生美容社区,同时对接线下的整形机构,已经获得A轮,发展迅速,行业前三。

初期推广的时候,绞尽脑汁,各种办法都尝试了,借郭美美整容炒作过、创始人吃饭看到美女就发名片介绍App、各类女性社区发广告、甚至差点花钱做电梯广告!

不过总算功夫不负有心人,他们找到了非常适合他们的人群:在夜总会工作的女生,据不完全统计,上海有10万女生在夜总会工作,她们很爱美丽,收入也比较高,随便消费点美白针、玻尿酸等微整形问题不大。他们通过各种办法,摸清了上海夜总会圈子的情况、用尽资源,进入了这些女生的白人微信群,给他们送福利,做活动,接受度很快,获取了上万的用户,而且非常的精准,到线下整形机构消费的转化率很高。

后来就顺利的拿到融资,有了钱之后,开始规模化的投钱在微博粉丝通、微信大号上了、各类应用市场做活动,规模很快起来。

二、主流渠道,创新的形式,短平快

目前国内最主流的营销渠道,非微信莫属,无论微信如何强调我们不能重蹈微博覆辙,都拦不住我们众多“营销狗”魔鬼的步伐,我相信很多国内创业者都跟我有一样的梦想:引爆微信朋友圈。让我们一起回顾一下,我们的朋友圈被哪些内容刷爆过:
1、头像类:头像上加上未读信息数字、换头像的智力游戏、脸萌
2、游戏:2048、围住神经猫
3、各种占卜、抽签:新年签、开学签、单身狗指数、我的单词量、测测颜值
4、点名挑战:微笑挑战、冰桶挑战、晒照片
5、在朋友圈产生话题并互动:无秘的“匿名印象”、疯狂猜词/猜图、支付宝红包接龙
6、秀图:魔漫相机、百度魔图、nice、美图
7、事件性内容内容:伟大的安妮的“对不起,我只过1%的生活”、恶搞成龙的视频“duang”、柴静的《穹顶之下》

还有很多,这些形式都有很多创新,效果极佳,但是持续力不足,为了研究什么样的形式能够引爆朋友圈,我们公司运营的同事特地做了一个“朋友圈刷屏大法”的excel,分析了基本上所有的案例,总结下来,其实就得到了几个关键词:趣味、炫耀、参与感、好玩、跟风,只要你设计一个互动形式,能够很好的满足这5个关键词,那么恭喜你,你有10%的概率引爆朋友圈了。

那么,刷屏的效果到底是什么样呢?

我们有幸做过几次刷屏的事件,其中效果最好的一次就是“单身狗指数测试”,没做任何开发、没有任何设计作图,没花任何一分钱,2个小时做出来的活动,2天带来30万微信粉丝,30万粉丝是什么概念,超过了大部分创业公司运营一年以上微信公众号的粉丝量。为我们后面推广App打下了很好的基础。

三、产品上找到一个点和市场紧密配合

产品和市场,在产品技术驱动的公司初期,我觉得是没法分开的,产品就是市场,市场也是产品,侧重面和指标都不同,但共同的目标是把产品体验做好,形成优秀的口碑和正向循环,形成增长。

听起来很简单,其实要求很高,一般要求团队核心既要懂市场又要懂产品,还要会运营,有很多实战经验。真正做到的很少,一旦做到了,基本也牛逼了。
往往一想到市场,感觉做的事情就是,送钱、转发、抽奖,可是在嘀嘀、快的、饿了么、美团、支付宝这些土豪狂轰滥炸之下,搞的小公司送钱送奖品完全拿不出手,扔进去激不起任何波澜。所以要另辟蹊径,做点动脑子的事情,举两个我觉得特别值得借鉴的例子吧

1、某医生类应用,任务中心、礼品中心做的非常有意思,你注册了医生之后,会通过各种办法激励你来邀请同医院/科室的同事、医学院的校友,帮你定制水晶名片、送你暖心鞋子(实际淘宝上20可以买到,可以标100多)、ceo手写的信、专属定制封面的笔记本,免费手机流量,种种“高大上”且实用的东西,让医生忍不住参加,同时拿到东西后晒到朋友圈、微博,继续带来流量和曝光。获取医生的速度非常快,成本也能控制。

2、图片社交一直不断有人尝试,很多应用风光一阵然后陨落,nice却突飞猛进,气势如虹,同样的标签功能,为啥nice就大红大紫,备受用户喜爱,因为戳中了人们晒朋友圈第一痛点“高逼格”,哪怕是穿着优衣库的上衣、H&M的裤子、凡客帆布鞋这种搭配,都要在图片上把品牌标签戳出来,晒一晒,证明自己品位很年轻。当然了,能看到更多的用户给奢侈品上打标签,因为大部分中国戴奢饰品的很大痛点是别人不认识这个品牌,或是觉得一看就是假的^^,每张晒出来的照片只漏出来很小的一个“nice”的水印,但是瞬间,nice获得了大量用户,套用经纬王华东的一句话,nice+微店已经成为移动电商标配产品和概念!

四、做好客服,尤其抓住关键人物

这点真的非常重要,很实在,很多创始人喜欢去参加行业论坛做各种分享,做panel talk的嘉宾,觉得面子倍儿足。我个人觉得不如把这些时间花在和用户沟通上。

有几个指标来判断创始人是否在乎用户

1、微信里是否有200个以上用户?看看他们的朋友圈,看看他们的生活状态
2、每周是否和超过20个用户有过联系?
3、每周能否请3个用户吃饭?
4、每周能否解决5个用户反馈的问题?各种产品疑问、bug等

例如我有强烈的偷窥欲,所以自己微信里有超过3000个用户,观察他们每天干些啥,为他们提供更好的产品和服务

为什么我说做客服这么重要:

产品早期开始曝光,很多尝鲜者会来看看,早期体验者中一般有意见领袖,他们愿意探索、接受新东西,你和他联系了,主动询问他们的需求,是否遇到什么问题,也许会有意外的收获。

举个例子,我们碰到一个用户,他是西安电子科技大学的社团联合会负责人,听说我们的产品适合社团使用,就尝试了,我一看他发的测试活动,就觉得这个哥们不简单,赶紧联系,帮助他解决了不少疑问,他一个人给我们产品拉了超过100个社团、4000个学生。

类似的例子还有很多,“客服”的意义远不止帮助1个用户解决1个小问题,而是和用户拉近距离,理解用户的痛苦。

如果能够有一个机制让团队和用户打成一片,对公司的意义会很大!之前听说大姨吗的柴可为了体验用户感受,自己带着卫生巾上班,是个很让人敬佩的举动。小米奉行的让工程师每天都在论坛里泡1个小时的规则,将开发人员和用户拉到一起,大大促进了生产力、提升了员工对业务的认可度、凝聚力也变强了!

=======================

说了那么多,最重要的还是去深度理解自己的业务、用户,做有用、有趣的事情,让用户从情感上对你的产品感到认同,愿意推荐更多人来用你的产品,初期都是最难熬的,希望每个创业者都能熬过去,离梦想更近一步。

PHP转义Json里的特殊字符的函数

五月 9th, 2015

在给一个 App 做 API,从服务器端的 MySQL 取出数据,然后生成 JSON。数据中有个字段叫 content,里面保存了文章内容,含有大量 HTML 标签,这个字段在转 json 的时候需要转义,因为有大量的特殊字符会破坏 json 的结构。

比如这么一段 content:

'Lorem ipsum "dolor" sit amet, consectetur \ adipiscing elit.'

则必须要转化为:

Lorem ipsum \"dolor\" sit amet,\nconsectetur \\ adipiscing elit.

那么有哪些字符是需要转义的呢?看下图:
2015_02_01_01

如果 PHP 版本 > 5.2,json_encode 自带转义。如果是旧版本的 PHP 则可以用下面的函数。

# list from www.json.org: (\b backspace, \f formfeed)
public function escapeJsonString($value) {
    $escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c");
    $replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b");
    $result = str_replace($escapers, $replacements, $value);
    return $result;
}

html5之手机js定位

五月 8th, 2015

Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置。基于此特性可以开发基于位置的服务应用。在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用。

Html5获取地理位置信息是通过Geolocation API提供,使用其getCurrentPosition方法,此方法中有三个参数,分别是成功获取到地理位置信息时所执行的回调函数,失败时所执行的回调函数和可选属性配置项。

如下Demo演示了通过Geolocation获取地理位置信息,并在百度地图上显示当前位置(通过调用百度地图API)。实验结果发现位置被定位到了大学城内环东四路入口处,与本人所在位置(华工学生宿舍)偏差还是有点大的,达到200-300米左右。

代码如下所示(其中convertor.js为百度地图提供的坐标转化文件):

<!DOCTYPE html>
<html>
    <head>
        <title>H5地理位置Demo</title>
        <script src="http://api.map.baidu.com/api?v=1.3" type="text/javascript">
        </script>
        <script type="text/javascript" src="convertor.js">
        </script>
    </head>
     <body>
         <div id="map" style="width:600px; height:400px">
         </div>
     </body>
     <script type="text/javascript">
         if (window.navigator.geolocation) {
             var options = {
                 enableHighAccuracy: true,
             };
             window.navigator.geolocation.getCurrentPosition(handleSuccess, handleError, options);
         } else {
             alert("浏览器不支持html5来获取地理位置信息");
         }
         
         function handleSuccess(position){
             // 获取到当前位置经纬度  本例中是chrome浏览器取到的是google地图中的经纬度
             var lng = position.coords.longitude;
             var lat = position.coords.latitude;
             // 调用百度地图api显示
             var map = new BMap.Map("map");
             var ggPoint = new BMap.Point(lng, lat);
             // 将google地图中的经纬度转化为百度地图的经纬度
             BMap.Convertor.translate(ggPoint, 2, function(point){
                 var marker = new BMap.Marker(point);
                 map.addOverlay(marker);
                 map.centerAndZoom(point, 15);
             });
         }
         
         function handleError(error){
         
         }
     </script>
 </html>

convertor.js文件:

(function() { // 闭包
    function load_script(xyUrl, callback) {
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = xyUrl;
        // 借鉴了jQuery的script跨域方法
        script.onload = script.onreadystatechange = function() {
            if ((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
                 callback && callback();
                 // Handle memory leak in IE
                 script.onload = script.onreadystatechange = null;
                 if (head && script.parentNode) {
                     head.removeChild(script);
                 }
             }
         };
         // Use insertBefore instead of appendChild to circumvent an IE6 bug.
         head.insertBefore(script, head.firstChild);
     }
     function translate(point, type, callback) {
         var callbackName = 'cbk_' + Math.round(Math.random() * 10000); // 随机函数名
         var xyUrl = "http://api.map.baidu.com/ag/coord/convert?from=" + type
                 + "&to=4&x=" + point.lng + "&y=" + point.lat
                 + "&callback=BMap.Convertor." + callbackName;
         // 动态创建script标签
         load_script(xyUrl);
         BMap.Convertor[callbackName] = function(xyResult) {
             delete BMap.Convertor[callbackName]; // 调用完需要删除改函数
             var point = new BMap.Point(xyResult.x, xyResult.y);
             callback && callback(point);
         }
     }
 
     window.BMap = window.BMap || {};
     BMap.Convertor = {};
     BMap.Convertor.translate = translate;
 })();

PHP加密文件的手工解密过程

五月 7th, 2015

尝试了网上的大量在线,离线的PHP解密程序,结果效果极其不理想。
无奈,直接研究了一下加密文件的代码,手工破解之。

原始加密文件rc_action.php:
—————————————————————————
rno@BMfdZrbV^Io{gVn9ixT9ixT9ixYs0KgUvj2ahcHL6tPoGYnctu8HGYqokwdodX+bfAn9iVqafspakXdodXabfAn9ixpaiVqaOw39fAqaixpaiVqlgVqafspafAqaiwPbfspaiVqafspakw39fspafspaixpWkw0a2K0+2bzLte3ofeZWkAiIBL/A6ouNtbv1/b2l0LTc22T5JV8XFJWrhH0/3x3EuGgzCVIsB2yyitZg/JY8hy/t9tv4gAHwBA3H3b0dtuWkfVYCfYT3uy/u226GJHyE7JgL6c2j6ezWEjZ4hJIrvKHNv13Y0o0+FGlaifds/xue/sPIONqoOtbWCe6Lhcns6tPbfspaiVqafspaOfZy0jH4Ow39fspafspafspWCa==dpWyvogrvynN6GTrvo3WhjvliwbmwjyjdwPbGYT9uY3hg1Tr0e2NgYAWFaWyFc2LOwgy7ezrdVqP(后续数据省略)
—————————————————————————-
数据看起来很像base64编码,但是直接用base64_decode解码得不到正确结果。
网上的一些解密工具基本无效,(文件无换行)
手工解读一下前面部分的代码,并换行注释之
——————————————————————————-

——————————————————————————-
在前面的PHP代码部分有一个eval。先把它改成echo,保存为1.php看看执行后显示的结果是什麽!
运行方式就直接在终端 # wget http://localhost/1.php -O1.txt ,运行结果如下(加注释):
——————————————————————————–
$O000O0O00=$OOO000O00($OOO0O0O00,’rb’);
//$O000O0O00=fopen(__FILE__,’rb’); //打开文件
$O0O00OO00($O000O0O00,0x48b);
//fread($O000O0O00,1163); //跳过1163字节
$OO00O00O0=$OOO0000O0($OOO00000O(O0O00OO00($O000O0O00,0x17c),’pTwxVHcKdgOki/C9B3tfu2JG76Ehv0FUPzXLbyjolWMD4ZQra8NsAYe1+I5mqnSR=’,’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’));
//$OO00O00O0=base64_decode(strtr(fread($O000O0O00,380),’pTwxVHcKdgOki/C9B3tfu2JG76Ehv0FUPzXLbyjolWMD4ZQra8NsAYe1+I5mqnSR=’,’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’)); //读取380字节,根据代码表替换字符,base64解码
eval($OO00O00O0); //执行解码后的代码
return;
?>
———————————————————————————-
从源文件跳过1163字节截取这380字节,替换进字符串,echo 输出到 2.txt
———————————————————————————–
$OO00O00O0=str_replace(‘__FILE__’,”‘”.$OOO0O0O00.”‘”,$OOO0000O0($OOO00000O(O0O00OO00($O000O0O00,OO00O0000),’pTwxVHcKdgOki/C9B3tfu2JG76Ehv0FUPzXLbyjolWMD4ZQra8NsAYe1+I5mqnSR=’,’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’)));
//OO00O00O0=str_replace(‘__FILE__’,”‘”.$OOO0O0O00.”‘”,base64_decode(strtr(fread($O000O0O00,3552),’pTwxVHcKdgOki/C9B3tfu2JG76Ehv0FUPzXLbyjolWMD4ZQra8NsAYe1+I5mqnSR=’,’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’)));
//读取3552字节,根据代码表替换字符,base64解码,把__FILE__替换为真正的当前文件名

fclose($O000O0O00);
eval($OO00O00O0);
return;
?>
————————————————————————————-
从源文件跳过 1163 + 380 字节,截取 3552字节, 编辑3.php文件
————————————————————————————–
//3.php
> /tmp/command_sender.txt”);
}else if ($_POST[‘home’]){
exec(“echo ‘{‘ >> /tmp/command_sender.txt”);
}else if ($_POST[‘1’]){
exec(“echo 1 >> /tmp/command_sender.txt”);
}else if ($_POST[‘2’]){
exec(“echo 2 >> /tmp/command_sender.txt”);
}else if ($_POST[‘3’]){
exec(“echo 3 >> /tmp/command_sender.txt”);
}else if ($_POST[‘4’]){
exec(“echo 4 >> /tmp/command_sender.txt”);
}else if ($_POST[‘5’]){
exec(“echo 5 >> /tmp/command_sender.txt”);
}else if ($_POST[‘6’]){
exec(“echo 6 >> /tmp/command_sender.txt”);
}else if ($_POST[‘7’]){
exec(“echo 7 >> /tmp/command_sender.txt”);
}else if ($_POST[‘8’]){
exec(“echo 8 >> /tmp/command_sender.txt”);
}else if ($_POST[‘9′]){
exec(“echo 9 >> /tmp/command_sender.txt”);
}else if ($_POST[’16-9’]){
exec(“echo i >> /tmp/command_sender.txt”);
}else if ($_POST[‘0’]){
exec(“echo 0 >> /tmp/command_sender.txt”);
}else if ($_POST[‘return’]){
exec(“echo ‘,’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘up’]){
exec(“echo ‘W’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘left’]){
exec(“echo ‘A’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘enter’]){
exec(“echo ‘ ‘ >> /tmp/command_sender.txt”);
}else if ($_POST[‘right’]){
exec(“echo ‘D’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘down’]){
exec(“echo ‘X’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘setup’]){
exec(“echo ‘/’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘info’]){
exec(“echo ‘}’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘zoom’]){
exec(“echo ‘z’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘play_pause’]){
exec(“echo ‘Z’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘stop’]){
exec(“echo ‘Q’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘pageup’]){
exec(“echo ‘P’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘pagedown’]){
exec(“echo ‘N’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘next’]){
exec(“echo ‘F’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘preview’]){
exec(“echo ‘f’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘vol_up’]){
exec(“echo ‘V’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘vol_down’]){
exec(“echo ‘v’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘tvmode’]){
exec(“echo ‘\’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘audio’]){
exec(“echo ‘a’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘a-b’]){
exec(“echo ‘=’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘repeat’]){
exec(“echo ‘+’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘mute’]){
exec(“echo ‘m’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘subtitle’]){
exec(“echo ‘s’ >> /tmp/command_sender.txt”);
}else if ($_POST[‘select’]){
exec(“echo ‘u’ >> /tmp/command_sender.txt”);
};

——————————————————————–