当前位置:首页 > PHP教程 > php高级应用 > 列表

SAE域名绑定设置服务器宕机时自动修改A记录并飞信通知

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-27 09:05:01 浏览: 评论:0 

SAE域名绑定之后,一般是用CNAME方式将域名绑定到应用中。但是有时候我们需要用到A记录(比如说根域名,虽然在DNSPOD上可以设置CNAME记录,但很可能会影响到MX记录),而SAE的IP地址经常改变,ping应用二级域名得到的IP没多久就失效了(前些天网站因此几天打不开都没发现,我用的是教育网,自己能打开,但是电信线路变了)。还好DNSPOD有个功能叫D监控,可以帮你监控网站能否正常打开。如果发现宕机,DNSPOD会用邮件、短信、微信等方式提醒你。这里用到的是它的另一个通知方式,那就是URL回调“通过DNSPod 提供的D监控 URL 回调功能,您可以让宕机或恢复信息提交到您指定的 URL 上,从而更加灵活地处理各种通知信息。”

我们可以通过宕机之后的URL回调取得相关参数,并通过DNSPOD API实现自动修改记录的功能,再通过飞信发送宕机通知。

代码在后面,先说设置方法:

1.点此下载代码,修改其中的参数为你自己的。

2.将代码上传到网站。

3.在DNSPOD开启D监控,在通知设置中回调URL一栏填入monitorCallback.php的地址,如http://blog.gimhoy.com/monitorCallback.php?rHost=hipic.sinaapp.com.其中rHost是SAE的二级域名。并设置回调密钥。

4.Enjoy~ dnspod-monitor-callback

