2017-04-03 61 views
2

我試圖從Telegram API(而不是bot API)獲取最新消息。我目前正在使用messages.getHistory,但它從頭開始返回所有消息。如果我收到新消息(自登錄以來)也可以。如何從Telegram API獲取最新/新消息

到目前爲止,我最好的選擇是讀取所有消息,然後跟蹤偏移量,以免再次讀取相同的消息,但這太慢且資源昂貴。

+0

您如何設置TCP連接?你是在輪詢數據,還是在收聽來自電報服務器的傳入數據? –

+0

我的連接沒有問題,我可以完全檢索信息。這不是一個聊天機器人(即沒有輪詢模式或webhook模式),但我這樣做的方式是輪詢服務器的前20條消息,然後繼續前進,直到沒有消息。但重點是,我不需要舊的消息 - 我只需要新的消息,在我登錄 –

+0

之後,我要求了一個不同的理由大衛。我知道這不是一個聊天機器人。從電報API獲取實時更新有一個更簡單的方法。看到我下面提出的解決方案,它適用於我 –

回答

1

從Telegram API獲取實時更新有一個更簡單的方法。

如果您將TCP連接設置爲非輪詢,那麼只要您的電報帳戶有更新,就會將消息推送給您。

這消除了你提到的成本,你根本沒有得到任何重複。

對於我的電報的客戶我已經通過簡單地在啓動時運行此成功做到了這一點:

TL.invokewithlayer(layer, TL.initconnection(app_id, device_model, system_version, app_version, lang_code, TL.help_getconfig)) 

然後,我只是從連接的TCP套接字處理傳入的數據,因爲它到達。

+0

它可以工作,但我需要更多的幫助。我使用的是電報鏈接foor node.js,所以看起來我們是一致的。對不起,但我在api上找不到任何最新的電報資料。所以有兩個問題; 1-如何設置非輪詢模式2-我應該使用什麼方法來獲取消息?如果我按照你說的方式設置它,只有新消息被推送到messages.getHistory? –

+0

你甚至不需要發送任何消息。一旦你的TCP套接字或連接被設置爲所謂的主動模式,那麼可用的字節將被推送給你。 –

+0

語音通話等電報的最新版本是65層。您可以在這裏得到scheme.tl:https://raw.githubusercontent.com/telegramdesktop/tdesktop/dev/Telegram/Resources/scheme.tl –

2

查爾斯的回答指出了我的正確方向。對於那些有興趣在Node.js的版本,我設法得到它的工作通過電報-Link模塊和設置connectionType到TCP:

var telegramLink = require('telegram.link')(); 

// set the environment 
var app = { 
    // NOTE: if you FORK the project you MUST use your APP ID. 
    // Otherwise YOUR APPLICATION WILL BE BLOCKED BY TELEGRAM 
    // You can obtain your own APP ID for your application here: https://my.telegram.org 
    id: 12345, 
    hash: 'somehashcode', 
    version: require('../package.json').version, 
    lang: 'en', 
    deviceModel: os.type().replace('Darwin', 'OS_X'), 
    systemVersion: os.platform() + '/' + os.release(), 
    connectionType: 'TCP' 
}; 

//var primaryDC = telegramLink.TEST_PRIMARY_DC; 
var primaryDC = telegramLink.PROD_PRIMARY_DC; 

... 

telegramLink.createClient(app, dataCenter, function() { 
... 

簡單點就是,將其更改爲TCP會給你想要的效果,你會得到消息的registerOnUpdates推到你:

clientProxy.getClient().account.updateStatus(false).then(function() { 
    clientProxy.getClient().registerOnUpdates(function(update) { 
     console.log('update', update.toPrintable()); 

     clientProxy.getClient().messages.receivedMessages(update.id, function(err) { console.log(err); }); 
    }); 
... 

注重receivedMessages - 如果你不叫這個做,那麼報文將無法收到任何新的更新。如果receivedMessages未在您的報文鏈接中定義,請將以下代碼添加到lib/api/messages.js中:

// *** 
// messages.**receivedMessages(max_id, [callback])** 

// Return a Promise to Confirms receipt of messages by a client, cancels PUSH-notification sending. 

// [Click here for more details](https://core.telegram.org/method/messages.receivedMessages) 
Messages.prototype.receivedMessages = function(max_id, callback) { 
    return utility.callService(api.service.messages.receivedMessages, this.client, this.client._channel, callback, arguments); 
}; 
+0

感謝你的API文檔缺乏的,而你解決一個共同的PB –

+0

你知道,如果我們可以使用telegram.link節點接收通道封郵件?我不能讓它工作@大衛 –

+0

@GuilhemFry我還沒有現在這樣做了一段時間,但我沒有時間;是的,我們可以,而且它沒什麼特別的 –