電話天気予報

プログラムされたボタンを1つ押すことで、携帯電話のスピーカーで天気予報を聞くために仕事をするとき、それは非常に有益な機会になると思いました。 カットの下でどのようにそれをしたかを見てください。





最初に必要なのは、天気予報そのものです。 サイトgismeteo.ruから取得することにしました。

私がやった方法:

私は自分の街を見つけたサイトgismeteo.ruに行きました。

ヘッダーの「Informers」リンクをクリックしました。

開いたページで、「XML形式のデータ」というテキストを見つけ、「コードを取得」ボタンからリンクを取得しました。

したがって、XML形式で新しい予測を取得する方法がわかりました。



次に、さらに処理するために保存する必要があります。

私は自転車を発明せず、2行のbashスクリプトを書きました




Copy Source | Copy HTML #!/bin/bash cd /usr/isp/weather /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml



  1. Copy Source | Copy HTML #!/bin/bash cd /usr/isp/weather /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml



  2. Copy Source | Copy HTML #!/bin/bash cd /usr/isp/weather /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml



  3. Copy Source | Copy HTML #!/bin/bash cd /usr/isp/weather /usr/bin/wget 'http://informer.gismeteo.ru/xml/34214_1.xml' -O ./34214_1.xml







informer.gismeteo.ru/xml/34214_1.xmlは、あなたの都市へのリンクです。 wgetコマンドはXMLをダウンロードし、それを現在のディレクトリのファイル34214_1.xmlに書き込みます。後で必要になります。 予測を常に最新の状態にするには、次のように、cronで実行するためにこのスクリプトを記述する必要があります。


*/60 * * * * /usr/isp/weather/weather_up.sh







AGIを介してアスタリスクとやり取りするPerlで予測アルゴリズムを作成することにしました。 XMLファイルを解析し、次のようなサウンドファイルを再生するためのアスタリスクのコマンドを含む一連の行を標準出力に出力するには、アルゴリズムが必要です。


Copy Source | Copy HTML



  1. EXEC再生天気/ Po_dannym_Gismeteo ""
  2. EXEC再生天気/ tod / dnem ""
  3. EXEC再生天気/ m / 15ogo ""
  4. EXEC再生の天気/バジェット ""
  5. EXEC再生天気/曇り/パスムルノ ""
  6. EXEC Playback天気/降水量/ dozhd '"" <br/>

    EXEC Playback weather / temp_vosduha_sostavit "" <br/> EXEC Playback weather / digits / 20 "" <br/> EXEC Playback weather / digits / 2 "" <br/> EXEC Playback weather / Do "" <br/> EXEC Playback天気/桁/ 20 "" <br/> EXEC再生天気/ gradusov_C "" <br/> EXEC再生天気/ Skorost'_vetra_sostavit ""
  7. EXECプレイバック天気/数字/ 5 ""
  8. EXEC再生天気/実行 ""
  9. EXECプレイバック天気/数字/ 3 ""
  10. EXECプレイバック天気/ metrov_v_sekundu ""
  11. EXEC再生天気/ Atmosfernoe_davlenie_sostavit ""
  12. EXEC再生天気/桁/ 700 ""
  13. EXEC再生天気/桁/ 40 ""
  14. EXEC再生天気/数字/ 7 ""
  15. EXEC再生天気/実行 ""
  16. EXEC再生天気/桁/ 700 ""
  17. EXEC再生天気/桁/ 40 ""
  18. EXECプレイバック天気/数字/ 5 ""
  19. EXEC再生天気/ milimetrov_rtutnogo_stolba ""




お気づきのように、サウンドレコーディングはたくさん準備する必要がありますが、これは一度限りです。



私のバージョンでは、記録されたフレーズの中に「from」という単語があります。 例:Atmosfernoe_davlenie_sostavitは、「大気圧の発生元」と読みます。



実際、XMLの構文解析には、 XML :: Simpleモジュールを使用しました。最も使いやすいように思えました。 XMLタグをスコアリングに必要な行に置き換えるために、リストを適用しました。