monitorCallback.php,代码如下:

  1. /* 
  2. * Copyright 2007-2014 Gimhoy Studio. 
  3. * 
  4. * @author Gimhoy 
  5. * @email contact@gimhoy.com 
  6. * @version 1.0.0 
  7. */ 
  8. $rHost = $_GET['rHost']; // SAE二级域名 
  9. if(emptyempty($rHost)) $rHost = 'sinaapp.com'
  10. $logName = 'monitorLog.txt'//log 文件名 
  11. $logStorDomain = 'log'// Storage Domain 
  12. $FetionNum = ''//飞信登陆号码 
  13. $FetionPwd = ''//飞信登陆密码 
  14. $MobileNum = ''//接收通知短信的号码 
  15. $callback_key = 'MYKEY'// 添加监控时设置的密钥 
  16.  
  17. $monitor_id = $_POST['monitor_id']; // 监控编号 
  18. $domain_id = $_POST['domain_id']; // 域名编号 
  19. $domain = $_POST['domain']; // 域名名称 
  20. $record_id = $_POST['record_id']; // 记录编号 
  21. $sub_domain = $_POST['sub_domain']; // 主机名称 
  22. $record_line = $_POST['record_line']; // 记录线路 
  23. $ip = $_POST['ip']; // 记录IP 
  24. $status = $_POST['status']; // 当前状态 
  25. $status_code = $_POST['status_code']; // 状态代码 
  26. $reason = $_POST['reason']; // 宕机原因 
  27. $created_at = $_POST['created_at']; // 发生时间 
  28. $checksum = $_POST['checksum']; // 校检代码 
  29.  
  30. if (md5($monitor_id$domain_id$record_id$callback_key$created_at) != $checksum) { 
  31. // 非法请求 
  32. echo 'BAD REQUEST'
  33. else { 
  34. // 开始处理 
  35. if ($status == 'Warn' || $status == 'Ok') { 
  36. // 宕机恢复 
  37. $msg = date("Y-m-d H:i:s").' '.$sub_domain.'.'.$domain."(".$record_line." ".$ip.")宕机恢复"
  38. elseif ($status == 'Down') { 
  39. // 宕机 
  40. $msg = date("Y-m-d H:i:s").' '.$sub_domain.'.'.$domain."(".$record_line." ".$ip.")在".$created_at."宕机。宕机原因:".$reason."可用IP:"
  41. $ips = @gethostbyname($rHost); 
  42. include_once 'dnspod.class.php'
  43. $newIP = $ips
  44. $data = array
  45. 'domain_id' => $domain_id
  46. 'record_id' => $record_id
  47. 'sub_domain' => $sub_domain
  48. 'record_type' => 'A'
  49. 'record_line' => $record_line
  50. 'ttl' => '600'
  51. 'value' => $newIP 
  52. ); 
  53. $dnspod = new dnspod(); 
  54. $response = $dnspod->api_call('Record.Modify'$data); 
  55. if(isset($response['status']['code']) && $response['status']['code'] == 1) { 
  56. $msg = $msg.$newIP.'(已切换)'
  57. else { 
  58. $msg = $msg.$newIP.'(切换失败,错误代码'.$response['status']['code'].')'
  59. //飞信通知 
  60. require_once 'Fetion.class.php'
  61. $fetion = new PHPFetion($FetionNum$FetionPwd); 
  62. $result = $fetion->send($MobileNum$msg); 
  63. if(strpos($result'短信发送成功!') || strpos($result'发送消息成功!')) { $r = "成功。";}else{$r = "失败。";} 
  64. $s = new SaeStorage(); 
  65. $content = $s -> read($logStorDomain$logName); 
  66. $content = $content.$msg.'。飞信通知'.$r.' 
  67. ';//开源代码phpfensi.com 
  68. $s -> write($logStorDomain$logName$content); 
  69.  
  70. // 处理完成 
  71. echo 'DONE'

dnspod.class.php

  1. /* 
  2. * DNSPod API PHP Web 示例 
  3. * http://www.phpfensi.com/ 
  4. * 
  5. * Copyright 2011, Kexian Li 
  6. * Released under the MIT, BSD, and GPL Licenses. 
  7. * 
  8. */ 
  9.  
  10. class dnspod { 
  11. public function api_call($api$data) { 
  12. if ($api == '' || !is_array($data)) { 
  13. exit('内部错误:参数错误'); 
  14. $api = 'https://dnsapi.cn/' . $api
  15. $data = array_merge($dataarray('login_email' => 'DNSPOD登陆账号''login_password' => 'DNSPOD登陆密码''format' => 'json''lang' => 'cn''error_on_empty' => 'yes')); 
  16.  
  17. $result = $this->post_data($api$data); 
  18.  
  19. if (!$result) { 
  20. exit('内部错误:调用失败'); 
  21. $results = @json_decode($result, 1); 
  22. if (!is_array($results)) { 
  23. exit('内部错误:返回错误'); 
  24. if ($results['status']['code'] != 1) { 
  25. exit($results['status']['message']); 
  26. return $results
  27. private function post_data($url$data) { 
  28. if ($url == '' || !is_array($data)) { 
  29. return false; 
  30. $ch = @curl_init(); 
  31. if (!$ch) { 
  32. exit('内部错误:服务器不支持CURL'); 
  33. curl_setopt($ch, CURLOPT_URL, $url); 
  34. curl_setopt($ch, CURLOPT_POST, 1); 
  35. curl_setopt($ch, CURLOPT_HEADER, 0); 
  36. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  37. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
  38. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
  39. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 
  40. curl_setopt($ch, CURLOPT_USERAGENT, 'Gimhoy Monitor/1.0 (contact@gimhoy.com)'); 
  41. $result = curl_exec($ch); 
  42. curl_close($ch); 
  43. return $result

Fetion.class.php,代码如下:

  1. header('Content-Type: text/html; charset=utf-8'); 
  2. /** 
  3. * PHP飞信发送类 
  4. * @author quanhengzhuang 
  5. * @version 1.5.0 
  6. */ 
  7. class PHPFetion { 
  8. /** 
  9. * 发送者手机号 
  10. * @var string 
  11. */ 
  12. protected $_mobile
  13. /** 
  14. * 飞信密码 
  15. * @param string 
  16. */ 
  17. protected $_password
  18. /** 
  19. * Cookie字符串 
  20. * @param string 
  21. */ 
  22. protected $_cookie = ''
  23. /** 
  24. * Uid缓存 
  25. * @var array 
  26. */ 
  27. protected $_uids = array(); 
  28. /** 
  29. * csrfToken 
  30. * @param string 
  31. */ 
  32. protected $_csrfToten = null; 
  33. /** 
  34. * 构造函数 
  35. * @param string $mobile 手机号(登录者) 
  36. * @param string $password 飞信密码 
  37. */ 
  38. public function __construct($mobile$password
  39. if ($mobile === '' || $password === ''
  40. return
  41. $this->_mobile = $mobile
  42. $this->_password = $password
  43. $this->_login(); 
  44. /** 
  45. * 析构函数 
  46. */ 
  47. public function __destruct() { 
  48. $this->_logout(); 
  49. /** 
  50. * 登录 
  51. * @return string 
  52. */ 
  53. protected function _login() 
  54. $uri = '/huc/user/space/login.do?m=submit&fr=space'
  55. $data = 'mobilenum='.$this->_mobile.'&password='.urlencode($this->_password); 
  56. $result = $this->_postWithCookie($uri$data); 
  57.  
  58. //解析Cookie 
  59. preg_match_all('/.*?rnSet-Cookie: (.*?);.*?/si'$result$matches); 
  60. if (isset($matches[1])) 
  61. $this->_cookie = implode('; '$matches[1]); 
  62. $result = $this->_postWithCookie('/im/login/cklogin.action'''); 
  63.  
  64. return $result
  65. /** 
  66. * 获取csrfToken,给好友发飞信时需要这个字段 
  67. * @param string $uid 飞信ID 
  68. * @return string 
  69. */ 
  70. protected function _getCsrfToken($uid
  71. if ($this->_csrfToten === null) 
  72. $uri = '/im/chat/toinputMsg.action?touserid='.$uid
  73. $result = $this->_postWithCookie($uri''); 
  74. preg_match('/name="csrfToken".*?value="(.*?)"/'$result$matches); 
  75.  
  76. $this->_csrfToten = isset($matches[1]) ? $matches[1] : ''
  77.  
  78. return $this->_csrfToten; 
  79.  
  80. /** 
  81. * 向指定的手机号发送飞信 
  82. * @param string $mobile 手机号(接收者) 
  83. * @param string $message 短信内容 
  84. * @return string 
  85. */ 
  86. public function send($mobile$message) { 
  87. if($message === '') { 
  88. return ''
  89. // 判断是给自己发还是给好友发 
  90. if($mobile === $this->_mobile) { 
  91. return $this->_toMyself($message); 
  92. else if(strlen($mobile)===11){ 
  93. $uid = $this->_getUid($mobile); 
  94. else { 
  95. $uid=$mobile
  96. return $uid === '' ? $this->_addFriend($mobile) : $this->_toUid($uid$message); 
  97. protected function _getname() { 
  98. $uri = '/im/index/index.action'
  99. $result = $this->_postWithCookie($uri'#'); 
  100. // 匹配 
  101. preg_match('/(.*?)</a>/si'$result$matches); 
  102. return $matches[2]; 
  103. /* 
  104. * 通过手机号增加好友 
  105. * @param string $number 手机号(要加的好友手机) 
  106. * @param string $nickname 你的名字,出现在对方的验证短信里 
  107. * @param string $buddylist 分组,默认为空 
  108. * @param string $localName 好友屏显名 
  109. * @return string 
  110. */ 
  111. protected function _addFriend($number) { 
  112. $uri = '/im/user/insertfriendsubmit.action'
  113. $data = 'nickname='. urlencode($this->_getname()).'&buddylist=1&localName=&number='$number .'&type=0'
  114. $result = $this->_postWithCookie($uri$data); 
  115. return $result
  116. /** 
  117. * 获取飞信ID 
  118. * @param string $mobile 手机号 
  119. * @return string 
  120. */ 
  121. protected function _getUid($mobile
  122. if (emptyempty($this->_uids[$mobile])) 
  123. $uri = '/im/index/searchOtherInfoList.action'
  124. $data = 'searchText='.$mobile
  125. $result = $this->_postWithCookie($uri$data); 
  126. //匹配 
  127. preg_match('/toinputMsg.action?touserid=(d+)/si'$result$matches); 
  128.  
  129. $this->_uids[$mobile] = isset($matches[1]) ? $matches[1] : ''
  130. return $this->_uids[$mobile]; 
  131. /** 
  132. * 向好友发送飞信 
  133. * @param string $uid 飞信ID 
  134. * @param string $message 短信内容 
  135. * @return string 
  136. */ 
  137. protected function _toUid($uid$message) { 
  138. $uri = '/im/chat/sendMsg.action?touserid='.$uid
  139. $csrfToken = $this->_getCsrfToken($uid); 
  140. $data = 'msg='.urlencode($message).'&csrfToken='.$csrfToken
  141. $result = $this->_postWithCookie($uri$data); 
  142. return $result
  143. /** 
  144. * 给自己发飞信 
  145. * @param string $message 
  146. * @return string 
  147. */ 
  148. protected function _toMyself($message) { 
  149. $uri = '/im/user/sendMsgToMyselfs.action'
  150. $result = $this->_postWithCookie($uri'msg='.urlencode($message)); 
  151. return $result
  152. /** 
  153. * 退出飞信 
  154. * @return string 
  155. */ 
  156. protected function _logout() { 
  157. $uri = '/im/index/logoutsubmit.action'
  158. $result = $this->_postWithCookie($uri''); 
  159. return $result
  160. protected function getgroup() { 
  161. $uri = '/im/index/index.action'
  162. $data = 'type=group'
  163. $result = $this->_postWithCookie($uri$data); 
  164. // 匹配 
  165. preg_match_all('/contactlistView.action?idContactList=(d+)/si'$result$matches); 
  166. foreach($matches[1] as $k=>$v){ 
  167. if$k== 0 ){ 
  168. $min = $v
  169. $max = $v
  170. }else if($v!=9998&&$v!=9999){ 
  171. $min = min($min,$v); 
  172. $max = max($max,$v); 
  173. return $max
  174. public function getyou1() { 
  175. $list=$this->getgroup(); 
  176. for($i=0;$i<=$list;$i++){ 
  177. $uri = '/im/index/contactlistView.action'
  178. $data = 'idContactList='.$i.'&type=group'
  179. $result = $this->_postWithCookie($uri$data); 
  180. preg_match('/(.*?)|(.*?)((.*?)/(.*?))/si'$result$listn); 
  181. if(!$listn[2]){continue;} 
  182. $shuchu.=str_replace(" ","",$listn[2])."(".$listn[4].")n"
  183. preg_match('/共(d+)页/si'$result$zpage); 
  184. preg_match('/共(d+)</a>页/si'$result$dpage); 
  185. isset($zpage[1]) ? $page=$zpage[1] : $page=$dpage[4]; 
  186. for($j=1;$j<=$page;$j++){ 
  187. $uri = '/im/index/contactlistView.action'
  188. $data = 'idContactList='.$i.'&page='.$j
  189. $result = $this->_postWithCookie($uri$data); 
  190. preg_match_all('/(.*?)</a>/si'$result$matches); 
  191. if(!$matches[1][0]){break;} 
  192. for($x=0;$x<=9;$x++){ 
  193. if(!$matches[1][$x]){continue;} 
  194. $shuchu.=$matches[1][$x]." ".str_replace(" ","",$matches[3][$x])."n"
  195. return $shuchu
  196. public function getyou() { 
  197. $list=$this->getgroup(); 
  198. for($i=0;$i<=$list;$i++){ 
  199. $uri = '/im/index/contactlistView.action'
  200. $data = 'idContactList='.$i.'&type=group'
  201. $result = $this->_postWithCookie($uri$data); 
  202. preg_match('/(.*?)|(.*?)((.*?)/(.*?))/si'$result$listn); 
  203. if(!$listn[2]){continue;} 
  204. $shuchu.=str_replace(" ","",$listn[2])."(".$listn[4].")n"
  205. preg_match('/共(d+)页/si'$result$zpage); 
  206. preg_match('/共(d+)</a>页/si'$result$dpage); 
  207. isset($zpage[1]) ? $page=$zpage[1] : $page=$dpage[4]; 
  208. for($j=1;$j<=$page;$j++){ 
  209. $uri = '/im/index/contactlistView.action'
  210. $data = 'idContactList='.$i.'&page='.$j
  211. $result = $this->_postWithCookie($uri$data); 
  212. preg_match_all('/(.*?)</a>/si'$result$matches); 
  213. if(!$matches[1][0]){break;} 
  214. for($x=0;$x<=9;$x++){ 
  215. if(!$matches[1][$x]){continue;} 
  216. $shuchu.=$matches[1][$x]." ".str_replace(" ","",$matches[3][$x])."n"
  217. return $shuchu
  218. /** 
  219. * 携带Cookie向f.10086.cn发送POST请求 
  220. * @param string $uri 
  221. * @param string $data 
  222. */ 
  223. protected function _postWithCookie($uri$data
  224. $fp = fsockopen('f.10086.cn', 80); 
  225. fputs($fp"POST $uri HTTP/1.1rn"); 
  226. fputs($fp"Host: f.10086.cnrn"); 
  227. fputs($fp"Cookie: {$this->_cookie}rn"); 
  228. fputs($fp"Content-Type: application/x-www-form-urlencodedrn"); 
  229. fputs($fp"User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1rn"); 
  230. fputs($fp"Content-Length: ".strlen($data)."rn"); 
  231. fputs($fp"Connection: closernrn"); 
  232. fputs($fp$data); 
  233.  
  234. $result = ''
  235. while (!feof($fp)) 
  236. $result .= fgets($fp); 
  237.  
  238. fclose($fp); 
  239.  
  240. return $result

Tags: SAE域名 SAE绑定设置 修改A记录

分享到: