大头龙仔Blog

A strong man can save himself. A great man can save another.

国庆在家刷个票

| Comments

刷票什么鬼的已经不是一个什么新鲜话题了。放假期间受朋友所托去刷个票,整个过程还是有些东东可以分享的。

一、为什么可以刷票

基于HTTP协议是处于应用层,所以HTTP包是很容易可以构造出来的,也就是说,人通过浏览器去投票发出的HTTP请求包,机器是可以模拟构造出来的。

二、刷票前我们要了解什么

1、投票时是否绑定session

2、投票时是否识别ip

3、投票时是否需要验证码

4、投票时需要提交什么数据到什么目标地址(这里包括是否要带上特定的cookie字段,是否要识别终端等HTTP头信息)

所以,针对不同的投票网站,可能会有不一样的变通方案,但都不会离开上面四点。 这次投票的网站,经过分析,1、2是yes,3是no,不用验证码哦,这个刷票门槛马上低了n个层次,不过发现是识别ip的,一个ip投一票,请空cookie后可以继续投。 一个ip经测试,一般可以投20-30票,如果速度不快的话。

三、来来来,开刷了

感觉没上代码不舒服,先上个代码先

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
include_once('ip.php');

$url     = URL;
$timeout = TIMEOUT;

# USER AGENT哦, 多搞几个是好事
$user_agents = array(
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'
    );

while (1)
{
    # 通过代理API获取IP
    $ret        = file_get_contents(IP);
    $ret        = json_decode($ret, true);
    $proxy_list = $ret['data']['proxy_list'];
    print_r($proxy_list);

    foreach ( $proxy_list as $proxy ) {
A:
        $ua = $user_agents[array_rand($user_agents)];
        $options = " -v
                     -A \"$ua\"
                     -m $timeout
                     -x $proxy
                     -H \"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\"
                     -H \"X-Requested-With: XMLHttpRequest\"
                     -H \"Origin: http://abc.com\"
                     --referer \"http://abc.com/vote.html\"";
        $cmd = "/usr/bin/curl $options -d \"i=xxx\" \"$url\"";
        # 用的是cmd, 用php curl也可以
        $output = exec($cmd);
        echo $cmd;
        echo "\n*******************\n$output\n******************\n";

        $ret = json_decode($output, true);
        print_r($ret);
        if ( $ret['success'] == '1' ) {
            echo $proxy . "\n";
            # 模拟停一秒, 感觉可以停久一些
            sleep(1);
            # 神奇的goto
            goto A;
        }
    }
}
?>

因为是和IP相关的投票,所以只能通过代理了,这里就只能去买代理啦,只用高匿的,因为这样server那边是不知道你是用了代理的,这个请自行google了。 另外curl需要给个user agent,这样就不需显示curl了,更加真实一点,多点user agent随机会比较靠谱。

四、这次刷票遇到的其它问题

1、估计大家都用代理嘛,代理资源可能有很多是重复的,你会发现很多取回来的代理已经不能投票了(别人已经用这个代理投过票,并且该代理IP已入黑名单), 或者说投一到两票就不能投了,所以这样刷票是有点不稳定的,如果有一手的代理资源这个问题就可以解决。

2、大家都在刷,大家都在抢占资源,所以我们可以多开些进程去刷,这里要考虑代理获取IP的API调用频率限制问题了,太快的也是不行的。

3、代理也分布在不同网络,电信、移动、网通、铁通之类,所以刷票机在多个网络会更好一些。

4、刷票的时间最好和人正常的作息时间对应,也就是说要更智能一点,更像人在投票一点。

5、因为朋友说不想名次太高,所以我另外也写了一个程序来判定是否在前几名之外,如果不在前几名,就开始刷。这些边边角角的代码就不好意思贴出来了,写得比较快,所以比较粗烂……

五、如果有验证怎么办

这个比较恶心,因为验证码要涉及图形识别,不同图形验证码的识别率也不一样,这一块我没有深入研究过,但知道Tesseract Open Source OCR Engine可以通过不断学习来提高图形验证码的识别率。当然也可以自己写识别算法来处理,图形学是博大精深,小弟只懂个皮毛,不过有时间还是想试试这个东东。

