iptables学习笔记

标签(空格分隔): 笔记 —

  1. 什么是iptables?iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter
    项目的一部分。术语 iptables 也经常代指该内核级防火墙。
  2. iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4
    数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表
    的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。
  3. 显示当前规则–iptables -nvL
  4. 重置规则, ```

    iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -t raw -F

    iptables -t raw -X iptables -t security -F iptables -t security -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT

    iptables -P OUTPUT ACCEPT

    ``` -F刷新表,-x删除表

  5. 阻止来自同一ip的链接,iptables -A INPUT -s 10.10.10.10 -j DROP

  6. 阻止来自一组ip地址的链接, iptables -A INPUT -s 10.10.10.0/24 -j DROP
  7. iptables后跟参数的解释。-p proto,后跟协议名称。-A
    append,后跟链名称。-J jump。-m 匹配。-I
    insert,注意-A是加到一条链的尾部,-I是强行插入到一条链的头部。
  8. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT,接收任何已建立端口的包
  9. iptables使用规则。所有链名必须大写,INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING。所有表名必须小写,filter/nat/mangle。所有动作必须大写,ACCEPT/DROP/SNAT/DNAT/MASQUERADE。所有匹配必须小写,-s/-d/-m
    /-p。
  10. -s为除某某地址以外的所有地址,-s
    192.168/16,就是除内往外的所有地址。
  11. 几个表的详细解释,一般默认是filter表。
  12. 参数的详细解释。

termux初步折腾

标签(空格分隔): 折腾


