2015年12月28日 星期一

遊戲腳本撰寫紀錄

由於有網友對於遊戲的腳本製作過程有興趣

這篇也算是紀錄一下我寫手機遊戲腳本的心得

太細節的部份就不說明了

要擁有的知識可能有點雜


國際版ROB經歷了四五年總算要關閉服務了

 Rage of bahamut(rob)是一款卡牌遊戲

起源於日本的web卡牌遊戲(開發廠商為cygames)

移植到android與ios而讓卡牌遊戲成為眾多手機app廠商開發的仿效模式

遊戲本質上其實還是web

而mobage(rob代理商)有自己的登入器接口

也就是遊戲開啟後先做login的動作 輸入帳號密碼後

登入系統會配發cookie並redirrect到遊戲的web server

起先我使用bluestacks安卓模擬器來做登入動作

後來由於效能問題又改用了virtualbox直接安裝android os進去來執行

我們要自動化的第一步自然是透過程式讓app自動啟動

如何使用電腦來控制android模擬器 基本上都是使用adb這個程式來控制

adb devices #查詢電腦有無裝置連接
adb connect 192.168.56.1 #連接上位置於192.168.56.1的裝置
"""最常用的基本上就這兩個
只要連接上後續控制就是靠自動化了"""

google本身有提供一套自動化測試工具叫monkeyrunner 個人使用後感覺效能頗差

且在比對圖片時常常會掛掉

後來改用了androidviewclient這一套純python的自動化工具


#自動化連接上裝置範例

from com.dtmilano.android.adb.adbclient import AdbClient
if len(sys.argv) >= 2:
    serialno = sys.argv[1]

else:
    serialno = '.*'
print 'serialno= '+str(serialno)

device1 = AdbClient(serialno=serialno)
print 'connected'

#如果使用python script.py 192.168.56.1 這個script就會去操作192.168.56.1


連接上我們要做的事情自然就是開啟遊戲的app

事實上透過adb shell其實就能夠簡單達到了


#開啟app
adb shell am start -a android.intent.action.MAIN -n com.mobage.ww.a692.Bahamut_Android/.SplashActivity
#關閉app
adb shell pm clear com.mobage.ww.a692.Bahamut_Android
"""啟動的程式名稱可能要先開eclipse觀察logcat看app的啟動流程來知道啟動時的package name
這是adb shell的使用方法,我們寫進腳本內去開啟的方式也差不多,pm clear的話同時能有清除使用者資料的功能"""

遊戲啟動後我們就開始做登入動作

#這邊我設置了一個開頭名稱為test100登入帳號,擷取封包cookie資訊登入後執行script
import time
from PIL import Image,ImageStat
from lib.sniff import sniff_rob #自己寫的擷取封包extract出cookie的module

user_name = "test"
user_num = 100
password = 12345678
delay = 1 #登入帳號之間的間隔秒數
run_script = "script" #登入後帳號所要執行的script


device1.shell("pm clear com.mobage.ww.a692.Bahamut_Android") #androidviewclient下shell的方法
time.sleep(1);
print 'Login: '+user_name+str(user_num)
print 'Password: '+ str(password)
print user_name+str(user_num)+': Run Rage of Bahamut...'
device1.shell("am start -a android.intent.action.MAIN -n com.mobage.ww.a692.Bahamut_Android/.SplashActivity")
time.sleep(5) #我是直接用等待五秒的方式等程式開啟,嚴謹點自然可以找android看有無check程式是否執行中的方法

#開啟app後要比對圖片來確認有無正常開啟app並且比對成功後開始執行登入
i=1
    while i<=8:
    picstart = Image.open("./pic/picstart.png") #用PIL開啟一個圖片
    time.sleep(1);
    picstart2=device1.takeSnapshot(reconnect=True) #利用androidviewclient takeSnapshot method擷取安卓的當前畫面
    picstart2=picstart2.transform((20,20),Image.EXTENT, (120,160,140,180)) #將當前畫面擷取出想要的部分
    print user_name+str(user_num)+': Loading'
    if device1.sameAs(picstart, picstart2, 1)== 1: #比對成功進行以下動作
        i=10 #比對成功後跳出while,由於i==9有其他動作所以用此方式跳出
        print user_name+str(user_num)+': Start to login'
        device1.touch(120,160, 'DOWN_AND_UP') #androidviewclient 模擬點取螢幕120,160的位置
        time.sleep(0.2);
        device1.touch(120,160, 'DOWN_AND_UP')
        time.sleep(0.5);
        device1.shell("input keyevent 61")#下達鍵盤TAB鍵的意思
        time.sleep(1);
        device1.type(user_name + str(user_num)) #輸入帳號
        time.sleep(1);
        device1.shell("input keyevent 61")#TAB換欄位
        device1.type(str(password)) #輸入密碼
        time.sleep(1);
        device1.shell("input keyevent 66")# 點選登入
        user=user_name+str(user_num)
        if sniff_rob(user,'01'): break #擷取出cookie
            filec = open('./cookie/'+user+'.txt','r')
            cookie = filec.read()
            if cookie == '':
                user_num = user_num -1
                break
                #將此帳號執行run_script,由於我使用windows7來跑所以有些導入程式的參數部分看起來比較複雜,也不是什麼重要的地方
                command_lines = 'python ./lib/'+run_script+'.py --'+user 
                print user+' start popen'
                args = shlex.split(command_lines)
                p = Popen(args)

    else: #比對失敗後等兩秒再比對圖片
        i=i+1
        time.sleep(2)



