Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
»ùÓÚPerfectÓÃSwiftÓïÑÔ±àдSlackÁÄÌì»úÆ÷ÈË
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ£º 2017-4-25
  3091  次浏览      30
 

±¾ÏîÄ¿ÊÇרÃÅΪSlackÁÄÌì»úÆ÷È˶¨ÖƵÄÄ£°å·þÎñÆ÷¡£

ÍêÕûµÄÔ´´úÂëÏÂÔØÔÚGithub https://github.com/PerfectServers/SlackBot

ÔÚ±¾ÏîĿģ°åÖУ¬Ò»¸öÁÄÌì»úÆ÷ÈË¿ÉÒÔ¼ÓÈëÊÚȨƵµÀ£¬¶ÁȡƵµÀÄÚËùÓÐÓû§·¢Ë͵ġ°ÇúÆæ¡±²¢¼Ç¼ÔÚ°¸£¬¶øÇÒ¿ÉÒÔÖ±½Ó´ð¸´Óû§µÄÓйØÇúÆæ±ý¸ÉµÄÎÊÌâ¡£

Ô¤±¸ÖªÊ¶

ÔÚÄú¾ö¶¨±àÒë¡¢²âÊÔ»òÕß²¿ÊðÄú×Ô¼ºµÄ»ùÓÚPerfectÈí¼þ¿ò¼ÜÌåϵµÄÁÄÌì»úÆ÷ÈË֮ǰ£¬ÒÔÏ»ù´¡ÖªÊ¶²»¿É»òȱ£º

Perfect »ù´¡

Slack API ÔÚÏߺ¯Êý½Ó¿Ú²Î¿¼

Ìáǰ׼±¸ºÃ¾ßÓÐÓÐЧÓòÃû£¨FQDN£©²¢ÓÉÈÏÖ¤»ú¹¹°ä·¢Ö¤ÊéµÄ·þÎñÆ÷

Perfect Èí¼þÖúÊÖ ¿ÉÒÔÓÃÀ´±àÒëºÍ²âÊÔ¡£ÕâÊÇ¿ÉÑ¡µÄ£¬µ«ÊÇÈç¹ûÄúûÓа²×°ÖúÊÖ£¬Ôò½¨ÒéÄú×ÔÐÐÔÚ±¾µØ¼ÆËã»úÉÏ×¼±¸Ò»¸öUbuntu 16.04 LTS ÐéÄâ·þÎñÆ÷»òÕßDocker¾µÏñ²¢×ÔÐа²×°ºÃSwift 3.0ÒÔÉϰ汾¡£

¿ìËÙÉÏÊÖ

µÚÒ»²½£º¸´ÖƱ¾ÏîÄ¿

ÇëʹÓÃÏÂÁÐÃüÁî¸´ÖÆ±¾ÏîÄ¿£º

$ git clone https://github.com/PerfectServers/SlackBot.git

±¾¹¤³Ì¸ùĿ¼֮ÏÂÓÐÒ»¸ö config.json.sample Îļþ£¬ËùÓÐÄÚÈݶ¼ÊDZØÐëÌîдµÄÅäÖÃÏ

{
"token": "xoxb-ÄúµÄSlackÓ¦ÓóÌÐòͨÐÐÖ¤-TOKENXXXXXXXXXXXXXXXXX",
"bot" : "ÁÄÌì»úÆ÷ÈËÃû³Æ",
"bot_id": "ÁÄÌì»úÆ÷È˱àºÅ",
"client_id": "XXXXXXXX.YYYYYYYYYYÄúµÄÓ¦ÓóÌÐò±àºÅ",
"client_secret": "Ó¦ÓóÌÐòÃÜÂë",
"verify_token": "·´ÏòÑé֤ͨÐÐÖ¤£¬¼´SlackÔÚ·ÃÎÊÄúµÄ·þÎñÆ÷ÊÇÑé֤һϾ¿¾¹ÊDz»ÊÇSlack·¢À´µÄÇëÇó",
"oauth_uri": "/v1/oauth½Ó¿Úº¯ÊýµØÖ·",
"message_uri": "/v1/msg½Ó¿Úº¯ÊýµØÖ·",
"confirm_uri": "/v1/confirm½Ó¿Úº¯ÊýµØÖ·",
"serverName": "yourhost.yourcompany.domainÄúµÄ·þÎñÆ÷ÍêÕûÓòÃû",
"cerPath": "/opt/certificates/yourcertificate.crtÄúµÄ×Ôǩ֤ÊéºÍµÚÈý·½ÈÏÖ¤Ö¤ÊéµÄºÏ²¢Îļþ",
"keyPath": "/opt/certificates/yourcertificate.keyÄúµÄÖ¤Êé˽ÓÐÔ¿³×Îļþ",
"dbPath": "/var/opt/yoursqlite.dbÊý¾Ý¿âÎļþ",
"runAs": "yourUserNameÄúµÄ·þÎñÆ÷ÆÕͨÓû§Ãû",
"port": 443,
"channels": {
"channel1_id": "channel1_nameÐèÒª¼àÌýµÄƵµÀ",
"channel2_id": "channel2_nameÐèÒª¼àÌýµÄƵµÀ"
}
}

ÉÏÊöÎļþµÄËùÓÐÏêϸ±àд˵Ã÷Çë²Î¿¼±¾ÎĺóÐøÄÚÈÝ¡£

µÚ¶þ²½£ºµ½ÄúµÄSlackÍŶÓÉÏ×ÔÐÐ×¢²áÒ»¸öÓ¦ÓóÌÐò

ÔÚÄúµÄ Slack API ÍøÒ³ÉÏ£¬Ñ¡Ôñ ¡°Your Apps¡±´´½¨ÐµÄÓ¦ÓóÌÐò

ÁÄÌì»úÆ÷ÈËÓû§£ºÎªÄúµÄ»úÆ÷ÈËÆðÃû×Ö²¢Ó¦Óõ½ÅäÖãº

Ôö¼ÓȨÏÞ¡£ÔÚ±¾°¸ÀýÖУ¬È¨ÏÞÖÁÉÙ°üÀ¨¡±bot user¡±£¨ÁÄÌì»úÆ÷ÈË£©¡¢¡±channels:history¡±£¨¹«¹²ÆµµÀÀúÊ·£©¡¢¡±channels.read¡±£¨¹«¹²ÆµµÀ¿É¶Á£©¡¢¡±channels.write¡±£¨¹«¹²ÆµµÀ¿Éд£©ºÍ ¡°chart:write:bot¡± £¨»úÆ÷ÈË¿ÉÒÔ·¢ËÍÁÄÌìÐÅÏ¢£©¡£

¶©ÔÄʼþ£º±¾°¸ÀýÐèÒªÖÁÉÙÒÔÏÂʼþÔÚSlackÓ¦ÓóÌÐò¿ØÖÆÌ¨ÖнøÐж©ÔIJÙ×÷£º(1) message.channels£¨¼àÌýƵµÀÏûÏ¢£©; (2) message.im£¨ÊµÏÖ¼´Ê±Í¨ÐÅ£©; (3) reaction_added£¨Ôö¼Ó±íÇ飩; (4) reaction_removed£¨É¾³ý±íÇ飩¡£

ͨ¹ýÉèÖÃÇëÇóURL¼¤»îÉÏÊöʼþ¶©ÔÄ¡£±ÈÈçÄúµÄÁÄÌì»úÆ÷ÈËËùÔÚÖ÷»úÓòÃûΪmyhost.com£¬¶øÇÒ½Ó¿Ú³ÌÐòÈë¿Úµã message_uri ÅäÖÃΪ /v1/msg£¬ÄÇôÇ뽫¸ÃurlÉèÖÃΪhttps://myhost.com/v1/msg¡£??×¢Òâ??ĿǰSlack½öÖ§³ÖHTTPS¼´443¶Ë¿Ú¡£

½«ÄúµÄÓ¦ÓóÌÐò°²×°µ½ÄúµÄÍŶÓÖÐÈ¥¡£

Èç¹ûËùÓй¤×÷Íê³É£¬Ç뽫ÉÏÊöÅäÖÃÐÅÏ¢ÖðÒ»ÊäÈëµ½ÄúµÄconfig.jsonÎļþ£¬ÆäÖÐ tokenÖ¸µÄÊÇ Bot User OAuth Access Token£¨ÁÄÌì»úÆ÷ÈËÊÚȨ·ÃÎÊͨÐÐÖ¤£©

µÚÈý²½£º»ñÈ¡ÁÄÌì»úÆ÷È˱àºÅ£¨¸ÅÄîÓÐÄѶȣ¬²Ù×÷Ðë½÷É÷£©