刷票软件什么的也很厉害,以前好像有用过,大家都可以找找看吧。我这里只是分享其中一种方法与思路,应该算是刷票的基本功吧,因为软件什么的也是基于这个思路来写的,不过功能更多强大和自动化而已。

话说刷票不便, 这种无验证码的淘宝也要四毛一票呢,我这帮朋友刷了4w多票,Just a joke : )

EOF

Less Is Less

| Comments

想了很久,很不情愿地用了这个标题。

这一年里,无论从个人情感上、心理上还是行动上,都发生了巨大的变化,甚至可以说是有生以来最大的一次巨变: 放弃公办教师来到腾讯CDC,与家庭磨合分隔两地的工作生活, 从小影响着我并深爱着我的老爸中风半身偏瘫,一下子打破了家里平静小幸福的生活状态, 妈妈全职照顾老爸,爱人辞职带小孩,也突然感觉得生活艰难了好几分。 没有把这事情诉说给什么人去听,因为除非对方的家庭也有相似的经历,否则根本没有办法理解的。

偶尔静下心来想想,真的说不出这一年来,我真正收获了什么东西。 可能收获的都是无形的,我看不到,但有这样的感觉,我就会觉得是件很恐怖的事情。 在一个设计师的团队里做一名死开发,感觉这就是我的现状,同时感觉内部这样的开发环境和氛围,对于专业的提升真的是非常有限,可能是因为一定程度的封闭。 然后,需求淹满了一些想法,直到变成让自己都讨厌的习惯。 而我也努力在寻找某种提升的方法与动力,抑或是针对我个人,抑或是“团队”。

一年前的改变,然后发现自己在某些东西上依旧没什么变化,甚至渐行渐远,在这样的压力下并不是一件好事。

可是这就是生活,这就是现实,收拾一下心情,不在沉默中死亡,就是沉默中爆发。

我离开了,其实我回来了

| Comments

今晚下起了一场大雨,仿佛带着点不必要的伤感似的。 是的,我下星期就要离开我待了四年,充满了回忆的,美丽的西溪小学,是的,我选择离开东莞,再次回到深圳,是的,就为了那依然年轻的那一丝追求,还有那谁都不能定义的未来。 这是思考了将近一年时间的决定,很艰难的抉择,毕竟我已经成家了,家庭因素是首要考虑的。 这里首先要感谢小静,她总是能理解我的想法,支持我的决定,虽然的确是很纠结。BBin说得对的,如果能努力找到一个工作与家庭的平衡点,也未尝不可是一个选择方案,因为男孩子早晚都要肩负起应有的东西。 虽然我知道,你舍不得,我也舍不得,长辈朋友们都舍不得。就如同我老友说的:什么都不能舍弃的人,就无法带来任何改变——《进击的巨人》

在学校这四年时间,我学到了很多珍贵的东西,多少的人和事都历历在目,甚至咋一想,就能想起某人的嘻哈大笑。Bird说我四年最大的收获是结婚生子,我去,好像这也对。而我遇到了前卫的校长,开始接触苹果的产品,直到我遇上MacBook才发现这才是程序员用的神器,再到在学校搞起了Rails,还有很多很多……还记得当时到学校时没有办法室,我就整天在机房里编程,用PHP花了一个月左右的时间做了一个数字化平台的雏形出来,还记得那时在RTX上介绍自己:大家好,我叫刘楚龙,毕业于华南师范大学软件工程,酷爱街舞……我相信这些历练,会使得我与众不同,感谢这些日子。

下面这段话是我老师说的,我完整的摘录下来: “人的一生是漫长的,我们总在不停遇见与离别之间徘徊、反复。很荣幸地遇见,彼此相识、熟悉、牵挂、思念,到了最后,随着时光的推移,来了,又去了;留下了,又走了;然而,我们要懂得珍惜每一次的遇见,珍惜所有踏过的足迹。 某一些事,某一些人,在我们的心里形成瞬间成永恒的影映,我们会因此哭或笑,然后就那般安静下来,一颗心恬然自得。人生就是这样一场又一场的际遇,只是多么希望我们都能够在这场际遇里,收获自己内心最渴望的那一缕情愫,满足自己的需求。 坚定、坚强、执著、淡然、随缘,无论我们的生命里那些曾心心相惜的人来与不来,在与不在,愿我们都能够站成优雅的姿态,守护在自己的心灵后花园里,不离不弃、不远不近、默然相守、寂静欢喜。 ”

