2016-10-22 7 views
1

私はfail2ban禁止を報告するために電報のロボットを書いています。それは急いで書かれた、非常にシンプルで汚いですが、単一の電報のユーザーへのメッセージを報告するために使用することができます。私の開発マシン上でJSONの代わりにHTMLを返すテレグラム

var TelegramBot = require('node-telegram-bot-api'); 
var fs = require('fs'); 

var store = { 
    get: function (key) { 
     return fs.readFileSync(__dirname + '/' + key, { encoding: 'utf-8' }); 
    }, 

    set: function (key, value) { 
     fs.writeFileSync(__dirname + '/' + key, value, { encoding: 'utf-8' }); 
    } 
}; 

var token = store.get('token'); 
var args = process.argv.slice(2); 

if (args.length == 0) { 
    console.error('No mode specified'); 
    process.exit(0); 
} 

TelegramBot.prototype.unregisterText = function (regexp) { 
    for (var i = 0; i < bot.textRegexpCallbacks.length; ++i) { 
     if (bot.textRegexpCallbacks[i].regexp.toString() == regexp) { 
      bot.textRegexpCallbacks.splice(i, 1); 
      return; 
     }   
    } 
}; 

fs.appendFileSync(__dirname + '/logs', 
    '[' + (new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')) + '] ' 
     + args.join(' ') + '\n', 
    { encoding: 'utf-8' }); 

switch (args[0]) { 
    case 'setup': 
     var bot = new TelegramBot(token, { polling: true }); 
     var step = 'none'; 

     bot.onText(/\/setup/, function (msg, match) { 
      var fromId = msg.from.id; 
      step = 'setup-started'; 
      bot.sendMessage(fromId, 'Starting setup. Please enter the verification key.'); 

      bot.onText(/(.+)/, function (msg, match) { 
       if (step == 'setup-started') { 
        var key = match[1]; 
        var verification = store.get('key'); 
        if (key == verification) { 
         store.set('owner', msg.from.id); 
         step = 'verified'; 
         bot.sendMessage(msg.from.id, 'Correct. Setup complete.'); 
        } else { 
         step = 'none'; 
         bot.unregisterText(/(.+)/); 
         bot.sendMessage(msg.from.id, 'Wrong. Setup aborted.'); 
        } 
       } 
      }); 
     }); 

     break; 

    case 'report': 
     var bot = new TelegramBot(token, { polling: false }); 
     var owner = store.get('owner'); 
     var subject = args[1]; 

     if (subject == 'message') { 
      var message = args.slice(2).join(' '); 
      bot.sendMessage(owner, message); 
     } else if (subject == 'file') { 
      var content = fs.readFileSync(args[2], { encoding: 'utf-8' }); 
      bot.sendMessage(owner, content); 
     } 

     break; 

    default: 
     console.error('Unrecognized mode', args[0]); 
     break; 
} 

それが正常に動作します。私は呼び出す:

node bot.js report message whatever message i want 

そして、私は電報で「何でもほしいメッセージを」受け取った。しかし、いったん私はデジタル海洋のvpsでそれをgitted、それはもはや働いた。それは問題が電報ライブラリである判明:

Unhandled rejection Error: Error parsing Telegram response: <!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title>Bots: An introduction for developers</title> 
    ... 

明らかに代わりにJSONのHTMLページを返します...私も同じエンドポイント(api.telegram.org/bothash/sendMessage)とを連絡してみました私のvpsでカールし、それはjsonを返しました(私は何もパラメータを送信しなかったので、エラーメッセージで、しかしまだjson)。

これはどうして起こるかわかりません。どんな助け?

+0

あなたはあなたのリモートVPN上で 'npm install'をやったのですか? – walialu

+0

はい、そうでなければ私はnode-telegram-bot-apiを持っていません – Totem

+0

あなたのローカル環境でそれを実行した場合、gitはノードモジュールフォルダを追加し、コミットしてリモートでチェックアウトします。そして、これは確かにこの奇妙な振る舞いを説明するでしょう。 – walialu

答えて

1

VPN上にトークンを含むファイルがないか、トークンが間違っているようです。

あなたが自分でそれを確認することができます:あなたはapi.telegram.org/{token}/sendMessageにリクエストを行うと

、および{token}が間違っている、それはあなたがあなたの質問に言及したHTMLに応答する、this pageにリダイレクトされます。

store.getstore.get関数の動作をファイルとトークンと共にデバッグして、正しいものを使用していることを確認する必要があります。

また、正確なボットトークンを指定するために、他のTelegram APIメソッドを使用する前にbot.getMe()を実行することをおすすめします。

+0

私はすでに私がトークンを持っていることを確認しました。トークンが存在し、有効です。私はそれを私の開発者マシンのものと比較しました。まったく同じです。私は試してみますgetMe() – Totem

+0

トークンの最後に改行文字がありました。トークンファイルで削除した後でも改行文字がありました。 trim()は問題を解決しましたu.q – Totem

関連する問題