Slack ÁÄÌì»úÆ÷ÈËÐèÒªÔÚ±à³ÌʱʹÓÃ×Ô¼ºµÄ±àºÅ£¨²»ÊÇÆÁÄ»ÉÏÏÔʾµÄÃû³Æ£©¡£Òª»ñµÃ¸Ã±àºÅÐèÒªÒ»¶¨¼¼ÇÉ£¬Çë×ÐϸÔĶÁÒÔÏÂ˵Ã÷£º

´ò¿ªä¯ÀÀÆ÷µ¼º½ÖÁ users.list Slack API page

ΪÄúµÄÓ¦ÓóÌÐòÑ¡ÔñÊʺϵÄͨÐÐÖ¤²¢µã»÷ÔÚÏß²âÊÔ Test Method

Èç¹û³É¹¦£¬Ôòµã»÷´ò¿ªÔ­Ê¼ÏìÓ¦Á´½Ó(open raw response)£¬¿ÉÒÔ¿´µ½Ò»¸öJSONÊý¾Ý½á¹¹

ÔÚJSON×Ö·û´®ÖÐËÑË÷ÄúµÄÁÄÌì»úÆ÷ÈËÃû³Æ

½«ÕÒµ½µÄÁÄÌì»úÆ÷È˱àºÅ¿½±´µ½Ç°ÎÄÅäÖÃÖÐ

µÚËIJ½£ºÑ¡Ôñ´ý¼à¿ØÆµµÀ£¨¸ÅÄîÓÐÄѶȣ¬²Ù×÷Ðë½÷É÷£©

¸Ã²Ù×÷ʱ¿ÉÑ¡Ïµ«ÊdzöÓÚ°²È«½Ç¶ÈÀ´Ëµ£¬»¹ÊÇÍÆ¼öÍê³ÉµÄ¡£

ËäÈ»ÏàÐÅÐí¶àÁÄÌì»úÆ÷ÈË¿ª·¢É̶¼Ï£ÍûÆä»úÆ÷È˲úÆ·Äܹ»¼ÓÈëµÄƵµÀ»òÕß˽ÁÄȺԽ¶àÔ½ºÃ£¬µ«ÊÇÄú¿ÉÄÜÏ£Íû½«ÁÄÌì»úÆ÷ÈËÏØÖÎÔÚij¼¸¸öÌØ¶¨µÄƵµÀ»òÕßȺÁÄÖС£

ΪÁËʵÏÖÕâ¸öÄ¿±ê£¬Çë²ÉÓÃÏÂÁвÙ×÷£º

´ò¿ªä¯ÀÀÆ÷²¢µ¼º½ÖÁ channels.list Slack API page

Ñ¡ÔñÍŶӿª·¢Í¨ÐÐÖ¤²¢µã»÷²âÊÔ·½·¨ Test Method

Èç¹û²éѯ³É¹¦£¬Çëµã»÷ԭʼÏìÓ¦Êý¾Ý (open raw response) ²é¿´·µ»ØµÄJSONÊý¾Ý¡£

Ñ¡ÔñÐèÒª¼à¿ØµÄƵµÀ²¢¼Ç¼´ý¼à¿ØÆµµÀµÄÃû³ÆºÍ´úÂ루id / name£©£¬²¢½«ÆäÌîдµ½ÄúµÄconfig.json ÎļþÖС£

×¢Òâ Èç¹ûÄúÏ£ÍûÄúµÄÁÄÌì»úÆ÷ÈËÄܹ»·ÃÎÊËùÓÐÆµµÀ£¬ÔòÖ±½Ó½«ÏÂÁдúÂëÕ³Ìùµ½ÄúµÄÔ´³ÌÐòÄÚ¼´¿É£º

Curl("https://slack.com/api/channels.list?token=\(token)") { ret in
do {
guard let b = ret,
let info = try b.jsonDecode() as? [String:Any],
let ok = info["ok"] as? Bool,
let channels = info["channels"] as? [Any] else {
Print("channel parse::ok(fault)")
return nil
}//end guard
guard ok, channels.count > 0 else {
Print("channel parse::ok(\(ok))")
return nil
}//end
channels.forEach { channel in
let ch = channel as? [String: Any] ?? [:]
guard let id = ch["id"] as? String,
let name = ch["name"] as? String else {
return
}//end guard

// CAUTION: Append all channels into the cache
global.channels[id] = name
}//next
}catch(let err) {
Print("parseChannels::\(err)")
return nil
}// end do
}//end curl

