2016-04-29 38 views
1

是否有方法使用Splunks Python SDK更新模塊化輸入腳本的輸入參數?Splunk模塊化輸入更新參數

def stream_events(self, inputs, ew): 
    twitter = OAuth1Session(api_key, api_secret, access_token, access_token_secret) 

    for input_name, input_item in inputs.inputs.iteritems(): 
     hashtag = input_item["hashtag"] 
     since_id = input_item["since_id"] 

     if since_id == "0": 
      url = "https://api.twitter.com/1.1/search/tweets.json?q=%%23%s" % hashtag 
     else: 
      url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag) 

     r = twitter.get(url) 

     output = json.loads(r.content) 
     if len(output["statuses"]) != 0: 

      for tweet in output["statuses"]: 
       print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"]) 

我將since_id參數設置爲0,然後我第一次調用Twitter API。之後,我得到的結果我想更新since_id參數與Twitter搜索元數據(output["search_metadata"]["max_id"]

感謝max_id領域的任何幫助

回答

1

使用檢查點來存儲since_id你在這種情況下最好的選擇。粗略地說,你的代碼應該看起來很類似。我已經離開了TODO文件IO部分。對於GitHub提交C#SDK的JavaScript &中的示例,我們在檢查點文件中存儲了每行1個提交。對於你的情況,你只需要在文件中存儲since_id。請注意,每個輸入實例都應該有它自己的檢查點文件(即:每個輸入都映射到一個hashtag,所以你應該爲每個hashtag建立一個檢查點文件)。

diff --git a/program.py b/program.py 
index 95f69de..defb535 100644 
--- a/program.py 
+++ b/program.py 
@@ -1,14 +1,17 @@ 
def stream_events(self, inputs, ew): 
    twitter = OAuth1Session(api_key, api_secret, access_token, access_token_secret) 

+ checkpoint_dir = inputs.metadata['checkpoint_dir'] 
+ 
    for input_name, input_item in inputs.inputs.iteritems(): 
     hashtag = input_item["hashtag"] 
     since_id = input_item["since_id"] 

-  if since_id == "0": 
-   url = "https://api.twitter.com/1.1/search/tweets.json?q=%%23%s" % hashtag 
-  else: 
-   url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag) 
+  checkpoint_file_path = os.path.join(checkpoint_dir, hashtag + ".txt") 
+ 
+  since_id = "" # TODO: read from the file 
+   
+  url = "https://api.twitter.com/1.1/search/tweets.json?since_id=%s&q=%%23%s" % (since_id, hashtag) 

     r = twitter.get(url) 

@@ -16,4 +19,6 @@ def stream_events(self, inputs, ew): 
     if len(output["statuses"]) != 0: 

      for tweet in output["statuses"]: 
-    print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"]) 
\ No newline at end of file 
+    print_xml_stream(input_name, json.dumps(tweet), tweet["created_at"]) 
+ 
+  # TODO: on success, update the contents of the checkpoint file 
\ No newline at end of file 
+1

謝謝你的幫助。我還有一個簡短的問題。你知道爲什麼有些推文是重複的嗎? – BlackSalt

+0

@BlackSalt是由Twitter API還是Splunk?無論哪種方式,我認爲保證唯一推文的最佳方法是在檢查點文件中爲每條推文存儲一個唯一值。例如,「splunk/status/727553815617114113」,但可能只是該數字足夠獨特。您必須閱讀Twitter API文檔才能確定 – Shakeel