Copy Source | Copy HTML



  1. 私の$ date_name = {
  2. 1 => [ "EXEC再生天気\ / m \ / 1ogo \" \ "\ n" ]、
  3. 2 => [ "EXEC再生天気\ / m \ / 2ogo \" \ "\ n" ]、
  4. 3 => [ "EXEC Playback weather \ / m \ / 3ogo \" \ "\ n" ]、
  5. .....


数字を数字を再生するための一連のコマンドに変換するアルゴリズムを使用して、彼はまた車輪を再発明しないことを決め、お金をコピーブックに変換するための既成のアルゴリズムを採用しました(残念ながら私は他の誰かを覚えていません) \ / 1 \ "\" \ n "アルゴリズムが適応されます(多くの時間が節約されます)。

これですべてが明確になると思うので、スクリプトを見てみましょう。




Copy Source | Copy HTML



  1. #!/ usr / bin / perl
  2. 厳格な使用 ;
  3. XMLを使用 ::シンプル;
  4. Data :: Dumperを使用します。
  5. 私の$ date_name = {
  6. 1 => [ "EXEC再生天気\ / m \ / 1ogo \" \ "\ n" ]、
  7. 2 => [ "EXEC再生天気\ / m \ / 2ogo \" \ "\ n" ]、
  8. 3 => [ "EXEC Playback weather \ / m \ / 3ogo \" \ "\ n" ]、
  9. 4 => [ "EXEC Playback weather \ / m \ / 4ogo \" \ "\ n" ]、
  10. 5 => [ "EXEC再生天気\ / m \ / 5ogo \" \ "\ n" ]、
  11. 6 => [ "EXEC Playback weather \ / m \ / 6ogo \" \ "\ n" ]、
  12. 7 => [ "EXEC再生天気\ / m \ / 7ogo \" \ "\ n" ]、
  13. 8 => [ "EXEC Playback weather \ / m \ / 8ogo \" \ "\ n" ]、
  14. 9 => [ "EXEC Playback weather \ / m \ / 9ogo \" \ "\ n" ]、
  15. 10 => [ "EXEC Playback weather \ / m \ / 10ogo \" \ "\ n" ]、
  16. 11 => [ "EXEC Playback weather \ / m \ / 11ogo \" \ "\ n" ]、
  17. 12 => [ "EXEC Playback weather \ / m \ / 12ogo \" \ "\ n" ]、
  18. 13 => [ "EXEC Playback weather \ / m \ / 13ogo \" \ "\ n" ]、
  19. 14 => [ "EXEC Playback weather \ / m \ / 14ogo \" \ "\ n" ]、
  20. 15 => [ "EXEC Playback weather \ / m \ / 15ogo \" \ "\ n" ]、
  21. 16 => [ "EXEC Playback weather \ / m \ / 16ogo \" \ "\ n" ]、
  22. 17 => [ "EXEC Playback weather \ / m \ / 17ogo \" \ "\ n" ]、
  23. 18 => [ "EXEC Playback weather \ / m \ / 18ogo \" \ "\ n" ]、
  24. 19 => [ "EXEC Playback weather \ / m \ / 19ogo \" \ "\ n" ]、
  25. 20 => [ "EXEC Playback weather \ / m \ / 10ogo \" \ "\ n" ]、
  26. 21 => [ "EXEC Playback weather \ / m \ / 21ogo \" \ "\ n" ]、
  27. 22 => [ "EXEC Playback weather \ / m \ / 22ogo \" \ "\ n" ]、
  28. 23 => [ "EXEC Playback weather \ / m \ / 23ogo \" \ "\ n" ]、
  29. 24 => [ "EXEC Playback weather \ / m \ / 24ogo \" \ "\ n" ]、
  30. 25 => [ "EXEC Playback weather \ / m \ / 25ogo \" \ "\ n" ]、
  31. 26 => [ "EXEC Playback weather \ / m \ / 26ogo \" \ "\ n" ]、
  32. 27 => [ "EXEC再生天気\ / m \ / 27ogo \" \ "\ n" ]、
  33. 28 => [ "EXEC Playback weather \ / m \ / 28ogo \" \ "\ n" ]、
  34. 29 => [ "EXEC Playback weather \ / m \ / 29ogo \" \ "\ n" ]、
  35. 30 => [ "EXEC Playback weather \ / m \ / 30ogo \" \ "\ n" ]、
  36. 31 => [ "EXEC Playback weather \ / m \ / 31ogo \" \ "\ n" ]
  37. };
  38. 私の$ hour_name = {
  39. 0 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  40. 1 => [ "EXEC再生天気\ /時間\ / chas \" \ "\ n" ]、
  41. 2 => [ "EXEC再生天気\ /時間\ / chasa \" \ "\ n" ]、
  42. 3 => [ "EXEC再生天気\ /時間\ / chasa \" \ "\ n" ]、
  43. 4 => [ "EXEC再生天気\ /時間\ / chasa \" \ "\ n" ]、
  44. 5 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  45. 6 => [ "EXEC Playback weather \ / hour \ / chasov \" \ "\ n" ]、
  46. 7 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  47. 8 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  48. 9 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  49. 10 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  50. 11 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  51. 12 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  52. 13 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  53. 14 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  54. 15 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  55. 16 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  56. 17 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  57. 18 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  58. 19 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  59. 20 => [ "EXEC再生天気\ /時間\ / chasov \" \ "\ n" ]、
  60. 21 => [ "EXEC Playback weather \ / hour \ / chas \" \ "\ n" ]、
  61. 22 => [ "EXEC再生天気\ /時間\ / chasa \" \ "\ n" ]、
  62. 23 => [ "EXEC再生天気\ /時間\ / chasa \" \ "\ n" ]、
  63. };
  64. 私の$ m_name = {
  65. 1 => [ "EXEC Playback weather \ / m \ / yanvarya \" \ "\ n" ]、
  66. 2 => [ "EXEC Playback weather \ / m \ / fevralya \" \ "\ n" ]、
  67. 3 => [ "EXEC Playback weather \ / m \ / marta \" \ "\ n" ]、
  68. 4 => [ "EXEC Playback weather \ / m \ / aprelya \" \ "\ n" ]、
  69. 5 => [ "EXEC Playback weather \ / m \ / maya \" \ "\ n" ]、
  70. 6 => [ "EXEC Playback weather \ / m \ / iunya \" \ "\ n" ]、
  71. 7 => [ "EXEC Playback weather \ / m \ / iylya \" \ "\ n" ]、
  72. 8 => [ "EXEC Playback weather \ / m \ / avgusta \" \ "\ n" ]、
  73. 9 => [ "EXEC Playback weather \ / m \ / sentyabrya \" \ "\ n" ]、
  74. 10 => [ "EXEC Playback weather \ / m \ / octyabya \" \ "\ n" ]、
  75. 11 => [ "EXEC Playback weather \ / m \ / noyabrya \" \ "\ n" ]、
  76. 12 => [ "EXEC Playback weather \ / m \ / decabrya \" \ "\ n" ]
  77. };
  78. 私の$ tod_name = {
  79. 0 => [ "EXEC再生天気\ / tod \ / noch'u \" \ "\ n" ]、
  80. 1 => [ "EXEC Playback weather \ / tod \ / utrom \" \ "\ n" ]、
  81. 2 => [ "EXEC Playback weather \ / tod \ / dnem \" \ "\ n" ]、
  82. 3 => [ "EXEC Playback weather \ / tod \ / vecherom \" \ "\ n" ]
  83. };
  84. 私の$ cloudiness_name = {
  85. 0 => [ "EXEC Playback weather \ / cloudiness \ / yasno \" \ "\ n" ]、
  86. 1 => [ "EXEC Playback weather \ / cloudiness \ / malooblachno \" \ "\ n" ]、
  87. 2 => [ "EXEC Playback weather \ / cloudiness \ / oblachno \" \ "\ n" ]、
  88. 3 => [ "EXEC Playback weather \ / cloudiness \ / pasmurno \" \ "\ n" ]
  89. };
  90. 私の$降水量名 = {
  91. 4 => [ "EXEC再生天気\ /降水量\ / dozhd '\" \ "\ n" ]、
  92. 5 => [ "EXEC再生天気\ /降水量\ / liven '\" \ "\ n" ]、
  93. 6 => [ "EXEC再生天気\ /降水量\ /スネグ\" \ "\ n" ]、
  94. 7 => [ "EXEC再生天気\ /降水量\ /スネグ\" \ "\ n" ]、
  95. 8 => [ "EXEC再生天気\ /降水量\ / groza \" \ "\ n" ]、
  96. 9 => [ "" ]、
  97. 10 => [ "EXEC再生天気\ /降水量\ / bez_osadkov \" \ "\ n" ]
  98. };
  99. 私の$ wind_direction_name = {
  100. 0 => [ "EXEC Playback weather \ / wind_direction \ / severnyi \" \ "\ n" ]、
  101. 1 => [ "EXEC Playback weather \ / wind_direction \ / severo-vostochnyi \" \ "\ n" ]、
  102. 2 => [ "EXEC Playback weather \ / wind_direction \ / vostochno-uzhnyi \" \ "\ n" ]、
  103. 3 => [ "EXEC再生天気\ / wind_direction \ / ugo-zapadnyi \" \ "\ n" ]
  104. };
  105. my $ xmlWeather = new XML :: Simple(keeproot => 1 、searchpath => "。" 、forcearray => 1 、suppressempty => '' );
  106. my $ xmlData1 = $ xmlWeather- > XMLin( '/usr/isp/weather/34214_1.xml' );
  107. my $ xmlData = $ xmlData1- > {MMWEATHER} [ 0 ]-> {REPORT} [ 0 ]-> {TOWN} [ 0 ]-> {FORECAST};
  108. $ | = 1 ;
  109. while (<STDIN>){
  110. ムシャムシャ( $ _ );
  111. 長さ( $ _ )== 0の 場合、最後;
  112. }
  113. # "Po dannym Gismeteo"
  114. print "EXEC Playback weather \ / Po_dannym_Gismeteo \" \ "\ n" ;
  115. 私の$ i = 0 ;
  116. for$ i = 0 ; $ i < 4 ; $ i ++)
  117. {
  118. print $ tod_name- > { $ xmlData- > [ $ i ]-> {tod}}-> [ 0 ];
  119. print $ date_name- > { $ xmlData- > [ $ i ]-> {day}}-> [ 0 ];
  120. print $ m_name- > { $ xmlData- > [ $ i ]-> {month}}-> [ 0 ];
  121. print "EXEC Playback weather \ / budet \" \ "\ n" ;
  122. print $ cloudiness_name- > { $ xmlData- > [ $ i ]-> {PHENOMENA} [ 0 ]-> {cloudiness}}-> [ 0 ];
  123. print $ precipit_name- > { $ xmlData- > [ $ i ]-> {PHENOMENA} [ 0 ]-> {precipitation}}-> [ 0 ];
  124. #温度
  125. print "EXEC Playback weather \ / temp_vosduha_sostavit \" \ "\ n" ;
  126. print digit_string( $ xmlData- > [ $ i ]-> {TEMPERATURE} [ 0 ]-> {max});
  127. print "EXEC Playback weather \ / Do \" \ "\ n" ;
  128. print digit_string( $ xmlData- > [ $ i ]-> {TEMPERATURE} [ 0 ]-> {min});
  129. print "EXEC Playback weather \ / gradusov_C \" \ "\ n" ;
  130. #ベター
  131. print "EXEC Playback weather \ / Skorost'_vetra_sostavit \" \ "\ n" ;
  132. print digit_string( $ xmlData- > [ $ i ]-> {WIND} [ 0 ]-> {max});
  133. print "EXEC Playback weather \ / Do \" \ "\ n" ;
  134. print digit_string( $ xmlData- > [ $ i ]-> {WIND} [ 0 ]-> {min});
  135. print "EXEC Playback weather \ / metrov_v_sekundu \" \ "\ n" ;
  136. #Atmosfernoe davlenie
  137. print "EXEC Playback weather \ / Atmosfernoe_davlenie_sostavit \" \ "\ n" ;
  138. print digit_string( $ xmlData- > [ $ i ]-> {PRESSURE} [ 0 ]-> {max});
  139. print "EXEC Playback weather \ / Do \" \ "\ n" ;
  140. print digit_string( $ xmlData- > [ $ i ]-> {PRESSURE} [ 0 ]-> {min});
  141. print "EXEC Playback weather \ / milimetrov_rtutnogo_stolba \" \ "\ n" ;
  142. }
  143. #================================================= ==================================================
  144. #================================================= ==================================================
  145. #================================================= ==================================================
  146. sub digit_string {
  147. 私の$桁 =シフト;
  148. ローカル$ _ ;
  149. $桁 =〜s / ^-+ //;の 場合$記号 = 1
  150. $ digit =〜s #^ 0 + ##;
  151. my( $ b_dig$ s_dig )=(split(m/[,.†/、 $ digit2 ));
  152. $ s_dig = "" ;
  153. #「余分な」文字から数値を消去します(100_000,43)
  154. if (定義済み$ b_dig および長さ$ b_dig ){
  155. #$ b_dig =〜s#[^ \ d] ## sg;
  156. } else {
  157. $ b_dig = "" ;
  158. }
  159. if (定義された$ s_dig および長さ$ s_dig ){
  160. #$ s_dig =〜s#[^ \ d] ## sg;
  161. } else {
  162. $ s_dig = "" ;
  163. }
  164. #丸めの結果として、ペニーを切り上げる
  165. #ルーブルを取得し、b_dig(ルーブル)に追加します
  166. #if(sprintf( '%0.2f'、 "0. $ s_dig")== 1){
  167. #$ b_dig ++;
  168. #$ s_dig = '00';
  169. #} else {
  170. #$ s_dig = substr(sprintf( '%0.2f'、 "0. $ s_dig")、2);
  171. #}
  172. my @ array = split( //、($ b_dig || 0));
  173. #数値のビット容量を決定します。
  174. my $ class_id = int(スカラー(@ array )/ 3 );
  175. $ class_id ++ if (スカラー(@ 配列 )% 3 );
  176. #サポートされていない容量。
  177. $ class_id > 5の 場合、 $ digitを 返します。
  178. 私の$ digits_name = {
  179. 0 => [ "EXEC Playback weather \ / digits \ / 0 \" \ "\ n""""" ]、
  180. 1 => [[ "EXEC Playback weather \ / digits \ / 1 \" \ "\ n""EXEC Playback weather \ / digits \ / 1a \" \ "\ n" ]、 "EXEC Playback weather \ / digits \ / 10 \ "\" \ n "" EXEC再生天気\ /数字\ / 100 \ "\" \ n " ]、
  181. 2 => [[ "EXEC Playback weather \ / digits \ / 2 \" \ "\ n""EXEC Playback weather \ / digits \ / 2e \" \ "\ n" ]、 "EXEC Playback weather \ / digits \ / 20 \ "\" \ n "" EXEC再生天気\ /数字\ / 200 \ "\" \ n " ]、
  182. 3 => [ "EXEC再生天気\ /数字\ / 3 \" \ "\ n""EXEC再生天気\ /数字\ / 30 \" \ "\ n""EXEC再生天気\ /数字\ / 300 \ "\" \ n " ]、
  183. 4 => [ "EXEC再生天気\ /数字\ / 4 \" \ "\ n""EXEC再生天気\ /数字\ / 40 \" \ "\ n""EXEC再生天気\ /数字\ / 400 \ "\" \ n " ]、
  184. 5 => [ "EXEC再生天気\ /数字\ / 5 \" \ "\ n""EXEC再生天気\ /数字\ / 50 \" \ "\ n""EXEC再生天気\ /数字\ / 500 \ "\" \ n " ]、
  185. 6 => [ "EXEC再生天気\ /数字\ / 6 \" \ "\ n""EXEC再生天気\ /数字\ / 60 \" \ "\ n""EXEC再生天気\ /数字\ / 600 \ "\" \ n " ]、
  186. 7 => [ "EXEC再生天気\ /数字\ / 7 \" \ "\ n""EXEC再生天気\ /数字\ / 70 \" \ "\ n""EXEC再生天気\ /数字\ / 700 \ "\" \ n " ]、
  187. 8 => [ "EXEC再生天気\ /数字\ / 8 \" \ "\ n""EXEC再生天気\ /数字\ / 80 \" \ "\ n""EXEC再生天気\ /数字\ / 800 \ "\" \ n " ]、
  188. 9 => [ "EXEC再生天気\ /数字\ / 9 \" \ "\ n""EXEC再生天気\ /数字\ / 90 \" \ "\ n""EXEC再生天気\ /数字\ / 900 \ "\" \ n " ]、
  189. };
  190. 私の$ dec_digits = {
  191. 11 => "EXEC再生天気\ /数字\ / 11 \" \ "\ n"
  192. 12 => "EXEC再生天気\ /数字\ / 12 \" \ "\ n"
  193. 13 => "EXEC再生天気\ /数字\ / 13 \" \ "\ n"
  194. 14 => "EXEC再生天気\ /数字\ / 14 \" \ "\ n"
  195. 15 => "EXEC再生天気\ /数字\ / 15 \" \ "\ n"
  196. 16 => "EXEC再生天気\ /数字\ / 16 \" \ "\ n"
  197. 17 => "EXEC再生天気\ /数字\ / 17 \" \ "\ n"
  198. 18 => "EXEC再生天気\ /数字\ / 18 \" \ "\ n"
  199. 19 => "EXEC再生天気\ /数字\ / 19 \" \ "\ n"
  200. };
  201. 私の$ digits_class = {
  202. '-1' => [ 1"""""" ]、
  203. 0 => [ 0"""""" ]、
  204. 1 => [ 1"EXEC再生天気\ /数字\ / tysiacha \" \ "\ n""EXEC再生天気\ /数字\ / tysiach \" \ "\ n""EXEC再生天気\ /数字\ / tysiachi \ "\" \ n " ]、
  205. 2 => [ 0"EXEC再生天気\ /数字\ /百万\" \ "\ n""EXEC再生天気\ /数字\ / millionov \" \ "\ n""EXEC再生天気\ /数字\ / milliona \ "\" \ n " ]、
  206. 3 => [ 0"EXEC再生天気\ /数字\ /ミリアード\" \ "\ n""EXEC再生天気\ /数字\ /ミリアルドフ\" \ "\ n""EXEC再生天気\ /数字\ /ミリアルダ\ "\" \ n " ]、
  207. 4 => [ 0"EXEC再生天気\ /数字\ /兆\" \ "\ n"「EXEC再生天気\ /数字\ / trillionov \ "\" \ n "" EXEC再生天気\ /数字\ / trilliona \ "\" \ n " ]、
  208. };
  209. #左の「3」の長さを決定する...
  210. 私の$ id = 0 ;
  211. except((scalar @ array )% 3 ){
  212. $ id = 2 ;
  213. } else {
  214. $ id =((scalar @ array )% 3-1 ;
  215. }
  216. 私の$ str = '' ;
  217. 私の$ sub_str = 0 ;
  218. 私の$ tvar = 0 ;
  219. if$ array [ 0 ] == 0 ){
  220. #ルーブルがまだゼロの場合、「ゼロルーブル」と書き込み、
  221. #必要ない場合は、次の行をコメントアウトしてください...
  222. $ str 。= $ digits_name- > { '0' }-> [ 0 ]。 $ digits_class- > { '0' }-> [ 2 ]。 '' ;
  223. } else {
  224. while (defined( $ _ = shift @ array )){
  225. if$ _ > 0 ){
  226. if$ _ == 1 および $ id == 1 ){
  227. #sub num()で使用する量を数える
  228. $ sub_str + = $ _ * 10 ;
  229. if (defined( $ tvar = shift @ arrayand $ tvar > 0 ){
  230. $ str 。= $ dec_digits- > { $ _$ tvar };
  231. $ sub_str + = $ tvar ;
  232. $ id- ;
  233. } else {
  234. unshift @ array$ tvar ;
  235. if (ref $ digits_name- > { $ _ }-> [ $ id ] eq 'ARRAY' ){
  236. #$ str。= $ digits_name-> {$ _}-> [$ id]-> [$ digits_class-> {$ class_id-1}-> [0]];
  237. } else {
  238. $ str 。= $ digits_name- > { $ _ }-> [ $ id ];
  239. }
  240. }
  241. } else {
  242. #sub num()で使用する量を数える
  243. $ sub_str + =( $ _ *( 10 ** $ id ));
  244. if (ref $ digits_name- > { $ _ }-> [ $ id ] eq 'ARRAY' ){
  245. $ str 。= $ digits_name- > { $ _ }-> [ $ id ]-> [ $ digits_class- > { $ class_id - 1 }-> [ 0 ]];
  246. } else {
  247. $ str 。= $ digits_name- > { $ _ }-> [ $ id ];
  248. }
  249. }
  250. $ str 。= '' ;
  251. }
  252. if (- $ id ==- 1 ){
  253. $ id = 2 ;
  254. $ class_id- ;
  255. if$ sub_str > 0 ){
  256. $ str 。= num( $ sub_str 、(@ { $ digits_class- > { $ class_id }})[ 1 .. 3 ])。 '' ;
  257. } elsif( $ class_id == 0 ){
  258. $ str 。= $ digits_class- > { $ class_id }-> [ 2 ]。 '' ;
  259. }
  260. $ sub_str = 0 ;
  261. }
  262. }
  263. }
  264. $ str 。= $ s_dig num( $ s_dig 、(@ { $ digits_class- > { '-1' }})[ 1 .. 3 ]);
  265. if (定義された$記号 ){
  266. $ str = "EXEC再生天気\ /数字/マイナス\" \ "\ n" $ str ;
  267. }
  268. $ s_dig = substr( $ str0、1 );
  269. #使用された場合、より簡単であることが判明
  270. #ロケールとucfirstを使用するよりも...
  271. IF
  272. substr( $ str0、1$ s_dig );
  273. }
  274. $ strを 返し ます
  275. }
  276. #お金の数を言葉の行に変換するときに使用されます..
  277. sub num {
  278. 私の$ d1 = $ _ [ 0 ]% 10 ;
  279. my $ d2 = int(( $ _ [ 0 ]% 100 )/ 10 );
  280. return $ _ [ 2 ] if (( $ d2 == 1または$ d1 =〜/ [ 05-9 ] /));
  281. return $ _ [ 1 ] if$ d1 == 1 );
  282. return $ _ [ 3 ];
  283. }




次に、このスクリプトの使用方法をアスタリスクに教える必要があります。 これを行うには、目的のコンテキストのextensions.confファイルで、次のように記述します。




Copy Source | Copy HTML



  1. exten => XXXX、1、待機(1)
  2. exten => XXXX、n、回答()
  3. exten => XXXX、n、Agi(/usr/isp/weather/weather.pl)
  4. exten => XXXX、n、ハングアップ()


Weatherサービスに割り当てるXXXX番号はどこにありますか。 例えば、私はDigiumボードを持っています。これを使って、誰でもどんな電話からでも電話で天気を知ることができます。

以上です!



All Articles