µÚÎå²½£º±àÒëºÍ²¿ÊðÁÄÌì»úÆ÷ÈË·þÎñÆ÷

ÔÚ´ËÍÆ¼öʹÓà Perfect Assistant Èí¼þÖúÊÖÍê³ÉËùÓбàÒëºÍ²¿ÊðµÄ×Ô¶¯»¯²Ù×÷¡£

µ«ÊÇ£¬Èç¹ûÄúʹÓõIJ»ÊÇÑÇÂíÑ·AWSµ¯ÐÔ¼ÆËãEC2»òÕ߹ȸèÔÆ£¬ÄÇôÄúÐèÒªÏêϸÁ˽âÕû¸ö°²×°²¿ÊðµÄÏêϸ²½Öè¡£¹¤³Ì¸ùĿ¼ÏÂÓÐÒ»¸ö°²×°½Å±¾¿É¹©²Î¿¼install.sh.sample£º

(1) ÔÚÄú±¾µØµÄ Ubuntu 16.04£¬±ÈÈçÐéÄâ»ú»òÕßDockerÉÏ£¬±àÒë·þÎñÆ÷£¬ÃüÁîÐÐΪ$ swift build -c release ±àÒëΪÕýʽ·¢Ðа汾

(2) ÓÃscpÃüÁ¶þ½øÖÆ¿ÉÖ´Ðеķ¢ÐÐÎļþÉÏ´«µ½·þÎñÆ÷£¨¿ÉÒÔºÍSwiftÔËÐк¯Êý¿âÒ»Æð´ò°üÉÏ´«£©

(3) ½«ÅäÖÃºÃµÄ config.service ºÍ config.json ÎļþÉÏ´«µ½·þÎñÆ÷¡£ÆäÖÐ config.serviceÄ£°åÎļþ¿É²Î¿¼±¾¹¤³Ì¸ùĿ¼Ïµķ¶Àý¡£

(4) ½«ÄúËùÓеÄÖ¤ÊéÎļþ·ÅÖõ½·þÎñÆ÷°²È«¡¢ºÏÀíµÄ·¾¶Ï£¬²¢ÎªÔËÐÐÌṩ×ã¹»µ«°²È«µÄȨÏÞ¡£

(5) ÔÚ·þÎñÆ÷ÉÏÐÞ¸Äconfig.jsonÎļþ²¢±£Ö¤ÆäÖÐËùÓеıäÁ¿£¬Ìرðʱ¸÷¸ö·¾¶£¬±ÈÈçÖ¤Êé·¾¶ºÍÊý¾Ý¿â¶¼ÍêÈ«·ûºÏʵ¼Ê²¿Êð¡£

(6) ͬÑùÈçÓбØÒª£¬ÔÚ·þÎñÆ÷ÉÏÒ²ÐÞ¸Ä config.serviceÒÔÆ¥ÅäËùÓз¾¶¡£

(7) ʹÓÃÃüÁî $ sudo systemctl enable config.service ½«ÄúµÄÐÂÓ¦ÓóÌÐò×¢²áΪLinuxϵͳ·þÎñ£¬ÕâÑù·þÎñÆ÷ÔÚÖØÆôºó¾ÍÄÜ×Ô¶¯ÒÔ¹ÜÀíÔ±·½Ê½Æô¶¯¡£

(8) Æô¶¯·þÎñÆ÷£¬Äú¿ÉÒÔÑ¡ÔñÖØÆôÕû¸ö·þÎñÆ÷£¬»òÕßÔËÐÐ $ sudo systemctl restart slackbotÃüÁîÐе¥¶ÀÆô¶¯Ä¿±ê·þÎñ³ÌÐò£¨¼ÙÉè±àÒëºóµÄ·þÎñÃüÁîÐÐΪ slackbot£©

Èç¹ûûÓÐPerfectÈí¼þÖúÊÖ£¬ÔòÉÏÊöËùÓв½ÖèÒ»ÑùÊÇÓÐһЩÄѶȵģ¬Òò´Ë²Ù×÷ʱÐèÒªÌØ±ðСÐÄ¡£Çë×ÐϸÔĶÁÏÂÁÐÑù±¾Îļþ·¶Àý£º