run_script的部分由於還蠻多種script的

都是定義遊戲中腳色要怎麼動作

包含加好友領獎勵過任務之類的

由於都是url.get url.post之類的東西也沒什麼好說明的

而擷取封包是使用scapy有興趣找相關documentation即可

這個程式其實是登入100-999個帳號

我精簡了一些不然有點太囉嗦


2015年4月28日 星期二

Scrapy 使用心得(1)


目前專案在製作一個可以快速搜索遊戲卡片的app
由於已經有相關的wiki了
所以只需要爬資料下來做好search功能

趁現在記憶猶新趕快把心得寫下提醒未來的自己XD

我所使用的環境為: python 2.7, win7 64, mongodb

目的:爬資料進去mongodb

安裝方式為:
pip install scrapy


安裝好了之後開始一個新的專案
scrapy startproject myapp

於是會建立一個
myapp資料夾


檔案結構為
myapp/
    scrapy.cfg
    myapp/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...
spider資料夾內沒有檔案要自行建立spider的檔案
基本上scrapy提供許多種spider
BaseSpider:
from scrapy.spider import BaseSpider
只會爬你提供的url

CrawlSpider:
from scrapy.contrib.spiders import CrawlSpider
會爬你提供的url並把裡面的links也爬一爬

基本上我只使用過這兩種其他就不說明了

BaseSpider使用範例
我們先在spider資料夾內建立一個叫spider.py(檔名可以任意取喔)



from scrapy.spider import BaseSpider


class myappSpiders(BaseSpider): 

 

     name = 'myspider_name' #這個名字很重要喔對scrapy不熟的可能要浪費好幾分鐘在這

     allowed_domains = ['www.example.com']  #要爬的domain


     #start_urls就是爬蟲開始爬的第一個網頁,在BaseSpider中就只爬提供的這些urls
     start_urls = ['http://www.basespider.com/page1'
               ,'http://www.basespider.com/page2'
        ]

    #爬蟲從url爬完會丟到parse內你就可以從這邊設定你想取出的資料是什麼
def parse(self, response): hxs = HtmlXPathSelector(response) item = myappItem() item['item_field'] = hxs.select('//h1[@id="css_id"]/span/text()').extract() return item #這邊看到item = myappItem()與item['item_field']要先到item.py設定好 #return item會把item丟進去pipeline去處理,資料量不多其實這邊寫個file.write就好了

item.py的設定範例


from scrapy.item import Item, Field


class myappItem(Item):
    item_field = Field()

#class要跟spider.py內的myappItem同名, 每個你要抓的item_field都要來設定一下Field()




接著把terminal小黑窗目標移到scrapy.cfg同個位置
執行
scrapy crawl myspider_name
就可以開始抓囉
不要跟我一樣scrapy crawl 檔名浪費好幾分鐘阿XD

等我下次心血來潮再把後面補完QQ







2015年1月23日 星期五

Install scapy with python 2.7 in windows

參考網址
http://www.secdev.org/projects/scapy/doc/installation.html#windows 
得知需要的packages還蠻多的
不過此處列出的都是python 2.5 2.6的package links.

 2.7的找了一下

1. pywin32
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/

2. Winpcap
http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe

3. pypcap
https://code.google.com/p/pypcap/issues/detail?id=36 

4. libdnet
http://dirk-loss.de/scapy/dnet-1.12.win32-py2.7.exe

5. pyreadline
https://pypi.python.org/pypi/pyreadline/2.0

6. scapy
http://bb.secdev.org/scapy/downloads

除了scapy要解壓縮跑python setup.py之外
剩的都是installer沒什麼安裝問題
這篇應該能夠幫助不少人省下找package的時間