dfc643
本帖最后由 dfc643 于 2014-7-31 15:57 编辑

想必大家有部分人是在 VPS 上面开的 Minecraft 服务器,但是对于 Minecraft 来说地图数据简直非常重要。但是一旦数据丢了可不得了。所以呢咱就编写了一个自动上传百度云的 PHP 脚本。适合在 Linux 的服务器上运行。可以自动将数据打包上传至百度网盘。

另外值得一提的是,由于太懒就直接调用系统 shell 了,这样也可以方便改写成 shell 脚本,则可以省去 php 这样的东西了。
另外近期作成 Windows 版本请继续往下看

Linux 软件包要求:
php5 zip 以及 curl cron

Linux 版如何使用:
1、将 mcbkp.php 中的相关目录路径更换成您的相关路径。
2、请填写您的 百度API 的 AccessToken 代码。
3、为 Linux 计划任务 Cron 添加一条新计划任务。

crontab -e 范例:
0 */6 * * * php /root/mcbkp.php #每隔 6 小时自动上传 MC 数据到百度网盘

mcbkp.php 程序代码 (Linux版):
  1. <?php
  2. // MINECRAFT data backup tool
  3. // @ by Norckon

  4. date_default_timezone_set('PRC');

  5. // Backup filename and source path
  6. //   BAKPATH: Where want you storage backup archive.
  7. //   SRCPATH: Where Minecraft server installed.
  8. $bakpath = "/root/mcbackups";
  9. $srcpath = "/root/cauldron";

  10. // Create Zip Archive
  11. //   SRC: Which directories want to compress
  12. //   DST: Where storage Zip Archive
  13. //   MAPNAME: Which map want you backup in Minecraft
  14. //   MODE: How to backup
  15. //      1: Current map only
  16. //      2: Current map and mods
  17. //      3: All the server and data
  18. function CreateArchive($src, $dst, $mapname, $mode) {
  19.         // Create new zip archive file
  20.         switch($mode) {
  21.                 case 1:
  22.                         system("zip -qr $dst $src/$mapname/");
  23.                         break;
  24.                 case 2:
  25.                         system("zip -qr $dst $src/$mapname/ $src/mods/");
  26.                         break;
  27.                 case 3:
  28.                         system("zip -qr $dst $src/");
  29.                         break;
  30.                 default:
  31.                         echo "I don't known which mode you want.";
  32.         }
  33. }

  34. // Remove older backups
  35. function RemoveOld ($path) {
  36.         system("rm -f $path/mcbkp_*.mcb");
  37. }

  38. // Upload to Baidu netdisk
  39. function bdpcsUpload($accesstoken, $path ,$filename) {
  40.         system('curl -k -L -F "file=@'.$path.'" "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&access_token='.$accesstoken.'&path=/apps/fmcbackups/'.$filename.'"');
  41. }

  42. // Main function
  43. function FMain() {
  44.         global $bakpath,$srcpath;
  45.         // Remove all older backups
  46.         RemoveOld($bakpath);
  47.         // Create new backup
  48.         $bkparc = $bakpath."/mcbkp_".date("Y_m_d_H_i_s").".mcb";
  49.         CreateArchive($srcpath, $bkparc, "world", 1);
  50.         // Upload to baidudisk
  51.         // 百度网盘 API 使用方法 :http://www.fcsys.us/webapp/wordpress/?p=1292
  52.         bdpcsUpload("YOUR_ACCESS_TOKEN", $bkparc, "/mcbkp_".date("Y_m_d_H_i_s").".mcb");
  53. }

  54. FMain();
  55. ?>
复制代码
mcbkp.sh (Shell版本):
由于 aa210063654 提供,感谢作者
  1. #!/bin/bash
  2. #debug switch  -xv

  3. #filename : mcbk.sh
  4. #author : nyacat

  5. #settings
  6.   #default var
  7.     backup_path="~/mcbackups"
  8.     server_path="~/cauldron"
  9.     map_name="world"
  10.     backup_mode=1
  11.     pcs_token=""
  12.     pcs_appid=""
  13.     backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`".zip"

  14. #usage
  15. function usage () {
  16.     echo "Usage:"
  17.     echo "    backup mode"
  18.     echo "    $0 -m 1/2/3"
  19.     echo "        1.backup map only"
  20.     echo "        2.backup map and mods"
  21.     echo "        3.backup all files"
  22.     echo
  23.     echo "    show usage"
  24.     echo "    $0 -H"
  25.     echo
  26.     echo "e.g:"
  27.     echo "  $0 -m 1"
  28.     echo
  29.     exit 1
  30.   }

  31. #root user check
  32. #    if [[ $UID -ne 0 ]];
  33. #      then
  34. #        echo "Please run $0 as root."
  35. #        exit 2
  36. #      fi

  37. #usage check
  38.     if [[ -z "$1" ]] || [[ -z "$2" ]] || [ $2 -gt 3 ] || [[ "$1" = "-H" ]]
  39.       then
  40.         usage
  41.       fi

  42. #first,remove older backups
  43.     rm -f ${backup_path}"/minecraft_server_bk*.zip"

  44. #second,create archive
  45.     while getopts "m:H" opts
  46.       do
  47.         case ${opts} in
  48.           m)
  49.             backup_mode=${OPTARG}
  50.           ;;
  51.           H)
  52.             usage
  53.           ;;
  54.           ?)
  55.             usage
  56.           ;;
  57.           *)
  58.             usage
  59.           ;;
  60.         esac
  61.       done

  62.     case ${backup_mode} in
  63.           1)
  64.             backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-map.zip"
  65.             server_path=${server_path}"/"${map_name}
  66.           ;;
  67.           2)
  68.             backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-map_mods.zip"
  69.             server_path=${server_path}"/"${map_name}" "${server_path}"/mods"
  70.           ;;
  71.           3)
  72.             server_path="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-all.zip"
  73.           ;;
  74.           *)
  75.             usage
  76.           ;;
  77.         esac

  78.   if [ -d "$server_path" ]; then
  79.     zip -q -r ${backup_path}"/"${backup_name} ${server_path}
  80.   else
  81.     echo "no such dir"
  82.   fi

  83. #upload to pcs
  84.   if [ -a "${backup_path}"/"${backup_name}" ]&&[ -s "${backup_path}"/"${backup_name}" ]; then
  85.     curl -k -L -F 'file=@'${backup_path}"/"${backup_name} 'https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&access_token='$pcs_token'&path=/apps/'$pcs_appid'/'$backup_name
  86.   else
  87.     echo "no such file"
  88.   fi
复制代码




Windows 版如何使用

1、将压缩包里面的 mcbkp 文件夹与 mcbkp.php 解压到 C 盘根目录
2、在系统中添加环境变量 (见附件中的图)
3、修改 mcbkp.php 中的相关参数,请使用 utf-8 编辑器如 notepad++
4、在控制面板中添加一项计划任务(见附件中的图)
5、下载地址:http://pan.baidu.com/s/1pJt1Ps3

mcbkp.php 程序代码 (Windows版)

  1. <?php
  2. // MINECRAFT 数据备份工具
  3. // @ by Norckon

  4. date_default_timezone_set('PRC');

  5. // 【请先设置】备份文件路径与MC服务器路径设置等相关设置
  6. //   BAKPATH: 你想在何处存储备份文件
  7. //   SRCPATH: MC服务器被安装在何处
  8. //   GMAP   : 你所要备份的地图
  9. //   GMODE  : 备份模式参照下面的说明
  10. //   GTOKEN : 百度开发者的 ACCESS TOKEN
  11. //   GAPPID : 你的PCS的的应用名称,即网盘apps文件夹中的文件夹名

  12. $bakpath = "C:\\mcbkp";
  13. $srcpath = "C:\\cauldron";
  14. $gmap    = "world";
  15. $gmode   = 1;
  16. $gtoken  = "你的ACCESSTOKEN";
  17. $gappid  = "你的PCS的的应用名称";
  18. // 百度网盘 API 使用方法 :http://www.fcsys.us/webapp/wordpress/?p=1292

  19. // 创建压缩档案
  20. //   SRC: 想要压缩哪一些目录
  21. //   DST: 何处存储压缩档
  22. //   MAPNAME: 想要备份MC服务器中的哪一张地图
  23. //   MODE: 怎么备份
  24. //      1: 只备份该地图
  25. //      2: 备份地图与MOD
  26. //      3: 备份所有服务器文件
  27. function CreateArchive($src, $dst, $mapname, $mode) {
  28.         // Create new zip archive file
  29.         switch($mode) {
  30.                 case 1:
  31.                         system("zip -qr $dst $src/$mapname/");
  32.                         break;
  33.                 case 2:
  34.                         system("zip -qr $dst $src/$mapname/ $src/mods/");
  35.                         break;
  36.                 case 3:
  37.                         system("zip -qr $dst $src/");
  38.                         break;
  39.                 default:
  40.                         echo "I don't known which mode you want.";
  41.         }
  42. }

  43. // 删除陈旧备份
  44. function RemoveOld ($path) {
  45.         system("del /f /s /q $path\\mcbkp_*.mcbw");
  46. }

  47. // 上传至百度网盘
  48. function bdpcsUpload($accesstoken, $path ,$appname ,$filename) {
  49.         system('curl -# -k -L -F "file=@'.$path.'" "https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&access_token='.$accesstoken.'&path=/apps/'.$appname.'/'.$filename.'"');
  50. }

  51. // Main function
  52. function FMain() {
  53.         global $bakpath,$srcpath,$gmap,$gmode,$gtoken,$gappid;
  54.         // Remove all older backups
  55.         RemoveOld($bakpath);
  56.         // Create new backup
  57.         $bkparc = $bakpath."\\mcbkp_".date("Y_m_d_H_i_s").".mcbw";
  58.         CreateArchive($srcpath, $bkparc, $gmap, $gmaode);
  59.         // Upload to baidudisk
  60.         bdpcsUpload($gtoken, $bkparc, $gappid, "/mcbkp_".date("Y_m_d_H_i_s").".mcbw");
  61. }

  62. FMain();
  63. ?>
复制代码

这些可能需要一些技术,请多多咨询谷歌或者必应。

by 北极光.Norckon


daijiangbiao
话说我没用过Linux,不知道怎么用。。

815132496
对程序一概不通~~~

Aikawastep
O.O 只能围观。。不懂

Koke_Cacao
网盘很慢的

dfc643
daijiangbiao 发表于 2014-7-27 00:14
话说我没用过Linux,不知道怎么用。。

其实还好啦,都差不多的

dfc643

嗯,怎么说呢,还行吧,美国VPS上传大概是 300K 左右,毕竟是后台运行的,慢点也没关系。

dfc643
Aikawastep 发表于 2014-7-27 00:38
O.O 只能围观。。不懂

嗯谢谢呢

gfyx
网盘还行吧{:10_493:}

1076617170
= =估计那些用家用机开的人 尤其是电信的恐怕没用吧 还有现在大部分人用的是windows系统= =linux系统的话不会用

dfc643
1076617170 发表于 2014-7-29 08:11
= =估计那些用家用机开的人 尤其是电信的恐怕没用吧 还有现在大部分人用的是windows系统= =linux系统的话不 ...

其实 Linux 很简单的啦,稍稍几个命令就行了

1076617170
dfc643 发表于 2014-7-29 09:50
其实 Linux 很简单的啦,稍稍几个命令就行了

表示不懂

aa210063654
- -.mcb....说白了就是zip。。用file一发就知道了,何必换个后缀
而且...不来个usage么,本地脚本应该来个usage才是王道
最后....部分php禁用system函数怎么办

ban.com
具体好麻烦哦

nausicaa
好哈{:10_492:}

dfc643
aa210063654 发表于 2014-7-29 23:45
- -.mcb....说白了就是zip。。用file一发就知道了,何必换个后缀
而且...不来个usage么,本地脚本应该来个u ...

是的呢,所以说了有人能写个 shell 会更好呢,咱不会写 shell 的说

SumCraft
用阿里云的服务器,一天一个快照全不担心。,

aa210063654
dfc643 发表于 2014-7-31 08:53
是的呢,所以说了有人能写个 shell 会更好呢,咱不会写 shell 的说

= =有空的时候帮你搞定一个

aa210063654
dfc643 发表于 2014-7-31 08:53
是的呢,所以说了有人能写个 shell 会更好呢,咱不会写 shell 的说
  1. #!/bin/bash
  2. #debug switch  -xv

  3. #filename : mcbk.sh
  4. #author : nyacat

  5. #settings
  6.   #default var
  7.     backup_path="~/mcbackups"
  8.     server_path="~/cauldron"
  9.     map_name="world"
  10.     backup_mode=1
  11.     pcs_token=""
  12.     pcs_appid=""
  13.     backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`".zip"

  14. #usage
  15. function usage () {
  16.     echo "Usage:"
  17.     echo "    backup mode"
  18.     echo "    $0 -m 1/2/3"
  19.     echo "        1.backup map only"
  20.     echo "        2.backup map and mods"
  21.     echo "        3.backup all files"
  22.     echo
  23.     echo "    show usage"
  24.     echo "    $0 -H"
  25.     echo
  26.     echo "e.g:"
  27.     echo "  $0 -m 1"
  28.     echo
  29.     exit 1
  30.   }

  31. #root user check
  32. #    if [[ $UID -ne 0 ]];
  33. #      then
  34. #        echo "Please run $0 as root."
  35. #        exit 2
  36. #      fi

  37. #usage check
  38.     if [[ -z "$1" ]] || [[ -z "$2" ]] || [ $2 -gt 3 ] || [[ "$1" = "-H" ]]
  39.       then
  40.         usage
  41.       fi

  42. #first,remove older backups
  43.     rm -f ${backup_path}"/minecraft_server_bk*.zip"

  44. #second,create archive
  45.     while getopts "m:H" opts
  46.       do
  47.         case ${opts} in
  48.           m)
  49.             backup_mode=${OPTARG}
  50.           ;;
  51.           H)
  52.             usage
  53.           ;;
  54.           ?)
  55.             usage
  56.           ;;
  57.           *)
  58.             usage
  59.           ;;
  60.         esac
  61.       done

  62.     case ${backup_mode} in
  63.           1)
  64.             backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-map.zip"
  65.             server_path=${server_path}"/"${map_name}
  66.           ;;
  67.           2)
  68.             backup_name="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-map_mods.zip"
  69.             server_path=${server_path}"/"${map_name}" "${server_path}"/mods"
  70.           ;;
  71.           3)
  72.             server_path="minecraft_server_bk-"`date +%Y%m%d_%H%M%S`"-all.zip"
  73.           ;;
  74.           *)
  75.             usage
  76.           ;;
  77.         esac

  78.   if [ -d "$server_path" ]; then
  79.     zip -q -r ${backup_path}"/"${backup_name} ${server_path}
  80.   else
  81.     echo "no such dir"
  82.   fi

  83. #upload to pcs
  84.   if [ -a "${backup_path}"/"${backup_name}" ]&&[ -s "${backup_path}"/"${backup_name}" ]; then
  85.     curl -k -L -F 'file=@'${backup_path}"/"${backup_name} 'https://c.pcs.baidu.com/rest/2.0/pcs/file?method=upload&access_token='$pcs_token'&path=/apps/'$pcs_appid'/'$backup_name
  86.   else
  87.     echo "no such file"
  88.   fi
复制代码

没测试过,写好就仍上来了

第一页 上一页 下一页 最后一页