最近阿里云卡得我鬼火起,差点一时冲动买了小主机。突然想起安卓上的termux,据说linux大部分的特性都有了
。于是就有了此文。
首先不特别建议使用清华源,一个是我教育网内每次apt update容易走ipv6,然后无论装什么都是unable locate,直接用官方源就好了。
首先就是折腾ssh,因为termux不支持用户登陆,所以只能用密钥登陆。首先apt install openssh安装ssh服务端,接着用ssh-keygen生成密钥,我是一路enter所以产生的id_rsa.pub在/data/data/com.termux/files/home下面。直接用es文件浏览器考到sd卡根目录,拖到电脑上。用putty-keygen,选择“载入”,选择所有文件,然后选择id_ras,生成.ppk文件。以后登陆选上这个就好了。p.s:登陆时无须输入用户名
然后是折腾oh-my-zsh。首先先把curl、git等基础软件安装上。参考这个,除了修改source.list部分,其他一步步执行就好了。
同时推荐一下tmux,用好了实在太爽,反正占用的资源也不多,建议安装上去。我一边用tmux两分屏,然后上屏写django,下屏显示服务器状态,不要太爽。tmux的配置文件我用是tony/tmux-config,可惜不能用鼠标选择pane。
oh-my-zsh最大的爽点就是各种插件和主题啊,我现在暂时用着dst主题。直接vim $HOME/.zshrc然后搜索theme修改为dst就好了。按照为什么说 zsh 是 shell 中的极品这篇文章配置好自动补全和高亮的插件,source完然后重启就好了。最后还是转投了fish,因为有时候zsh的速度实在太慢,而同时fish却还能接受。不过需要注意的一点是,因为fish不兼容bash,所以需要给vim配置文件设置指定的执行终端。
最后折腾vim,首先执行$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim。重要的一点是使用$HOME而非root,后面vimrc的配置文件也这么改就好了。最后贴上我的vim配置文件。

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
set fileencodings=ucs-bom,utf-8,latin1
endif
set nocompatible
filetype off
set rtp+=bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
map <F5> I// <ESC>
map <F11> ^xx
set ts=4
set autoindent
set smartindent
set showmatch
set expandtab
set nu!
set nocompatible " Use Vim defaults (much better!)
set bs=indent,eol,start " allow backspacing over everything in insert mode
"set ai " always set autoindenting on
"set backup " keep a backup file
set viminfo='20,\"50 " read/write a .viminfo file, don't store more
" than 50 lines of registers
set history=50 " keep 50 lines of command line history
set ruler " show the cursor position all the time
" Only do this part when compiled with support for autocommands
if has("autocmd")
augroup redhat
autocmd!
" In text files, always limit the width of text to 78 characters
" autocmd BufRead *.txt set tw=78
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
" don't write swapfile on most commonly used directories for NFS mounts or USB sticks
autocmd BufNewFile,BufReadPre /media/*,/run/media/*,/mnt/* set directory=~/tmp,/var/tmp,/tmp
" start with spec file template
autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec
augroup END
endif
if has("cscope") && filereadable("/usr/bin/cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add $PWD/cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
" Switch syntax highlighting on, when the terminal has colors
" Also switch on highlighting the last used search pattern.
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
filetype plugin on
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
" Don't wake up system with blinking cursor:
" http://www.linuxpowertop.org/known.php
let &guicursor = &guicursor . ",a:blinkon0"
Plugin 'wakatime/vim-wakatime'
Bundle 'Shougo/vimproc'
Bundle 'Shougo/unite.vim'
Bundle 'm2mdas/phpcomplete-extended'

基本是从centos的配置改过来的,记得装vunlde

神箭手云爬虫初体验

标签(空格分隔): 爬虫


在一起实习的朋友推荐下尝试了一下神箭手云爬虫,感觉相当不错。首先自带函数虽然简陋,但是对于爬虫而言也算够用。导出excel功能对于我而言算是体贴。最最良心的是自带代理而且是可更换的,这个用爬虫的人都知道是多么良心了吧。
我用神箭手写了一个reddit的Asiancult标签的美女图爬虫,原理虽然简单,但是也跳了一些小坑。与大家分享,希望大家不要重蹈我的覆辙。
照例先贴代码。

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
var configs = {
enableProxy: true,
domains: ["www.reddit.com"],
scanUrls: ['https://www.reddit.com/r/AsianCuties/'],
contentUrlRegexes: ["https://www\\.reddit\\.com/r/AsianCuties/.*?"],
helperUrlRegexes: [""], //可留空
fields: [
{
// 第一个抽取项
name: "title",
selector: "//a[@class='title may-blank outbound']/@href", //默认使用XPath
required: true, //是否不能为空
repeated: true
}
]
};
configs.beforeCrawl = function(site) {
site.addHeader("Referer", "https://www.reddit.com/r/AsianCutiesl");
};
configs.afterDownloadPage = function(page, site) {
var regex = /count=[0-9]{1,4}&amp;after=t3_[0-9a-zA-Z]{1,8}/g;
var urls = [];
var content = page.raw ;
urls = 'https://www.reddit.com/r/AsianCuties/?'+content.match(regex);
site.addUrl(urls);
console.log(urls);
return page;
};
configs.onChangeProxy = function(site) {
site.addHeader("Referer", "https://www.reddit.com/r/")
};
var crawler = new Crawler(configs);
crawler.start();

其实代码结构还是比较简单的。就说下我碰到的几个坑吧。

  1. contentUrlRegexes是抓取的内容也,这个正则一定要写对啊,我一开始就是没写对,搞到网页下载下来就是不做解析。
  2. afterDownloadPage。如果你也是和我一样,下一条网址是需要通过解析页面来获取的,那么请务必使用这个函数。我使用onProcessScanPage并没有生效,还有一个就是一定要return page而不是return false,因为这里返回的内容是交给爬虫来提取你要抓取的内容的。

总得来说reddit的抓取还是相对简单的,没有做到什么比较惊艳的东西。

爬虫新玩法——通过队列来提高爬虫性能

标签(空格分隔): 爬虫


事情的起因是亚马逊鞋品的新年优惠,其实这种所谓的优惠往往力度不大,然而再小的羊毛也是羊毛不是。因为商品太多,而且显示的还是优惠前的价格,所以人肉挑实在是太辛苦了,于是乎万能的py就必须启动了。

还是按照以往那样来进行需求分析:
1.获取优惠商品栏目下所有商品的超链接
2.获取这些商品的折后价格、星级还有热销排行榜,自己分别对其设置权数,算出一个综合评分。

,我们需要提取的商品链接的值是类似。class=’a-size-small a-color-secondary’下的,用bs4处理就好了,打开后的网页处理方法在之前的文章也提到过,在这里就不提了。这次最主要的是对爬虫的性能进行优化。

之前做过一个D版帖子的爬虫,也是这种先获取列表再打开类型的。一开始我采用的是非常单一的,获取完所有帖子的超链接然后再打开。唯一的优化就是采用多核心。这样做的缺点非常明显就是一单获取过程出错,后面对超链接包含内容的分析也无法进行。

其实最理想的处理方法就是每抓取一个超链接就分析一个超链接,百度之,发现这就是所谓的消费者生产者模型,用py现成的queue模块就能搞定。其实只要知道queue.put()是往队头插入一个元素,queue.get()是读取队尾元素并删除就好了。这样我们只要把获取超链接写成一个方法并存在队列里,对超链接的读取写成另一个方法,同时读取队列就好了。

[搞个大新闻!]——ndsl电池改造

标签(空格分隔): 电子


好久没更新博客,所以就顺手做个大死,去掉ndsl的gba插槽然后塞进去一个bl5c,虽然存在电池互冲问题,但是容量也差不多能够增加百分之八十。

大概步骤:

  1. 拆机清灰顺便换下导电胶
  2. 拆gba槽并且打磨后盖
  3. 并联不了bl5c与正负极
  4. 测试

需要工具:

  1. 拆机套件
  2. 电烙铁、焊锡、松香、漆包线(可以随便找条usb线去拆)等焊接工具
  3. 虎嘴钳、万用表
  4. bl5c、海绵垫子(用来做绝缘和电池减震)、绝缘胶布、双面导电的金属铜箔(用来增大触点面积)
  5. 如果金钱富余建议买套备用壳,防止手贱拆坏了。

拆机的话需要注意的不多,先取出所有卡,把D面所有螺丝全部卸完以后(主板上貌似还有固定螺丝),用手顶一下下屏主板就能出来了,注意别动着排线了。注意别把音量和开关机键给搞丢了,这是可以顺路把导电胶给换了(参见NDSL导电胶更换)。
然后就是卸gba槽,因为我没有热风枪,有了也不会用,就直接用虎嘴钳来暴力拆解吧还有务必把槽上的金属片也卸掉。
此处输入图片的描述
先对中间用力,再对边上用力。注意别把主板弄坏了。最好能打磨一下D面对应gba槽的位置,为电池留够足够空间(防止焊点太大什么的)。
此处输入图片的描述
接下来是对电池的改造,如果你的bl5c的金属触点没有和它的塑料边缘齐平,请务必先打磨一下。这样贴铜箔的时候能保证接触足够充分。同时在铜箔上焊好漆包线,这些事情相对简单就不重复了。
此处输入图片的描述
然后就是飞线到主板上的触点啦,首先确定你的漆包线和电池的连通性没问题,然后对电池做好绝缘处理,包一圈绝缘胶布。焊接的时候请务必在触点周围垫圈硬卡纸(一开始我用塑料片,熔点太低了,效果不好)。能防止我这一类的新手把焊锡滴到主板上。这一步完成后,再测试下触点两端是否为3.7v。
测试是否成功有个简单的方法,当你并联好电池和触点后,可以插充电器充电,如果一直是红灯就说明成功了。这样之后就可以还原机器啦。顺便修一下完工图。
此处输入图片的描述
此处输入图片的描述

油猴子脚本——豆瓣读书的图书馆插件(1)

标签(空格分隔): 爬虫


上学期就有的想法,昨天因为不想自己闲下来所以开始动手继续折腾。到今天位置也算做好大部分的内容了。也算是对假期学习php+js的一个总结吧。

需要的技术:

  1. 油猴子脚本api——GM_xmlhttprequest(超好用!);
  2. xpath还有正则表达式(开启了新世界的大门啊喂!);
  3. xpathhelper(强大的chrome插件,以后做爬虫再也不用第三方的模块啦!);

简单的流程:

  1. 获取豆瓣书籍名字;
  2. 提交到我的vps;
  3. 由我的vps向海事大学图书馆查询端口提交请求;
  4. 分析返回的请求再返回给脚本;
  5. 显示出来;

差不多也就那么多事了,可以开始写代码了。

1
2
3
4
5
6
7
8
9
10
// ==UserScript==
// @name 豆瓣读书海事大学图书馆插件
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 一个用来在豆瓣读书页面显示大连海事大学图书馆相关藏书地以及借书号的脚本
// @author weakiwi
// @match https://book.douban.com/subject/*
// @grant none
// @grant GM_xmlhttpRequest
// ==/UserScript==

首先看油猴子脚本开头的注释快,名称、作者、更新地址什么的都是一目了然。需要关心的是@grant还有@match前者是用来包含油猴子提供给你的内部函数的,后者是用来指定在那些页面下生效的。我需要在豆瓣读书下生效,所以对应的是https://book.douban.com/subject/*注意通配符。获取书籍名称非常容易,一行代码能够搞定,var keyword1 = title.replace( '(豆瓣)', '' ).trim();

接下来使用gm_xmlhttprequest模块构造get请求,提交书籍名称到我的vps。可以参考greasepot的wiki,不难写出代码,注意提交完成后的执行内容得写在onload里面。代码如下:
function newztflh(book_name, book_location, book_ztflh) {
this.book_name = book_name;
this.book_location = book_location;
this.book_ztflh = book_ztflh;
}
var ztflh = new newztflh(‘’,’’,’’);
GM_xmlhttpRequest({
method: “GET”,
url: “”+keyword1,//请求的url
synchronous : false,//是否为异步请求
onload: function(response) {
var obj = JSON.parse(response.responseText);
if (obj.book_name == null) {
ztflh.book_name = “找不到该书籍”;//抛出异常
}
else{
ztflh.book_name = obj.book_name;
ztflh.book_location = obj.book_location;
ztflh.book_ztflh = obj.book_ztflh;
}
switch(location.host){//构造页面显示
case “movie.douban.com”:
appendLinks(Movie_links, link)

                link.append('<br>')
                    .append('<span class="pl">字幕链接:</span>')
                    .append(
                        $("<a>").attr({
                            href: "http://shooter.cn/search/" + movieTitle,
                            target: "_blank"
                        }).html("Shooter")
                    );

                break;
            case "book.douban.com":
                appendLinks(Book_links, link)                    
                link.append('<br>')
                    .append('<span class="pl">图书馆信息 :</span>'+ztflh.book_name+' '+ztflh.book_location+' '+ztflh.book_ztflh+' '+'<br/>')
                break;
        }

        $('#info').append(link);
    }
});    

接下来是后端的内容,因为还不会用php的模块,所以直接用xpath来对页面进行解析。这里推荐xpathhelper,只需按下ctrl+shift+x再按下shift把鼠标移动到哪就可以显示对应的xpath,不过需要注意生成的是从根标签开始的,如果太长可以直接用”/“来代替。

最后是返回json数据(主要是看到v2ex上有人吐槽为何后端不能返回json数据,所以良好习惯从现在开始吧。我这数据量不大,老老实实组成数组,然后再用json_encode转换就好了。注意因为出现中文所以需要在开始加header("Content-Type: text/html;charset=utf-8");//防止出现乱码
还有json_encode需要多一个参数cho json_encode($arr, JSON_UNESCAPED_UNICODE);

js上再用json.parse取出就好了,实在方便的一匹啊。
此处输入图片的描述

todolist:

  1. 返回的json增加错误代码(主要是图书馆最近在维护,希望能在后端直接判断出来)
  2. 生成的书籍信息更加好看一些(要是能像广州十校图书馆那样就好了)

如何解决php跑大循环时候的内存耗尽问题

标签(空格分隔): 爬虫


最近认识到了php在和xpath以及mysql配合的方便性后,迫不及待地想找东西来练手。于是乎就盯上了超级玩家,而后更是惊喜地发现,该站没有做爬虫限制(连UA限制都没做),url又是非常的规律,于是就迫不及待地动手啦。

首先还是按惯例用chrome的xpath helper插件来对网页上的dom元素进行分析。

可以很快就得到对应的xpath路径,然后构造sql语句。然而这些都不是今天的重点(因为并不难啊)。
今天的重点是解决php的内存耗尽问题。

当用php跑一个大循环而且每次循环都会对数据库进行查询或者插入时,php就很容易内存耗尽。像最初的脚本,五十万的循环我仅仅是跑到三千多就停止了。至于问题是为何产生的,可以参考PHP的内存限制 Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in以及PHP大量数据循环时内存耗尽问题的解决方案

也就是说只要你每次查询都用ubuffered还有在php脚本一开始就加上ini_set("memory_limit","521M");就好了。然而我的脚本最后还是内存耗尽了,在百度一番后才知道是我的变量使用习惯不好。于是乎我在每次循环结束都用unset函数把变量全部释放感觉,最终这个五十万的大循环终于完完整地跑完了。其实想要进一步优化还有几个办法,比方说把整个循环拆分成若干个部分,每个部分结束就mysql_close()一下。又或者不要用老化的mysql模块。用新的mysqli也可能对性能有所提升

4300的一些折腾

标签(空格分隔): openwrt


因为老豆那也要买一个路由器,在我的蛊惑之下,母亲大人终于拨款给家里换了一台网件4300。入手的原因是128m闪存、5gwifi、450m+300m、明月固件的支持。最后一项极大降低了折腾成本,最蛋疼的是usb竟然是1.1的,慢的让人差异。不过因为2楼的电源插座已经满了,再加上家里所谓的智能电视也不支持samba,所以最后可能还是得上树莓派。

todo list:
1.修改功率和信道,尽可能地保证全家wifi覆盖并全速上网(家里那台服役了三年的普联空心信号的情况很严重)
2.6in4隧道地搭建
3.去广告
4.dns本地缓存
5.单线多拨

1.第一项较为简单,直接在无线设定里面修改信道为13,功率改到最大就好了
此处输入图片的描述
2.第二个主要的问题在于拨号获取的ip地址都是的动态的,而6in4隧道一般要求是静态的。还好openwrt本身支持he.net隧道的动态更新。可以参见【低级骗分】基于OpenWRT的6in4隧道架设研究。注意opkg安装软件之前得先把源换成国内的然后执行一遍opkg update,防止出现一些莫名其妙的错误

3.去广告我用adbyby。安装方法官网讲得非常详细了,不过最后用下来感觉效果不是特别明显,但是有胜于无不是。

4.在网上找了说是可以用pdnsd,我直接勾了开启就没有管了,以后深入研究。

5.下面是重头戏,单线多拨。如果条件允许,你可以现在多台电脑上试一下能不能同时登一个账号而不掉线。如果不行直接创建虚拟网口来测试。
此处输入图片的描述
我一开始是创建了四个网口,创建完了切换到接口,设置pppoe拨号,输入自己的宽带账号密码,几个wan口都是如此设置。
此处输入图片的描述
设置好了回到接口主界面,几个接口都点连接,看最后能有几个能拨上就是能几拨了。(某些运营商可能需要并发拨号才能成功,然而博主是直接双拨成功,相法使用并发不成功,所以需要并发的筒子们请自行折腾了)
多拨成功后别忘了勾选multiwan,确保能够叠加网速
此处输入图片的描述

最后,依旧是秀一波成果。20m叠加为40m,而且上行也有增加。
此处输入图片的描述

pyFifaolScrpit

python

用py写的fifaol3辅助脚本(2)

标签(空格分隔): python


快要期末考了,所以填完这个坑以后也就扎银卡卸载游戏弃坑了。还有很多乱七八糟的坑要填啊。
这次主要介绍:

  1. 应用pyhook获取鼠标坐标,做一个鼠标版的按键精灵
  2. 应用pyetesser来做ocr,实现当前拥有ep的检测

经常上不了sourceforge,所以pyhook的帮助文档真是坑杀我也。需要注意的就是pyhook是用钩子的形式来获取键盘输入的,而鼠标模拟点击也同样是运用钩子的形式来进行的。虽然不是特别理解这钩子到底是什么,但是总之监听和模拟是不能同时进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def onWheel(event):
global hm
nl = []
if event.Wheel == -1:
hm.UnhookMouse()
print 'stop recording...'
print 'after 5 sec it will start...'
for i in [5,4,3,2,1]:
print i
time.sleep(1)
while True:
for (x,y) in mouseposition:
mouse_click(x,y)
time.sleep(distance)
print 'HIT!'
pressHoldRelease('enter')
print 'ENTER!'
time.sleep(0.2)
pressHoldRelease('enter')
print 'ENTER!'
if EXIT:
sys.exit()
return True

需要注意的就是其中的

true```也是绝对必要的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
处理完这个小问题,我就来谈谈我大概的解决思路啦——每次点击鼠标左键,就给两个全局变量添加参数,其中一个是当前鼠标的坐标,另一个则是```time.time()```后者是用来计算鼠标点击的时间间隔的,然后当鼠标中键往后滚动的时候脱钩,处理得到时间间隔,开始模拟点击。需要注意的是,按下鼠标左键以及中键对应的子类分别是```MouseLfetDown```以及```MouseWheel```具体的实现代码可以看[我的github][1]。
还有就是ocr咯,我用的是pytesser。无他,不需要编译,不需要pip,使用起来方便(反正都是对付近似印刷体的纯数字,难度较低)。
有了pytesser其他就都是小事了,直接调用就好了。贴下我的图片二值化代码以及提取纯数字的代码。
```python
#二值化
def imgConvert(file):
im = Image.open(file)
im = im.convert("I")
im2 = Image.new("P",im.size,255)
for x in range(im.size[1]):
for y in range(im.size[0]):
pix = im.getpixel((y,x))
if pix>50 and pix<170: #这个区间是主要字体的颜色,可以通过qq截图获得
im2.putpixel((y,x),0)
im = im2
return im

#提取数字
def OnlyNum(s):
    s = s.lower()#去空格
    format = '1234567890'
    for c in s:
        if not c in format:
            s = s.replace(c,'')

最后照例秀下成果
此处输入图片的描述

fifaolPyscript

python

#用py写的fifaol3辅助脚本(1)
标签(空格分隔): python


最近有些沉迷于fifaol3这网游啊,自己也不是那么极客的人,只不过之前做的东西用处都不大,这次得做些用处大的东西来更新我的博客。

##目标

  1. fifaol3截卡器,在转会市场,总是有一些卡,虽然明明存量很大,可是每次购买就是提示“该球员已售出”。这就是截卡器的功劳了。因此打算用python实现自动检测球员,自动购买球员,最好还能考虑价格问题。
  2. fifaol3经理人脚本,其实自从出了fifaol3m,就不用刷经理人了,但是我倒霉的手机玩不了,再说也得主动多造轮子提升自己吗。需要的是自动点击按钮还有就是根据情况按下esc,跳过回放入场等。

##需要用到的工具

  1. pywin32,这个不用说啦,用来获取窗口以及模拟鼠标和键盘事件
  2. PIL,用来识别屏幕上的变化分析当前情况(是否有+1卡,是否在播放回放等等)
  3. spy++,用来获取窗口句柄和类
  4. windows自带画图,用来测量坐标。
  5. qq截图,用来截图还有就是测量rgb值。

##截卡器具体分析
其实就是不断重复买球员这个操作,这样怎么都能买得到,把操作间隔该低了就可以和一般用户抢卡啦。
首先为了方便测试,我们需要把fifaol调整为非全屏以及第分辨率,这样才能方便我切换窗口。
然后就是对购买球员的操作进行分析:
1.首先是切换窗口到fifaol3。
2.点击搜索球员——选中球员——点击购买——回车购买———回车确认。这里需要注意的就是能不用鼠标完成的操作(比如最后两步可以用回车键代替),尽量别用鼠标完成(因为鼠标需要各种测量,实在太辛苦)。如下图:
此处输入图片的描述

pywhin32在网上的资料还是很多的,直接找来就好了。直接贴下主程序的代码:

if __name__ == '__main__':
    game_hwnd = win32gui.FindWindow('FIFANG','FIFA ONLINE3 - Developed by SPEARHEAD')#fifaol3的窗口类和标题
    win32gui.ShowWindow(game_hwnd, win32con.SW_RESTORE)#窗口提前
    win32gui.SetForegroundWindow(game_hwnd)
    game_rect = win32gui.GetWindowRect(game_hwnd)#获取窗口的坐标,对应的是左上角坐标和右下角坐标
    for i in range(5):#暂停五秒,方便用户把鼠标移动到搜索球员上
        print i
        time.sleep(1)
    user_x,user_y = get_mouse_point()#获取鼠标坐标
    time.sleep(0.1)
    moveAndclick(user_x, user_y)#点击搜索球员(
    time.sleep(1)
    while(1):
            time.sleep(0.5)
            moveAndclick(game_rect[0]+579, game_rect[1]+226)#选中第一个球员
            time.sleep(0.5)
            moveAndclick(game_rect[0]+717, game_rect[1]+572)#点击购买
            time.sleep(0.5)
            pressHoldRelease('enter')#回车确认购买
            time.sleep(1)
            pressHoldRelease('enter')#回车确认
            time.sleep(0.5)
            moveAndclick(user_x, user_y)#点击搜索球员
            time.sleep(3)

缺点:

  1. 没有价格识别,就是一个劲地买(一开始想截取+1图像作为区别,结果像素点太少,无论是rgb比较还是汉明距离相似度都特别高,估计只能读取内存了)
  2. 有时候fifaol会突然闪退回桌面,该脚本做不到再把窗口切换回去
  3. 操作间隔太小了fifaol会卡死。
  4. 不能检测延迟,只能靠不断重复来弥补。

最后按照管理秀下成果吧!
此处输入图片的描述