Config.service ·þÎñ×¢²áÎļþ²Î¿¼·¶Àý

[Unit]
Description=ÄúµÄÁÄÌì»úÆ÷ÈË

[Service]
Type=simple
WorkingDirectory=/var/opt
ExecStart=/path/to/yourApp/PerfectTemplate
Restart=always
PIDFile=/var/run/yourSlackBotApp.pid
Environment="LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/usr/local/lib/swift"

[Install]
WantedBy=multi-user.target

°²×°½Å±¾·¶Àý

# °²×°²¿Êð½Å±¾·¶Àý
# ¼ÙÉèÄúµÄ·þÎñÆ÷Ó¦ÓóÌÐòÃûΪ`slackbot`
# Çë±£Ö¤ÄúµÄ·þÎñÆ÷ÉÏÒѾ­Ìáǰ°²×°ÁËSwiftÔËÐл·¾³£¬±ÈÈç
# LD_LIBRARY_PATH="/usr/lib/yourSwiftInstalationPath"
# ±äÁ¿¶¨ÒåÈçÏ£º
RPO=slackbot
TGZ=/tmp/$RPO.tgz
SVC=$RPO.service
CFG=$RPO.json
APP=/tmp/app.tgz
SERVER=yoursshLoginUserName@yourhost.yourdomain
LOCALVM=your.local.ubuntu.virtual.machine

# Ê×ÏȰÑÔ´´úÂë´ò°ü²¢´«Êäµ½ÐéÄâ»úÉÏ
tar czvf $TGZ Package.swift Sources
scp $TGZ $LOCALVM:/tmp

# ͨ¹ýÐéÄâ»ú½øÐбàÒë
ssh $LOCALVM "cd /tmp;rm -rf $RPO;mkdir $RPO; cd $RPO; tar xzvf $TGZ;swift build -c release;cd .build/release;tar czvf $APP PerfectTemplate *.so"

# È»ºóÔÙ´ÓÐéÄâ»úÉÏÈ¡»Ø±àÒëºÃµÄ¶þ½øÖÆÎļþ²¢ÉÏ´«ÖÁÉú²ú·þÎñÆ÷
scp $LOCALVM:$APP $APP
scp $APP $SERVER:$APP
scp $SVC $SERVER:/tmp/$SVC
scp $CFG $SERVER:/tmp/$CFG

# ÔÚÉú²ú·þÎñÆ÷ÉÏÖ´Ðа²×°²¢½«Ð±àÓ¦ÓóÌÐò×¢²áΪLinux²Ù×÷ϵͳ·þÎñ
ssh $SERVER "cd /opt;sudo -S rm -rf $RPO;sudo -S mkdir $RPO;cd $RPO;sudo -S tar xzvf $APP;sudo -S cp /tmp/$SVC .;sudo -S cp /tmp/$CFG .;sudo -S systemctl disable $RPO;sudo -S systemctl enable /opt/$RPO/$SVC;sudo -S systemctl start $RPO;sudo -S systemctl status $RPO"

µÚÁù²½£º·µ»Øµ½SlackÓ¦ÓóÌÐò¿ØÖÆÌ¨

Ò»µ©ÖØÆô·þÎñÆ÷ºó£¬Çë»Øµ½SlackÓ¦ÓóÌÐòµÄ¿ØÖÆÌ¨ÍøÒ³È·ÈÏÉÏÊö·þÎñÆ÷²¢¼¤»îËùÓй¦ÄÜ£¬ÌرðʱOAuthÅäÖÃÈÏÖ¤Ò³Ãæ£º

Ñé֤ʼþ¶©ÔÄÇëÇó½Ó¿ÚRequest URL

ÏÖÔÚ´ò¿ªSlackÓ¦Ó㬽øÈëÄúµÄÄ¿±êƵµÀ£¬²¢½«»úÆ÷ÈËÑûÇ뵽ƵµÀ¡£×¢Ò⣺ѡÔñÔö¼ÓÒ»¸ö²âÊÔÆµµÀרÃÅÓÃÓÚµ÷ÊÔÁÄÌì»úÆ÷ÈËÊÇÒ»¸öºÃÖ÷Òâ

²âÊÔÁÄÌì»úÆ÷ÈË£¬¿ÉÒÔÖ±½Ó¶ÔËü·¢Æð»á»°ÁÄÌì

   
3091 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