能否通过安卓编程识别其他程序内java图像识别程序,然后自动触摸屏幕。举例来说,微信小游戏跳一跳,我想编个程序,

&figure&&img src=&https://pic3.zhimg.com/v2-e32c1b6febff2_b.jpg& data-rawwidth=&1071& data-rawheight=&705& class=&origin_image zh-lightbox-thumb& width=&1071& data-original=&https://pic3.zhimg.com/v2-e32c1b6febff2_r.jpg&&&/figure&&p&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9243771cdad22bab2dc4540_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1920& data-rawheight=&500& data-thumbnail=&https://pic1.zhimg.com/v2-9243771cdad22bab2dc4540_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&https://pic1.zhimg.com/v2-9243771cdad22bab2dc4540_r.jpg&&&/figure&&p&最近“跳一跳”的游戏风靡朋友圈,我司CTO &a class=&member_mention& href=&http://www.zhihu.com/people/e9e244dcf18a3cd6e5d5c& data-hash=&e9e244dcf18a3cd6e5d5c& data-hovercard=&p$b$e9e244dcf18a3cd6e5d5c&&@Albert Jiang&/a& 默默跳出了8000+分,在“正常人玩到这个分段是有多无聊”的一(feng)片(kuang)群(ji)嘲(du)中,CTO童鞋甩出算法链接,光速打脸并终结了对话:&a href=&http://link.zhihu.com/?target=https%3A//www.kesci.com/apps/home/project/5a47c8ba25c4d4/code& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&kesci.com/apps/home/pro&/span&&span class=&invisible&&ject/5a47c8ba25c4d4/code&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&感兴趣的童鞋可在K - Lab在线数据分析协作平台中一键Fork代码,下一个排行榜霸王花可能就是你吧~!&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 查看当前挂载的数据集目录&/span&
&span class=&err&&!&/span&&span class=&n&&ls&/span& &span class=&o&&/&/span&&span class=&n&&home&/span&&span class=&o&&/&/span&&span class=&n&&kesci&/span&&span class=&o&&/&/span&&span class=&nb&&input&/span&&span class=&o&&/&/span&&span class=&n&&jump6799&/span&&span class=&o&&/&/span& &span class=&o&&|&/span& &span class=&n&&wc&/span& &span class=&o&&-&/span&&span class=&n&&l&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# dependencies&/span&
&span class=&kn&&import&/span& &span class=&nn&&random&/span&
&span class=&kn&&import&/span& &span class=&nn&&os&/span&
&span class=&kn&&from&/span& &span class=&nn&&PIL&/span& &span class=&kn&&import&/span& &span class=&n&&Image&/span&
&span class=&kn&&import&/span& &span class=&nn&&math&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&colorDiff&/span&&span class=&p&&(&/span&&span class=&n&&p1&/span&&span class=&p&&,&/span& &span class=&n&&p2&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&n&&math&/span&&span class=&o&&.&/span&&span class=&n&&sqrt&/span&&span class=&p&&((&/span&&span class=&n&&p1&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&o&&-&/span& &span class=&n&&p2&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&])&/span&&span class=&o&&**&/span&&span class=&mi&&2&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&n&&p1&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&o&&-&/span& &span class=&n&&p2&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&o&&**&/span&&span class=&mi&&2&/span& &span class=&o&&+&/span& &span class=&p&&(&/span&&span class=&n&&p1&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span& &span class=&o&&-&/span& &span class=&n&&p2&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&])&/span&&span class=&o&&**&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&showPixel&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&y&/span&&span class=&p&&):&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&):&/span&
&span class=&k&&for&/span& &span class=&n&&j&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&):&/span&
&span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&putpixel&/span&&span class=&p&&((&/span&&span class=&n&&x&/span& &span class=&o&&-&/span& &span class=&n&&i&/span&&span class=&p&&,&/span& &span class=&n&&y&/span& &span class=&o&&-&/span& &span class=&n&&j&/span&&span class=&p&&),&/span& &span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 小人的底部颜色标识点&/span&
&span class=&c1&&# 标识点选法:打开PS,-&选择 -&色彩范围,容差设为0,使用吸管工具找底部连续同色区域&/span&
&span class=&c1&&# 使用此法可以找到相对不动点,加固定偏移量可获得底部中心坐标&/span&
&span class=&n&&tokenC&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&mi&&54&/span&&span class=&p&&,&/span& &span class=&mi&&60&/span&&span class=&p&&,&/span& &span class=&mi&&102&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&isToken&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&n&&colorDiff&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&n&&tokenC&/span&&span class=&p&&)&/span& &span class=&o&&&=&/span& &span class=&mi&&1&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 随机选取一个图片&/span&
&span class=&n&&imgDir&/span& &span class=&o&&=&/span& &span class=&s1&&'/home/kesci/input/jump6799'&/span&
&span class=&n&&imgPath&/span& &span class=&o&&=&/span& &span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&choice&/span&&span class=&p&&(&/span&&span class=&nb&&list&/span&&span class=&p&&(&/span&&span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&path&/span&&span class=&o&&.&/span&&span class=&n&&join&/span&&span class=&p&&(&/span&&span class=&n&&imgDir&/span&&span class=&p&&,&/span& &span class=&n&&name&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&name&/span& &span class=&ow&&in&/span& &span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&listdir&/span&&span class=&p&&(&/span&&span class=&n&&imgDir&/span&&span class=&p&&)))&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&img&/span& &span class=&o&&=&/span& &span class=&n&&Image&/span&&span class=&o&&.&/span&&span class=&n&&open&/span&&span class=&p&&(&/span&&span class=&n&&imgPath&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&w&/span&&span class=&p&&,&/span& &span class=&n&&h&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&size&/span&
&span class=&n&&tokenX&/span&&span class=&p&&,&/span& &span class=&n&&tokenY&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&
&span class=&n&&tokenXs&/span& &span class=&o&&=&/span& &span class=&p&&[]&/span&
&span class=&n&&boardX&/span&&span class=&p&&,&/span& &span class=&n&&boardY&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&
&span class=&n&&boardWidth&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&n&&widthCnt&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&n&&DIFF_THERESHOLD&/span& &span class=&o&&=&/span& &span class=&mi&&10&/span&
&span class=&c1&&# 寻找小人&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&h&/span&&span class=&p&&):&/span&
&span class=&k&&if&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&h&/span&&span class=&o&&/&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&
&span class=&k&&continue&/span&
&span class=&n&&tokenL&/span&&span class=&p&&,&/span& &span class=&n&&tokenR&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&
&span class=&c1&&# 左边界&/span&
&span class=&k&&for&/span& &span class=&n&&j&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&w&/span&&span class=&p&&):&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&getpixel&/span&&span class=&p&&((&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&))&/span&
&span class=&k&&if&/span& &span class=&n&&isToken&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&):&/span&
&span class=&c1&&#
showPixel(j, i)&/span&
&span class=&n&&tokenL&/span& &span class=&o&&=&/span& &span class=&n&&j&/span&
&span class=&n&&tokenY&/span& &span class=&o&&=&/span& &span class=&n&&i&/span&
&span class=&k&&break&/span&
&span class=&c1&&# 右边界&/span&
&span class=&k&&if&/span& &span class=&n&&tokenL&/span&&span class=&p&&:&/span&
&span class=&k&&for&/span& &span class=&n&&k&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&w&/span&&span class=&p&&):&/span&
&span class=&n&&j&/span& &span class=&o&&=&/span& &span class=&n&&w&/span& &span class=&o&&-&/span& &span class=&n&&k&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&
&span class=&k&&if&/span& &span class=&n&&j&/span& &span class=&o&&&&/span& &span class=&n&&tokenL&/span&&span class=&p&&:&/span&
&span class=&k&&break&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&getpixel&/span&&span class=&p&&((&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&))&/span&
&span class=&k&&if&/span& &span class=&n&&isToken&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&):&/span&
&span class=&c1&&#
showPixel(j, i)&/span&
&span class=&n&&tokenR&/span& &span class=&o&&=&/span& &span class=&n&&j&/span&
&span class=&k&&break&/span&
&span class=&c1&&# 中心点&/span&
&span class=&k&&if&/span& &span class=&n&&tokenR&/span&&span class=&p&&:&/span&
&span class=&n&&tokenXs&/span&&span class=&o&&.&/span&&span class=&n&&append&/span&&span class=&p&&((&/span&&span class=&n&&tokenL&/span& &span class=&o&&+&/span& &span class=&n&&tokenR&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span&
&span class=&c1&&# 微调, 定位 token 的底座中心点&/span&
&span class=&n&&tokenX&/span& &span class=&o&&=&/span& &span class=&nb&&sum&/span&&span class=&p&&(&/span&&span class=&n&&tokenXs&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&n&&tokenXs&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&mi&&5&/span&
&span class=&n&&tokenY&/span& &span class=&o&&=&/span& &span class=&n&&tokenY&/span& &span class=&o&&-&/span& &span class=&mi&&15&/span&
&span class=&n&&showPixel&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&tokenX&/span&&span class=&p&&),&/span& &span class=&n&&tokenY&/span&&span class=&p&&)&/span&
&span class=&c1&&# 寻找跳板&/span&
&span class=&n&&lastL&/span&&span class=&p&&,&/span& &span class=&n&&lastR&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&h&/span&&span class=&p&&):&/span&
&span class=&k&&if&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&h&/span&&span class=&o&&/&/span&&span class=&mi&&3&/span&&span class=&p&&:&/span&
&span class=&k&&continue&/span&
&span class=&n&&boardL&/span&&span class=&p&&,&/span& &span class=&n&&boardR&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&
&span class=&n&&base&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&getpixel&/span&&span class=&p&&((&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&))&/span&
&span class=&c1&&# 左边界&/span&
&span class=&k&&for&/span& &span class=&n&&j&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&w&/span&&span class=&p&&):&/span&
&span class=&c1&&# 跳过小人周围像素&/span&
&span class=&k&&if&/span& &span class=&nb&&abs&/span&&span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&o&&-&/span& &span class=&n&&tokenX&/span&&span class=&p&&)&/span& &span class=&o&&&&/span& &span class=&mi&&45&/span&&span class=&p&&:&/span&
&span class=&k&&continue&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&getpixel&/span&&span class=&p&&((&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&))&/span&
&span class=&n&&diff&/span& &span class=&o&&=&/span& &span class=&n&&colorDiff&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&n&&base&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&n&&diff&/span& &span class=&o&&&&/span& &span class=&n&&DIFF_THERESHOLD&/span&&span class=&p&&:&/span&
&span class=&n&&showPixel&/span&&span class=&p&&(&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&)&/span&
&span class=&n&&boardL&/span& &span class=&o&&=&/span& &span class=&n&&j&/span&
&span class=&k&&break&/span&
&span class=&c1&&#右边界&/span&
&span class=&k&&if&/span& &span class=&n&&boardL&/span&&span class=&p&&:&/span&
&span class=&k&&for&/span& &span class=&n&&k&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&w&/span&&span class=&p&&):&/span&
&span class=&n&&j&/span& &span class=&o&&=&/span& &span class=&n&&w&/span& &span class=&o&&-&/span& &span class=&n&&k&/span& &span class=&o&&-&/span& &span class=&mi&&1&/span&
&span class=&c1&&# 跳过小人周围像素&/span&
&span class=&k&&if&/span& &span class=&nb&&abs&/span&&span class=&p&&(&/span&&span class=&n&&j&/span& &span class=&o&&-&/span& &span class=&n&&tokenX&/span&&span class=&p&&)&/span& &span class=&o&&&&/span& &span class=&mi&&45&/span&&span class=&p&&:&/span&
&span class=&k&&continue&/span&
&span class=&k&&if&/span& &span class=&n&&j&/span& &span class=&o&&&&/span& &span class=&n&&boardL&/span&&span class=&p&&:&/span&
&span class=&k&&break&/span&
&span class=&n&&p&/span& &span class=&o&&=&/span& &span class=&n&&img&/span&&span class=&o&&.&/span&&span class=&n&&getpixel&/span&&span class=&p&&((&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&))&/span&
&span class=&n&&diff&/span& &span class=&o&&=&/span& &span class=&n&&colorDiff&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span& &span class=&n&&base&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&n&&diff&/span& &span class=&o&&&&/span& &span class=&n&&DIFF_THERESHOLD&/span&&span class=&p&&:&/span&
&span class=&n&&showPixel&/span&&span class=&p&&(&/span&&span class=&n&&j&/span&&span class=&p&&,&/span& &span class=&n&&i&/span&&span class=&p&&)&/span&
&span class=&n&&boardR&/span& &span class=&o&&=&/span& &span class=&n&&j&/span&
&span class=&k&&break&/span&
&span class=&k&&if&/span& &span class=&n&&boardR&/span&&span class=&p&&:&/span&
&span class=&k&&if&/span& &span class=&ow&&not&/span& &span class=&n&&boardX&/span&&span class=&p&&:&/span&
&span class=&n&&boardX&/span& &span class=&o&&=&/span& &span class=&p&&(&/span&&span class=&n&&boardR&/span& &span class=&o&&+&/span& &span class=&n&&boardL&/span&&span class=&p&&)&/span&&span class=&o&&/&/span&&span class=&mi&&2&/span&
&span class=&n&&width&/span& &span class=&o&&=&/span& &span class=&n&&boardR&/span& &span class=&o&&-&/span& &span class=&n&&boardL&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&
&span class=&k&&if&/span& &span class=&n&&width&/span& &span class=&o&&&&/span& &span class=&n&&boardWidth&/span&&span class=&p&&:&/span&
&span class=&n&&boardWidth&/span& &span class=&o&&=&/span& &span class=&n&&width&/span&
&span class=&n&&widthCnt&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&
&span class=&k&&else&/span&&span class=&p&&:&/span&
&span class=&n&&boardY&/span& &span class=&o&&=&/span& &span class=&n&&i&/span&
&span class=&c1&&# 这里连续寻找多次边界,防止圆形跳台的局部宽度稳定&/span&
&span class=&n&&widthCnt&/span& &span class=&o&&+=&/span& &span class=&mi&&1&/span&
&span class=&k&&if&/span& &span class=&n&&widthCnt&/span& &span class=&o&&==&/span& &span class=&mi&&15&/span&&span class=&p&&:&/span&
&span class=&k&&break&/span&
&span class=&c1&&# 减去多次边界寻找产生的溢出量&/span&
&span class=&n&&boardY&/span& &span class=&o&&=&/span& &span class=&n&&boardY&/span& &span class=&o&&-&/span& &span class=&mi&&15&/span&
&span class=&n&&showPixel&/span&&span class=&p&&(&/span&&span class=&nb&&int&/span&&span class=&p&&(&/span&&span class=&n&&boardX&/span&&span class=&p&&),&/span& &span class=&n&&boardY&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&n&&img&/span&
&/code&&/pre&&/div&&figure&&img src=&https://pic2.zhimg.com/v2-fe5cb76c4a6cab59eb20b69_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-fe5cb76c4a6cab59eb20b69_r.jpg&&&/figure&&p&我们识别出了小人、跳台的中心点&/p&&p&接下来可以在 PC 端使用 adb 工具来连接手机自动玩游戏啦(仅限安卓),写个脚本循环执行下列步骤&/p&&p&1.adb shell screencap -p /sdcard/screen.png // 进行截图&/p&&p&2.adb pull /sdcard/screen.png . // 将截图拉取到本地&/p&&p&3.使用本文算法计算出 (tokenX, tokenY) 与 (boardX, boardY) 的距离 d&/p&&p&4.使用距离 d 乘以一个常数算得按压时间 t(ms)&/p&&p&5.adb shell input swipe x y x y t(ms) // 模拟按压输入, x y 只要为有效屏幕坐标即可&/p&&p&&br&&/p&&p&bonus:1080p 屏幕,参数 1.383 比较准哦&/p&&p&&br&&/p&&p&TODO:&/p&&p&-处理非对称跳台情况&/p&&p&-处理小人遮挡了下一个跳台的情况&/p&&figure&&img src=&https://pic4.zhimg.com/v2-1ce5e11cb54ab9709793_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-1ce5e11cb54ab9709793_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-149a21f14a30fa9f67db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-149a21f14a30fa9f67db_r.jpg&&&/figure&&p&&/p&
最近“跳一跳”的游戏风靡朋友圈,我司CTO
默默跳出了8000+分,在“正常人玩到这个分段是有多无聊”的一(feng)片(kuang)群(ji)嘲(du)中,CTO童鞋甩出算法链接,光速打脸并终结了对话:感兴趣的童鞋可在K - Lab在线数据…
&figure&&img src=&https://pic2.zhimg.com/v2-9f5b12e420de0b5c5b6fd1ae9e457303_b.jpg& data-rawwidth=&1080& data-rawheight=&2160& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-9f5b12e420de0b5c5b6fd1ae9e457303_r.jpg&&&/figure&&p&最近微信的跳一跳小程序火了一把,所以前天也更新了微信玩了几盘,最多手动到200左右就不行了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-17b269b64b0caa9d2d5f9c782e5244ef_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&640& data-rawheight=&1280& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/v2-17b269b64b0caa9d2d5f9c782e5244ef_r.jpg&&&/figure&&p&后来准备用代码写个辅助工具,上Github一查,已经有人做出来了,17年12月29号的项目,不到5天差不多5K的stars,以后还会更多,简直可怕。&/p&&p&&a href=&http://link.zhihu.com/?target=https%3A//github.com/wangshub/wechat_jump_game& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/wangshub/wec&/span&&span class=&invisible&&hat_jump_game&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&具体思路都差不多:&/p&&ul&&li&用adb调试手机,获取截图;&/li&&li&从截图中识别棋子和目标块的中心点位置;&/li&&li&根据距离计算长按时间,系数和屏幕分辨率相关;&/li&&li&用adb模拟长按,完成跳跃。&/li&&/ul&&p&唉,多么可惜,错过了一个好项目。&/p&&p&既然别人已经实现了,那就尝试点不一样的,用 &b&深度学习&/b& 解决一下。&/p&&h2&基本思路&/h2&&p&基本流程类似,唯一的区别在于如何获取棋子和目标块的中心位置。&/p&&p&假如长按时间只取决于棋子和目标块的水平位置,那么只需要知道它们水平方向上的坐标即可。&/p&&p&可以看作一个 &b&物体检测&/b& 问题,检测出截图中的棋子等物体,这里假设共包含七类物体:&/p&&ul&&li&棋子:chess&/li&&li&彩蛋块:包括污水 waste、魔方 magic、商店 shop、音乐盒 music&/li&&li&普通块:包括矩形块 rect、圆形块 circle&/li&&/ul&&h2&模型实现&/h2&&p&我手动标注了500张截图,基于&code&ssd_mobilenet_v1_coco&/code&模型和&code&TensorFlow&/code&物体检测API,训练好的模型跑起来是这么个结果。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a26ce07829fd_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1080& data-rawheight=&2160& data-thumbnail=&https://pic2.zhimg.com/v2-a26ce07829fd_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-a26ce07829fd_r.jpg&&&/figure&&p&可以看到截图中的棋子、魔方、矩形块、圆形块都被检测了出来,每个检测结果包括三部分内容:&/p&&ul&&li&物体位置,用矩形标注,对应四元组 ymin、xmin、ymax、xmax;&/li&&li&物体类别,为以上七类中的一种;&/li&&li&检测置信度,越高说明模型对检测结果越有把握。&/li&&/ul&&p&这不仅仅是简单的规则检测,而是 &b&真正看到了截图中共有哪几个物体,以及每个物体分别是什么&/b&。&/p&&p&所以接下来,就只需从检测结果中取出棋子的位置,以及最上面一个非棋子物体,即目标块的位置。&/p&&p&有了物体的边界轮廓,取中点即可得到棋子和目标块的水平坐标,这里进行了归一化,即屏幕宽度为1,距离在0至1之间。然后将距离乘以一个系数,作为长按时间并模拟执行即可。&/p&&h2&运行结果&/h2&&p&看起来很不错,实际跑分结果如何呢?&/p&&p&大概只能达到几百分,问题出在哪?&/p&&p&主要是标注数据太少,模型训练得不够充分,所以检测结果不够准确,有时候检测不出棋子和目标块,而一旦出现这类问题,分数必然就断了。&/p&&p&尝试了以下方法,将一张截图朝不同的方向平移,从而得到九张截图,希望提高检测结果的召回率,但仍然有检测不出来的情况,也许只有靠更多的标注数据才能解决这一问题。&/p&&h2&规则检测&/h2&&p&模型训练了20W轮,依旧存在检测不出来的情况,郁闷得很,干脆也写一个基于规则的 &b&简单版代码&/b& 好了。&/p&&p&花了不到20分钟写完代码,用&code&OpenCV&/code&提取边缘,然后检测棋子和目标块的水平中心位置,结果看起来像这样。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bf05d42d6b7fa1db8d4abc_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1080& data-rawheight=&2160& data-thumbnail=&https://pic1.zhimg.com/v2-bf05d42d6b7fa1db8d4abc_b.jpg& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-bf05d42d6b7fa1db8d4abc_r.jpg&&&/figure&&p&事实证明,最后跑出来的分数,比之前的模型要高多了……&/p&&p&说好的深度学习呢?&/p&&figure&&img src=&https://pic2.zhimg.com/v2-7b92cc86fb8e37d151ef76307bda8b85_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&477& data-rawheight=&245& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&https://pic2.zhimg.com/v2-7b92cc86fb8e37d151ef76307bda8b85_r.jpg&&&/figure&&h2&总结&/h2&&p&面对以下情况时,基于人工经验定义规则,比用深度学习训练模型要省力、有效很多:&/p&&ul&&li&问题本身比较简单,不需要复杂的抽象;&/li&&li&标注数据比较有限,难以充分训练模型;&/li&&li&错误惩罚很高,对错误不能容忍。即便模型在99%的情况下能完美运行,1%的错误立马让游戏直接结束了,此时反而不如hard code的规则靠谱。&/li&&/ul&&p&当然,如果大家能一起努力,多弄些标注数据出来,说不定还有些希望。&/p&&p&代码在Github上:&a href=&http://link.zhihu.com/?target=https%3A//link.juejin.im/%3Ftarget%3Dhttps%253A%252F%252Fgithub.com%252FHonlan%252Fwechat_jump_tensorflow& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&github.com/Honlan/wech…&/a&&/p&&p&不说了,我继续刷分去了,用后面写的不到一百行的代码…&/p&&hr&&p& 更新:标注数据增加到1200张图片,并且用更准的 faster_rcnn_inception_v2_coco 模型重新训练了一遍,几乎很少出现检测不出来的情况了。&/p&&p&即便如此,虽然识别出了棋子和目标块的位置,有时候还是会跳不准,有时间再继续研究吧。&/p&&p&&br&&/p&&p& 更新:将标注数据上传至网盘,有兴趣和需要的话可以下载&/p&&p&链接:&a href=&http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1ggOcxYb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pan.baidu.com/s/1ggOcxY&/span&&span class=&invisible&&b&/span&&span class=&ellipsis&&&/span&&/a&
密码:yewa&/p&
最近微信的跳一跳小程序火了一把,所以前天也更新了微信玩了几盘,最多手动到200左右就不行了。后来准备用代码写个辅助工具,上Github一查,已经有人做出来了,17年12月29号的项目,不到5天差不多5K的stars,以后还会更多,简直可怕。
&figure&&img src=&https://pic1.zhimg.com/v2-857f22e0eecb84ad139fe1_b.jpg& data-rawwidth=&720& data-rawheight=&639& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic1.zhimg.com/v2-857f22e0eecb84ad139fe1_r.jpg&&&/figure&&p&元旦假期,很多人的微信被一个叫“跳一跳”的小游戏刷爆,你也玩了吗?学堂君发现,朋友圈里总有那么几个分数好几千朋友的高居榜首。对于日常玩几十分的学堂君来说,这个水平简直不是人打出来的。&/p&&p&他们可能真的不是人,是机器人。&/p&&p&哔哩哔哩的Up主ATTITUDE上传了一个极客范儿满满的视频。在视频中,作者用钢尺量了每个盒子之间的距离,输入到电脑中,舵机就会按出合适长度的跳跃啦。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cdad7b689cac35d04bae_b.jpg& data-size=&normal& data-rawwidth=&249& data-rawheight=&156& data-thumbnail=&https://pic3.zhimg.com/v2-cdad7b689cac35d04bae_b.jpg& class=&content_image& width=&249&&&figcaption&来源:bilibili&/figcaption&&/figure&&p&来点高级点的,一位MakeBlock大神做了跳一跳机器人,它增加了图像识别功能,再也不用尺子量一量了。(知道作者的留言给我们吧)&/p&&figure&&img src=&https://pic4.zhimg.com/v2-605ba5e4badd1226dff6311_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&205& data-rawheight=&359& data-thumbnail=&https://pic2.zhimg.com/v2-605ba5e4badd1226dff6311_b.jpg& class=&content_image& width=&205&&&/figure&&p&火星人俱乐部的苗永宾老师为跳一跳写了一个程序,轻松刷到五千多分。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3ebae1feacbfc2dd5df53d3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&486& data-rawheight=&274& data-thumbnail=&https://pic4.zhimg.com/v2-3ebae1feacbfc2dd5df53d3_b.jpg& class=&origin_image zh-lightbox-thumb& width=&486& data-original=&https://pic4.zhimg.com/v2-3ebae1feacbfc2dd5df53d3_r.jpg&&&/figure&&p&创客们不仅用这种物理外挂抢了你的跳一跳的第一名,创客们还玩坏了很多手机游戏。网友Easy Arduino Projects就用Arduino制作了若干手机游戏的自动机器人。&/p&&p&曾经火爆一时的游戏“别踩白格儿”,用四根触控笔就让你怎么努力都追不上。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3ce090bb0515fce4c8ec_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic1.zhimg.com/v2-3ce090bb0515fce4c8ec_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&还有前几年让无数人抓狂的Flappy Bird,大多数人只能拿到个位数的分数。而用Arduino自动化操作,分数破百不是梦。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f5da50d523dd18bdcf2fc9_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic2.zhimg.com/v2-f5da50d523dd18bdcf2fc9_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&知名音游“滚动的天空”的操作比其他游戏复杂得多,但只要是机械式的操作,对Arduino来说就不是问题。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-10f90f1f69ffd5f_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic4.zhimg.com/v2-10f90f1f69ffd5f_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&几何冲刺更是毫无悬念。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-eab57d3bf1ecf5bb9d9b64_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic1.zhimg.com/v2-eab57d3bf1ecf5bb9d9b64_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&AA是一款精致耐玩的模拟游戏。在Arduino眼中,耐玩,不存在的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3da094a0becc_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic2.zhimg.com/v2-3da094a0becc_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&“英雄难过棍子关”这款游戏非常考验你对距离的直觉能力,但测量距离正是机器最擅长的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-66b8d4fc4ca9b666bab202e_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic3.zhimg.com/v2-66b8d4fc4ca9b666bab202e_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&反应堆这款游戏需要你精准地点击方块,不想建成一个比萨斜塔,那还是交给Arduino吧。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c656a5fbb4f415e3bd5aa50824ef20fe_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic3.zhimg.com/v2-c656a5fbb4f415e3bd5aa50824ef20fe_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&更复杂的游戏开源硬件处理得了吗?网友Mark Petzold用乐高EV3做了一个“部落冲突”的自动操作机器人,用一晚上的时间,乐高机器人就收集了数以千计的宝石。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0fcd3cb72414afdee8ce2_b.jpg& data-size=&normal& data-rawwidth=&305& data-rawheight=&168& data-thumbnail=&https://pic3.zhimg.com/v2-0fcd3cb72414afdee8ce2_b.jpg& class=&content_image& width=&305&&&figcaption&来源:YouTube&/figcaption&&/figure&&p&创客就是这样把重复的机械操作交给开源硬件,只要设计了合适的程序,它比手动做得更好。最后学堂君还要说一句,这些物理外挂只能用于自己的学习,不要用它来破坏游戏的公平性哦。&/p&
元旦假期,很多人的微信被一个叫“跳一跳”的小游戏刷爆,你也玩了吗?学堂君发现,朋友圈里总有那么几个分数好几千朋友的高居榜首。对于日常玩几十分的学堂君来说,这个水平简直不是人打出来的。他们可能真的不是人,是机器人。哔哩哔哩的Up主ATTITUDE上传…
&figure&&img src=&https://pic1.zhimg.com/v2-0d05c3af5bf7c42fc9abb1e419a793e5_b.jpg& data-rawwidth=&1081& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&1081& data-original=&https://pic1.zhimg.com/v2-0d05c3af5bf7c42fc9abb1e419a793e5_r.jpg&&&/figure&&p&这几天被小程序跳一跳刷屏。无奈手残党日夜奋战才上300分,朋友圈的大牛快被删光了还没拿到第一 。&/p&&p&相信各种加分盒子大家都知道怎么踩了。&br&这里分享一个无意中发现的大杀器&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/v2-2deaee3fde085bc4c517bef12b60.jpg& data-image-width=&500& data-image-height=&285& class=&internal&&神奇的战士:教你用Python来玩微信跳一跳&/a&&p&但是杀器是python版,很多非计算机专业的朋友比较难使用,本着抢月饼要大家都能抢才公平的原则,楼主移植了一个安卓版辅助工具&/p&&p&项目源码地址&/p&&a href=&http://link.zhihu.com/?target=https%3A//github.com/zhchaoo/WeChatJump& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-c1b7d97eec98_ipico.jpg& data-image-width=&400& data-image-height=&400& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zhchaoo/WeChatJump&/a&&p&Apk百度云下载地址&/p&&a href=&http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1o8pAMCE& data-draft-node=&block& data-draft-type=&link-card& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pan.baidu.com/s/1o8pAMC&/span&&span class=&invisible&&E&/span&&span class=&ellipsis&&&/span&&/a&&p&图来了:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4cccf8ead8fb04c7cdcd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&2276& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-4cccf8ead8fb04c7cdcd_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0e4555aae02a012c4cefa117a971dc01_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1280& data-rawheight=&2276& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic2.zhimg.com/v2-0e4555aae02a012c4cefa117a971dc01_r.jpg&&&/figure&&p&注意,需要root后才能使用,祝大家玩的愉快~&/p&&p&&br&&/p&&p&更新日志:&/p&&p&v1.0.5&/p&&p&增强防ban机制,可以上榜&/p&&p&v1.0.4&br&&br&增加悬浮窗,显示距离和控制按钮(右下角)&br&&/p&&p&v1.0.3&br&&br&增强稳定性并加快了跳跃速度&br&&/p&&p&v1.0.2&br&&br&每次跳跃,随机点击,防止被ban&br&&br&增加更多机型配置&/p&&p&&/p&
这几天被小程序跳一跳刷屏。无奈手残党日夜奋战才上300分,朋友圈的大牛快被删光了还没拿到第一 。相信各种加分盒子大家都知道怎么踩了。 这里分享一个无意中发现的大杀器但是杀器是python版,很多非计算机专业的…
&figure&&img src=&https://pic4.zhimg.com/v2-8d2b508f5fae9aa9879cb83f_b.jpg& data-rawwidth=&600& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-8d2b508f5fae9aa9879cb83f_r.jpg&&&/figure&&p&前两天火爆的“跳一跳辅助”热度慢慢降了下来,但是大家学习编程的热情却空前的高涨,有的是跨行业学编程,有的是在校生学编程,有的是程序员学习新的编程语言。那么今天,咱们就来说说学习编程语言的那些事儿。当然,今天的主角是python。&/p&&p&&br&&/p&&p&说其他编程语言之前,我们先说说编程语言的梗:&/p&&p&&b&“PHP是世界上最好的语言”&/b&&/p&&p&&b&“所有的程序都将用JavaScript重写”&/b&&/p&&p&&b&“人生苦短,我用python”&/b&&/p&&p&&br&&/p&&p&只会JavaScript的前端程序员总是被后台欺负,只会php的程序员总是被全世界欺负,而python,短小精干、楚楚动人,即使我只会用python,也可以堂堂正正第说一句“人生苦短,我用python”,然后默念:“我就是不在鄙视链中混,爱咋地咋地!”(玩笑~高兴就好~)。&/p&&p&&br&&/p&&p&咱们今天就用一张图来让大家认识,什么是python。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a9db3544abdfb13ff723_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&837& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-a9db3544abdfb13ff723_r.jpg&&&/figure&&p&&br&&/p&&p&看完这张图,您掌握python了吧,好,可以去撸代码了~&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d32d55c85ed5a84a70f9a35a1ae63031_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1000& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic3.zhimg.com/v2-d32d55c85ed5a84a70f9a35a1ae63031_r.jpg&&&/figure&&p&开个玩笑,哪有这么简单。&br&&/p&&p&作为一个前端老鸟,python对我来说并不是主语言,我怎么忍心让大家在我没有充分准备的情况下听我讲python呢,但是作为一个程序员,我还是有一些经验可以分享给大家的,这些经验适用于任何编程语言,所有大家想学编程,不妨听听(这里我假设大家没有任何编程基础)。&/p&&p&&br&&/p&&p&很多朋友以为掌握了一门编程语言就可以当程序员了,其实并非如此(我入行之前就是这么想的,结果碰一鼻子灰),除了编程语言本身,还有框架、库、算法、计算机基础知识、操作系统知识、计算机网络知识。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1c9cf4072450ded891a738a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&429& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&429& data-original=&https://pic2.zhimg.com/v2-1c9cf4072450ded891a738a_r.jpg&&&/figure&&p&&br&&/p&&p&就拿前两天的“跳一跳辅助工具”来说,并不是掌握了python就能写出来的,原作者并不是python程序员,而是做机器人的,主要与硬件和算法打交道,python只是实现自己想法的一个工具而已。&/p&&p&&br&&/p&&p&再说说“跳一跳辅助工具”程序本身,大家都知道是python写的,但是里面涉及道哪些是安卓的知识,哪些是操作系统的知识,哪些是需要算法的知识,这些都不是单单学会了python就能掌握的,所以路漫漫其修远兮,想写好程序,一定要有毅力、或乐趣、或学习环境、或工作环境,否则一定会在碰壁多次后主动放弃。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-32ef468a38df43e7f919aab_b.jpg& data-size=&normal& data-rawwidth=&1080& data-rawheight=&810& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic2.zhimg.com/v2-32ef468a38df43e7f919aab_r.jpg&&&figcaption&可惜没有python的图&/figcaption&&/figure&&hr&&p&我总是喜欢拿编程语言和自然语言比较,就说python,有的人写的是诗,有的人写的是屎,就像我们都会汉语,写出来的文章水平也是不一样的。&/p&&p&&br&&/p&&p&还有,我们再用汉语交流的,也不只是用汉语本身,汉语只是一个内容的载体,我们可以聊历史,聊宗教,聊数学,聊编程,不管聊什么,都不是掌握了汉语语法可以搞定的。编程也是一样,我用python做web开发就用web框架,用python做数据分析就用数据分析框架,编程语言同样是内容的载体,是我们要表达想法的一个工具,我们在掌握了语言的基本语法之后,才正式开始我们的编程之路。&/p&&p&&br&&/p&&p&当然,不管怎样还是要从基础学起,这里强烈推荐&b&廖雪峰老师的python教程&/b&,百度搜搜就能找到。&/p&&p&&br&&/p&&p&关于书籍,我这里收集和整理了一些,有入门的,有进阶的,如果大家喜欢可以看一看。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c3dcdbba7a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&711& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&711& data-original=&https://pic3.zhimg.com/v2-c3dcdbba7a_r.jpg&&&/figure&&p&百度网盘地址:&a href=&https://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1dFIZ0xb& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pan.baidu.com/s/1dFIZ0x&/span&&span class=&invisible&&b&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&提取码:在公众号【晓舟报告】中回复【python】就可以获取了。&/p&&p&&br&&/p&&p&最后,希望有兴趣成为程序员的朋友,可以克服层层阻碍,在2018年,心想事成。如果对您有帮助,请不要吝惜一个小小的【赞】。&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic3.zhimg.com/v2-f8dbb49c36cc14e99a10b667b1fbf726_180x120.jpg& data-image-width=&408& data-image-height=&257& class=&internal&&李晓舟:“Python来玩微信跳一跳”教程&/a&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic4.zhimg.com/v2-fe857bca372a897fx120.jpg& data-image-width=&429& data-image-height=&301& class=&internal&&李晓舟:“Python来玩微信跳一跳”教程(问题总结)&/a&&p&&br&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s%3F__biz%3DMzI3ODQyODE3Mw%3D%3D%26mid%3D%26idx%3D1%26sn%3D8a3c55f6ce9f1a88a5063f%26chksm%3Deb566d22dc21ea3a32cb05a082cd169a71ccf0c170debf7d07cb59a%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&原文链接&/a&&/p&
前两天火爆的“跳一跳辅助”热度慢慢降了下来,但是大家学习编程的热情却空前的高涨,有的是跨行业学编程,有的是在校生学编程,有的是程序员学习新的编程语言。那么今天,咱们就来说说学习编程语言的那些事儿。当然,今天的主角是python。 说其他编程语言…
&p&一.开始准备:&/p&&ol&&li&请将安卓手机的usb调试模式打开,》开发者选项》USB调试然后与电脑相连&/li&&li&运行环境(这里我是基于ubuntu中的python3环境)&/li&&li&安装程序所需要的所有包,进入到这个包链接:&a href=&https://link.zhihu.com/?target=https%3A//link.jianshu.com/%3Ft%3Dhttps%253A%252F%252Fpan.baidu.com%252Fs%252F1sldtwZV& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&https://pan.baidu.com/s/1sldtwZV&/a& 密码:rzd7&br&&br&执行这个命令$ sudo pip install -r requirements.txt&/li&&/ol&&p&第一张图是进入这个目录,第二张图是执行安装命令&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1cdaa8a66fbb45d37528b0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&66& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-1cdaa8a66fbb45d37528b0_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bf8ecabeb7d7db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&206& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-bf8ecabeb7d7db_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&p&二.测试设备是否连接&/p&&h2&也就是测试一下电脑有没有检测到你的设备(这里就是手机)&/h2&&p&在liux命令中输入一下命令adb devices&/p&&p&如果出现下图所显示的就代表电脑检测到了手机&/p&&p&否则就要检查手机雨点脑的连接问题,这里不同情况可以百度&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ecc6bb08de0ec17b68b79_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&75& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-ecc6bb08de0ec17b68b79_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&p&三.每个设备都有不同的屏幕大小这里通过两个命令用来&/p&&h2&实现电脑对手机游戏每次要跳的距离(像素)的计算&/h2&&p&在执行命令前要跳到你解压后的那个目录里&/p&&p&adb shell screencap -p /sdcard/1.png&/p&&p&adb pull /sdcard/1.png .&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6f7a7fefdb9b00e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&31& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic4.zhimg.com/v2-6f7a7fefdb9b00e_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c8abd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&49& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic3.zhimg.com/v2-c8abd_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&p&四.在解压文件的目录下执行如下命令&/p&&h2&Python3 wechat_jump_auto.py&/h2&&p&如图&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ffccbc6aa78beb49aff760f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&554& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&554& data-original=&https://pic2.zhimg.com/v2-ffccbc6aa78beb49aff760f_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&图片.png&/p&&p&&br&&/p&&p&等待程序执行,手机上的游戏就会开始啦,要耐心等待不要着急……..&br&&br&连接成功的时候,就要打开游戏,开始游戏,不要动,然后执行程序他自己就会跳&/p&&p&原文链接:&a href=&https://link.zhihu.com/?target=https%3A//www.jianshu.com/p/ee& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&微信小游戏跳一跳外挂教程(安卓版)&/a&&/p&
一.开始准备:请将安卓手机的usb调试模式打开,》开发者选项》USB调试然后与电脑相连运行环境(这里我是基于ubuntu中的python3环境)安装程序所需要的所有包,进入到这个包链接: 密码:rzd7 执行这个命令$ sudo pip install -…
&figure&&img src=&https://pic3.zhimg.com/v2-d0c870cd84afc4c85260_b.jpg& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-d0c870cd84afc4c85260_r.jpg&&&/figure&&p&跨年夜的时候,在家里没事干,为了陪孩子玩,写了个 python 脚本,自动玩微信“跳一跳”。后来又完善了一下,目前未发现会跳不中的情况,且大约90%的几率跳到中心。&/p&&p&我今天在知乎上一搜,发现还挺多朋友写这类程序的。相比之下,我觉得我用的算法原理非常简单,我称之为平民算法,不需要什么计算机图形学知识,所以在这里写一下供大家娱乐!&/p&&p&代码发布在这儿:&/p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/liuben/weixinhop& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic1.zhimg.com/v2-dee2cd5a5a5c_ipico.jpg& data-image-width=&420& data-image-height=&420& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&liuben/weixinhop&/a&&p&&b&1 基本想法&/b&&/p&&p&电脑通过 adb 可以连上Android手机,然后截屏并拖回电脑以供电脑分析。然后电脑也可以通过 adb 控制触摸 Android 手机的时间。从而为写程序自动玩游戏提供了可能。&/p&&p&要自动玩游戏,无外乎3点:&/p&&ol&&li&算出目标点的坐标&/li&&li&算出起点的坐标&/li&&li&计算出跳跃距离,进而计算出触摸时间&/li&&/ol&&p&&b&2 目标点分析&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fcb48be2a9a4b0b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-fcb48be2a9a4b0b_r.jpg&&&/figure&&p&首先背景色是比较固定的(从上到下有微小变化),和物体有较大色差,所以定义一个两点颜色差距的函数。这个在计算机图形学上有专门的公式,但我觉得没必要,直接写了个最简单的,就是将两个像素的 RGB 分别相减的绝对值再加起来,就够用了。如下所示:&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&r&/span& &span class=&o&&=&/span& &span class=&n&&start&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&cur&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span&
&span class=&n&&g&/span& &span class=&o&&=&/span& &span class=&n&&start&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&cur&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&
&span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&n&&start&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&cur&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&
&span class=&n&&distance&/span& &span class=&o&&=&/span& &span class=&nb&&abs&/span&&span class=&p&&(&/span&&span class=&n&&r&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&nb&&abs&/span&&span class=&p&&(&/span&&span class=&n&&g&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&nb&&abs&/span&&span class=&p&&(&/span&&span class=&n&&b&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&目标点自然是目标物体顶面的中心。&/p&&p&注意到目标正方体顶面最上方的点和最右侧的点,分别对应目标点的x坐标和y坐标,所以如果能找出这两个点的坐标就好了。&/p&&p&&b&先找顶点坐标&/b&:跳过记分牌之后,从上往下搜索第一个跟背景色差别较大的点即可。&/p&&p&关于顶点坐标有两个特殊情况:&/p&&p&第一,目标物体顶部为圆形。放大了看,会发现顶部有连续的若干个点。所以,实际算法中在从上往下,从右往左搜到第一个色差很大的点之后,会继续向左搜索连续的色差很大的点,最后取这一线段的中点,作为顶点。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-10d19b6da4e5b2a2cc3a1ee970f5d847_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&415& data-rawheight=&77& class=&content_image& width=&415&&&/figure&&p&第二,会有顶点低于棋子的情况,导致从上而下搜索时,先遇到了棋子的头部。为了规避这种情况的干扰,我从棋子头部取了一个特征点,然后在顶点检索时,在检测到一个和背景色色差较大的点之后,和棋子的特征点计算色差,如果色差很小,则认为进入了棋子头部,然后跳过这个点及其周围一定范围的像素。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fd9c708641edd6c9ddd93fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-fd9c708641edd6c9ddd93fc_r.jpg&&&/figure&&p&&b&搞定顶点,再来搞右侧点。&/b&&/p&&p&顺着顶点向右下方检索和背景色色差较大的点。什么时候时候找到一个点,它下方那一行没有比它更靠右的大色差点,就说明这个点是最右侧点了。&/p&&p&右侧点有一个特殊情况,也是圆形。在放大了看时,会发现圆形在边缘会出现垂直的至多5个像素,然后继续往外侧走。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-4f71abead33207a5fcb9aa12ef394732_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&84& data-rawheight=&144& class=&content_image& width=&84&&&/figure&&p&为了涵盖这种情况,又避免和正方体这种右侧点下面有很长的垂直线的情况相区分。实际算法在从顶点搜索右侧点时,每次循环都将y坐标加1,然后x坐标同上一行,开始向右搜索大色差点。如果这一行的最右侧点,比上一行的最右侧点,更靠右,则这一行成为候选;如果这一行的最右侧点和上一行x坐标完全一样,则上一行仍然是候选,开始计数并进入下一行,如果这种情况连续超过5行(即计数超过5),则候选行即是最右侧点所在行。&/p&&p&有两种特殊情况,目前的算法会在计算最右侧点时出现误差:分别是杯子的情况,和最右侧点被棋子遮挡的情况。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d0c870cd84afc4c85260_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-d0c870cd84afc4c85260_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-7a230e928bc63a1a3d226_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-7a230e928bc63a1a3d226_r.jpg&&&/figure&&p&这两种情况会跳不到中心,但也不至于掉下去。所以,我就没有再进一步处理了。&/p&&p&&br&&/p&&p&&b&3 起点分析&/b&&/p&&p&注意到棋子的颜色在游戏中是唯一的,不过棋子在不同位置会有一点变化。所以,我先从棋子中根据其中心所在位置,截取了一幅特征图如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f5dfb0249f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&48& data-rawheight=&30& class=&content_image& width=&48&&&/figure&&p&然后在画面中,搜索和这个区域色差最小的区域,即可算出起点的坐标。&/p&&p&两个区域的色差也很容易算,就是把源区域和特征区域的点挨个算色差(按上面定义的简单公式)再加起来就好了。&/p&&p&实际计算中为了减小计算量,会缩小检索区域,比如起点肯定在目标点的下方。再把屏幕分成左右两侧,那么起点肯定和目标点不在同一侧屏幕中。另外如果一点和特征图的色差很大,就没必要算整个区域的色差了。&/p&&p&目前看来,这种算法准确率很高。&/p&&p&&b&4 触摸时间计算&/b&&/p&&p&首先要拿到一个标准距离下,能够跳到中心的完美时间。这需要做一下实验。&/p&&p&我的脚本开发了调试模式,可以从命令行控制进行截图、分析、跳跃之一。可用于实验获得这个参数。&/p&&p&注意到,每次游戏启动时,第一步的跳远距离是固定的。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fcb48be2a9a4b0b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-fcb48be2a9a4b0b_r.jpg&&&/figure&&p&所以,就在这一步反复实验跳跃时间就好了。&/p&&p&只要试出来一个就好,其他的距离程序都可以按照比例计算。&/p&&p&注意,一个距离要完美跳跃,触摸时间在一个区间内都是可以的,建议选择这个区间的中间值,以减少计算别的距离时的误差。&/p&&p&&br&&/p&&p&&b&5 总结&/b&&/p&&p&至此,算法介绍完毕。不需要什么多的知识,基本上会写程序就能看懂吧,哈哈!整个算法的时间复杂度如果以图片的像素数量来衡量的话是 O(n),应该是相当可以了。&/p&&p&这个脚本用Python开发,使用了 Pillow 库。美中不足是计算时间较长,每一步需要计算6、7秒吧。我看 Pillow 库的文档里面写了按像素遍历图片的性能不佳,我程序也没有在提高性能上做太多工作,所以目前也就这样了。&/p&&p&以上纯属自娱自乐,做完后给小孩看了看,小孩表示很神奇,哈哈!&/p&&p&&/p&
跨年夜的时候,在家里没事干,为了陪孩子玩,写了个 python 脚本,自动玩微信“跳一跳”。后来又完善了一下,目前未发现会跳不中的情况,且大约90%的几率跳到中心。我今天在知乎上一搜,发现还挺多朋友写这类程序的。相比之下,我觉得我用的算法原理非常简…
&figure&&img src=&https://pic2.zhimg.com/v2-6ebb43b98fbac0c48da7c_b.jpg& data-rawwidth=&500& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic2.zhimg.com/v2-6ebb43b98fbac0c48da7c_r.jpg&&&/figure&&h2&&b&0x00 引子&/b& &/h2&&p&&br&&/p&&p&目前网上已经有模拟发包上传分数的方案了,图形识别和人肉丈量都是不错的选择,此外,也有基于安卓 adb 实现的。下面给出一些这方面的分析,没别的意思,就是纯粹好玩。&br&&/p&&p&&br&&/p&&h2&&b&0x01 抓包&/b& &/h2&&p&&br&&/p&&p&抓包通常可以用 Charles 或者 Fiddler 抓小程序 https 数据,这里说下另一种方法,从安卓代码入手,找到 https 明文发包点截取封包。&/p&&p&&br&&/p&&p&从微信的 log 中看到,每次游戏发包时都会打印 &AppBrandNetworkRequest&,从 Tag 命名上猜测这是小程序代码通过微信 sdk 发包的接口,反编译微信根据该关键词定位到负责小程序 https 通信的类是 Lcom/tencent/mm/plugin/appbrand/i/c;。&/p&&p&&br&&/p&&p&分析下代码可以发现最后使用过 Lcom/tencent/mm/sdk/f/e;-&post 发包的,打印调用这行代码的函数的各个参数就可以截取小程序通过 https 发送的 json 明文数据了。 &/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&0x02 改包&/b& &/h2&&p&&br&&/p&&p&在 1 中明文发包点可以直接修改发送的数据,但是敏感数据是加密通信的,比如上传分数的接口 &a href=&http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/wxagame/wxagame_settlement& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&mp.weixin.qq.com/wxagam&/span&&span class=&invisible&&e/wxagame_settlement&/span&&span class=&ellipsis&&&/span&&/a& 中 action_data 字段就是在小程序内加密后再通过微信发出去的。&/p&&p&&br&&/p&&p&既然数据是在本地加密的,加密算法肯定也在本地可以找到,所以&跳一跳&作弊的关键就是找到小程序源码。&br&&/p&&p&&br&&/p&&h2&&b&0x03 寻找小程序源码&br&&/b&&/h2&&p&从微信小程序文档中可以知道,小程序的核心逻辑通常是用 js 写的。搜索手机中的文件并没有找到后缀为 &.js& 的源码,源码只能从内存中 dump 了。&br&&br&微信 log 中搜索 &.js&,可以发现有如下 log 打印:&br&I/MicroMsg.WxaPkgRuntimeReader(12426): [, , 12554]:openRead, appId = wx7c8d593b2c3a7703, reqURL = /game.js, null(FALSE), type = java.lang.String, cost = 6ms&br&&br&从关键词 WxaPkgRuntimeReader 可以猜测这是 wxapp 源码加载的相关代码,通过该关键词反编译微信定位到加载 js 代码的类:Lcom/tencent/mm/plugin/appbrand/appcache/&br&分析代码可知该类下的 public static String a(e eVar, String str) 方法返回的就是js源码,把返回字串 dump 下来得到 &跳一跳& 核心源码 game.js。&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&0x04 实现作弊功能&/b&&br&&/h2&&p&有了源码,就可以根据上传分数的相关代码模拟上报分数了: &/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&{
key: &requestSettlement&,
value: function() {
var t = arguments.length & 0 && void 0 !== arguments[0] ? arguments[0] : 0,
e = arguments.length & 1 && void 0 !== arguments[1] ? arguments[1] : 0,
i = arguments.length & 2 && void 0 !== arguments[2] ? arguments[2] : function() {},
n = arguments.length & 3 && void 0 !== arguments[3] ? arguments[3] : {};
if (a.default.sessionId) {
game_data: JSON.stringify(n)
base_req: {
session_id: a.default.sessionId,
action_data: (0, s.encrypt)(r, a.default.sessionId)
wx.request({
h.AJAX_URL + &/wxagame/wxagame_settlement&,
method: &POST&,
success: function(t) {
i(200 === t.statusCode ? 0 === t.data.base_resp.errcode ? !0 : !1 : !1)
fail: function(t) {
} else i(!1)
&/code&&/pre&&/div&&p&&br&&/p&&p&加密部分:&/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&e.encrypt = function(t, e) {
var e = e.slice(0, 16),
i = n.default.enc.Utf8.parse(e),
r = n.default.enc.Utf8.parse(e),
a = JSON.stringify(a);
var o = n.default.AES.encrypt(a, i, {
mode: n.default.mode.CBC,
padding: n.default.pad.Pkcs7
return o = o.toString()
&/code&&/pre&&/div&&p&&br&&/p&&p&既然源码在手,直接修改源码就可以实现作弊功能了。实现的方法是修改 3 中的 js 源码载入函数的返回字符串,替换相应 js 代码。&br&比如修改每次跳跃加分 32,把 &this.score+=t& 替换成 &this.score+=32& 等等。&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&0x05 基于触动精灵来实现&/b& &/h2&&p&&br&&/p&&p&想到了下面的识别办法: &/p&&p&&br&&/p&&p&1. 逐行进行扫描来识别要跳转的目标坐标。为了提高效率可以适当增加扫描步进。定义一个矩形区域,要跳转的目标相对来说位置都比较固定。&/p&&p&&br&&/p&&p&2. 获取小人的位置,通过触动精灵的查找颜色功能进行定位坐标,虽然有一定误差,但是只要能获取到坐标,用来计算还是基本没问题的。&/p&&p&&br&&/p&&p&3. 计算跳跃距离,通过直接三角形的勾股定理进行计算。按压时间需要根据距离进行修正,我在小米 5s上测试用的1.3 基本还算可以。&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&已知问题&/b&:&/p&&p&&br&&/p&&p&1. 通过触动精灵进行颜色匹配搜索坐标的做法效率较低,需要比较长的时间。&/p&&p&&br&&/p&&p&2. 运行一段时间之后,找色函数和获取小人坐标的函数会发生错误,导致无法获取到真正的坐标。我加了几个判断,出现问题的时候直接重新启动脚本就可以了。&/p&&p&&br&&/p&&p&3. 由于是基于颜色进行匹配的,因而相对来时识别的坐标的准确度比上面的python版本要低很多。&br&&/p&&p&&br&&/p&&p&&b&改进方式&/b&:&/p&&p&&br&&/p&&p&1. 针对搜索坐标的函数进行匹配,折半查找,如果小人在左侧,直接搜索右侧。如果小人在右侧直接搜索左侧。&/p&&p&&br&&/p&&p&2. 匹配到错误之后直接重启脚本,使用触动精灵的循环运行功能&/p&&p&&br&&/p&&p&3. 其他未知的功能修改?我也不知道有啥。哈哈&br&&br&脚本文件: &/p&&p&&br&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&require &TSLib&
require(&math&)
-----------------------------------------------
-- Auto jump scripy
-- Code by obaby
-- http://www.h4ck.org.cn
-- Findu App http://findu.co
-----------------------------------------------
-- define scan zone with (x1,y1) (x2,y2)
scanZone_x1 = 50;
scanZone_y1 = 600;
scanZone_x2 = 1000;
scanZone_y2 = 922;
-- get the target object position
function getDestXY()
mSleep(1000);
isfound = 0;
dest_x = 0;
dest_y = 0;
for y = scanZone_y1,scanZone_x2,30 do
for x =scanZone_x1,scanZone_x2,30 do
colorb = getColor(x, y)
colorc = getColor(x-30, y)
colord = getColor(x+50, y)
delta = math.abs(colorb -colorc)
delta2 = math.abs(colord - colorb)
--toast(delta..& :x:&..x..& :y:&..y,1)
--mSleep(100)
if delta &1000 then
--toast(delta..& :x:&..x..& :y:&..y,1)
nLog(&COLO TO::ColorB:&..colorb..& ColorC:&..colorc);
isfound = 1;
--mSleep(5000);
--dialog(&ColorB:&..colorb..&ColorC:&..colorc, 3);
--mSleep(3000)
if isfound ==1 then
return dest_x, dest_y
-- get the
function getDistance(dest_x, dest_y)
--mSleep(1000);
x, y = findColorInRegionFuzzy( 0x39375f , 80, 0, 926, );
if x == -1 then
x, y = findColorInRegionFuzzy( 0x39375f , 70, 0, 926, );
if x == -1 then
x, y = findColorInRegionFuzzy( 0x39375f , 80, 0, 926, );
if x ==-1 then
nLog(&JUMP FR::src_x:&..x..& src_y:&..y);
distance = math.sqrt(math.pow(dest_x - x,2) + math.pow(dest_y-y,2));
if math.abs(dest_y - y) & () then
return (.4;
while (true) do
if (isColor( 581, 1626, 0xffffff, 85) and
isColor( 558, 628, 85)) then
dest_x , dest_y = getDestXY();
dist = getDistance(dest_x,dest_y);
toast(&dest_x:&..dest_x..& dest_y:&..dest_y..& distance:&..math.floor(dist),3);
--toast(dist,1)
--can not get dest position or can not get the source position
nLog(&JUMP TO::dst_x:&..dest_x..& dst_y:&..dest_y..& distance:&..math.floor(dist));
if dest_x ==scanZone_x1 or dist == 0 or dest_y == scanZone_y1 or dest_x ==scanZone_x2 then
toast(&Get posison error&,1);
nLog(&ERRO ER:: Get position error&)
touchDown(dest_x, dest_y);
mSleep(dist*1.3);
touchUp(dest_x, dest_y);
&/code&&/pre&&/div&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e8a8cdaa8046d74cef37c0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&518& data-rawheight=&734& class=&origin_image zh-lightbox-thumb& width=&518& data-original=&https://pic1.zhimg.com/v2-e8a8cdaa8046d74cef37c0_r.jpg&&&/figure&&p&&a href=&http://link.zhihu.com/?target=https%3A//bbs.pediy.com/thread-223677.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&本文由看雪论坛 洪荒之力&obaby 原创 转载请注明来自看雪社区&/a&&/p&&p&&/p&
0x00 引子 目前网上已经有模拟发包上传分数的方案了,图形识别和人肉丈量都是不错的选择,此外,也有基于安卓 adb 实现的。下面给出一些这方面的分析,没别的意思,就是纯粹好玩。 0x01 抓包 抓包通常可以用 Charles 或者 Fiddler 抓小程序 https 数据,这…
&figure&&img src=&https://pic2.zhimg.com/v2-3c67cb82cbc933f6e4a81f106cb82460_b.jpg& data-rawwidth=&1071& data-rawheight=&755& class=&origin_image zh-lightbox-thumb& width=&1071& data-original=&https://pic2.zhimg.com/v2-3c67cb82cbc933f6e4a81f106cb82460_r.jpg&&&/figure&&p&最近知乎上很多分享微信跳一跳的教(wai)程(guai),自己也花了点儿时间搞了个乞丐版的,代码加注释一共72行。简单的代价就是准确率,跑了两次,分数只刷到了1700+,凑合用。&/p&&p&&br&&/p&&p&首先,几乎所有方法的主要思想都是一致的,就是计算棋子(索性这么叫吧)与下一个目标块中心之间的距离乘以一个固定的系数就是需要按压的时间。具体实现基于以下几点观察:&/p&&p&&br&&/p&&p&&b&1)棋子颜色大小基本保持不变,直接用OpenCV的模板匹配来确定位置&/b&&/p&&p&需要提前准备好棋子的截图,从任意一张截图中手动切出来即可。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&find_chess&/span&&span class=&p&&(&/span&&span class=&n&&im&/span&&span class=&p&&):&/span&
&span class=&k&&global&/span& &span class=&n&&chess&/span&
&span class=&n&&match_score&/span& &span class=&o&&=&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&matchTemplate&/span&&span class=&p&&(&/span&&span class=&n&&im&/span&&span class=&p&&,&/span& &span class=&n&&chess&/span&&span class=&p&&,&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&TM_CCOEFF_NORMED&/span&&span class=&p&&)&/span&
&span class=&n&&_&/span&&span class=&p&&,&/span& &span class=&n&&max_val&/span&&span class=&p&&,&/span& &span class=&n&&_&/span&&span class=&p&&,&/span& &span class=&n&&max_loc&/span& &span class=&o&&=&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&minMaxLoc&/span&&span class=&p&&(&/span&&span class=&n&&match_score&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&max_val&/span&&span class=&p&&,&/span& &span class=&n&&max_loc&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&2)下次跳的方向跟当前棋子的位置有关。&/b&&/p&&p&观察发现,把整个屏幕分为左右两个部分,棋子与目标块会分别处于其中一个半屏,所以,只需要搜索棋子不在的那半个屏幕即可。另外,只需要搜索棋子中心往上的部分,自不必多言。&/p&&p&&br&&/p&&p&&b&3)相邻目标块之间的方位比例是确定的。&/b&&/p&&p&不难看出,相邻目标块中心连线,x轴(横向)差值与y轴(纵向)差值的比例基本上是固定的7:4,基于这个观察,&b&我们只需要计算出棋子与目标块 x 轴 或 y 轴其一距离即可&/b&。(当然,棋子若是不在当前块儿中心的话,会有一定的误差。这个问题也好办,调好参数,让每次都尽量落在中心即可)&/p&&p&由于下一个目标块的尖尖是比较容易确定的,而尖尖位置与目标块中心又是在同一条竖直线上的,所以,在实现中我们直接求棋子块与目标块 x 轴上的距离。具体的实现方式是通过OpenCV自带的边缘检测算子,找边缘中最高的那个点即可,两行代码就搞定:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&find_next_top&/span&&span class=&p&&(&/span&&span class=&n&&im&/span&&span class=&p&&):&/span&
&span class=&n&&canny_img&/span& &span class=&o&&=&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&Canny&/span&&span class=&p&&(&/span&&span class=&n&&im&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&where&/span&&span class=&p&&(&/span&&span class=&n&&canny_img&/span& &span class=&o&&==&/span& &span class=&mi&&255&/span&&span class=&p&&)[&/span&&span class=&mi&&1&/span&&span class=&p&&][&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&4)缩小搜索区域&/b&&/p&&p&由于相邻目标块中心连线,x轴差值与y轴差值的比例基本上是固定的7:4,所以,目标区域应该在当前块左上方或右上方一个7:4的矩形内,我们只需要在这个区域内搜索即可。为了确保安全,具体实现中采用了7:5的比例。&/p&&p&&br&&/p&&p&整体源码如下&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# coding: utf-8&/span&
&span class=&sd&&'''&/span&
&span class=&sd&&# 注意,当前只针对
分辨率,其他分辨率需作出相应的修改。&/span&
&span class=&sd&&#&/span&
&span class=&sd&&# === 思路 ===&/span&
&span class=&sd&&# 核心思想:每次落稳之后截图,根据截图找出棋子的坐标和下一个块顶面的中点坐标,确定距离&/span&
&span class=&sd&&# 识别棋子:由于棋子本身的大小颜色基本保持不变,模板匹配的准确率很高,直接采用OpenCV的相应模块。&/span&
&span class=&sd&&# 识别棋盘:由于图像中椭圆和长方形的比例都是确定的,有X轴距离就可以确定需要跳的距离了。&/span&
&span class=&sd&&#
So,不管是椭圆还是长方形,找出顶上的尖点即可。简单带来的风险是,但凡哪次没跳到中心,&/span&
&span class=&sd&&#
下次就可能不太准确。还好,参数调好的情况下,出错直接导致game over的概率比较小。&/span&
&span class=&sd&&'''&/span&
&span class=&kn&&import&/span& &span class=&nn&&os&/span&
&span class=&kn&&import&/span& &span class=&nn&&time&/span&
&span class=&kn&&import&/span& &span class=&nn&&numpy&/span& &span class=&kn&&as&/span& &span class=&nn&&np&/span&
&span class=&kn&&import&/span& &span class=&nn&&cv2&/span&
&span class=&n&&chess&/span& &span class=&o&&=&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&imread&/span&&span class=&p&&(&/span&&span class=&s1&&'chess.png'&/span&&span class=&p&&)&/span&
&span class=&n&&chess_h&/span&&span class=&p&&,&/span& &span class=&n&&chess_w&/span&&span class=&p&&,&/span& &span class=&n&&_&/span& &span class=&o&&=&/span& &span class=&n&&chess&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&
&span class=&k&&def&/span& &span class=&nf&&get_screenshot&/span&&span class=&p&&():&/span&
&span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s1&&'adb shell screencap -p /sdcard/autojump.png'&/span&&span class=&p&&)&/span&
&span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s1&&'adb pull /sdcard/autojump.png .'&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&find_chess&/span&&span class=&p&&(&/span&&span class=&n&&im&/span&&span class=&p&&):&/span&
&span class=&k&&global&/span& &span class=&n&&chess&/span&
&span class=&n&&match_score&/span& &span class=&o&&=&/span& &span class=&n&&cv2&/span&&span class=&o&&.&/span&&span class=&n&&matchTemplate&/spa}

我要回帖

更多关于 java图像识别程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信