是的,我离开了,不代表我不感恩,也不代表我不尊敬您,感谢你和你们对我的包容与鼓励,真的。

2010年,HBin说不如你不要走吧,那时我坚决地走了;2014年,感谢他给我带来的机会。 我清晰地记得那晚你对我说的话:当年你在深圳,我去面试时,你请我吃沙县,你要走时,我叫你不要走,而现在你又想回来,你不需要感谢我。这些东西可能是一个轮回,就像一个婴儿出生时,婴儿在哭,我们都在喜悦地欢笑,当你慢慢老去,在某一天,你周围的人在伤心地哭了,而你可能是很安详地开心地走了。

感谢每一位小伙伴,这里就不一一点名了,谨此纪念!

Rails无痛ElasticSearch

| Comments

最近因为需要,在项目里加入ElasticSearch,总结一下这个无痛教程。

1、 安装elasticsearch-rtf

这是个好东西,已经集成常用的插件(不要忘记要装个JDK,不然ElasticSearch就启动不了),安装完成后就启动这个东东。 如果你想加到系统启动,就要看看bin/service/elasticsearch的命令说明。

2、在Rails项目中加入elasticsearch-rails

Gemfile加入:

1
2
gem 'elasticsearch-model'
gem 'elasticsearch-rails'

bundle

3、建立查找索引

这里我有个Post的Model(有几千条记录),有个title的字段,现在我需要ElasticSearch为title字段建立索引,以便查找:

1
2
3
4
5
6
7
8
class Post < ActiveRecord::Base
  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  mapping dynamic: false do
    indexes :title
  end
end

Import数据,我用的是官方的Rake Tasks,以Post为例就是这样子:

1
rake environment elasticsearch:import:model CLASS='Post' FORCE=y

如果在Production环境:

1
RAILS_ENV=production rake environment elasticsearch:import:model CLASS='Post' FORCE=y

而新加入的数据就会有Callback调用加入索引,这就不用我们操心了。

4、中文分词

elasticsearch-rtf里的elasticsearch.yml文件默认是用keyword的,按照我的理解是,需要全部匹配。 例如有个title叫abc,如果你用a来搜是搜不出来的。所以这里我会改为mmseg,这样就会自动帮我们分词了。(记得重启ElasticSearch)

5、测试

Post.search('blabla')来试试看: )

6、最后

这只是一个无痛的最最基本的能让ElasticSearch加入到我们Rails项目中的指导,ElasticSearch还有好多好牛的东西(我暂时也没有这个需要),请移动到guide。例如你可能需要为搜索后的结果进行一定的排序之类。

EOF

Octopress從GitHub迁移到GitCafe

| Comments

由于某些原因(大家都懂的),Blog放到GitBub上的速度实在不给力,前段时间知道GitCafe支持GitCafe-Pages后,就把Blog迁到GitCafe,速度杠杠的。 下面就说说把Octopress Blog发布到GitCafe的过程吧。

下载安装Octopress(参考官方Documention)

写Blog

我自己的做法是,新建个叫source的branch,然后在这个branch上写blog,master分支不要动,以后更新了master后,就可以在source下git rebase master来更新source分支了

Deploy

因为Octopress的rake deploy命令是针对GitHub的,所以这里需要对Rakefile开刀了

因为需要把rake generate后的文件都推送到GitCafe上的gitcafe-pages分支,所以这里先来设定生成静态文件的目录和推送的分支 查看代码

我的octopress目录里有三个git分支: master, source和gitcafe-pages,每次rake deploy后,source保存的是源文件,gitcafe-pages保存的是生成网站静态文件,这两个分支都会推到GitCafe的服务器上。 查看代码

自定义域名绑定

请参考GitCafe Pages服务现支持自定义域名绑定

EOF