Twitter v2 搜尋端點現在包含一個「計數」端點,該端點傳回符合推文的時間序列總數。
該專案充當 Twitter 高級和企業搜尋 API 的包裝器,提供命令列實用程式和 Python 庫。漂亮的文檔可以在這裡看到。
jq
)。searchtweets
庫位於 Pypi 上:
pip install searchtweets
或者您可以透過以下方式在本機安裝開發版本
git clone https://github.com/twitterdev/search-tweets-python
cd search-tweets-python
pip install -e .
進階搜尋 API 和企業搜尋 API 使用不同的身份驗證方法,我們嘗試提供一種無縫的方式來處理所有客戶的身份驗證。我們知道憑證可能很棘手或煩人 - 請完整閱讀本文。
高級客戶端將需要bearer_token
和endpoint
欄位;企業客戶端需要username
、 password
和endpoint
。如果您不指定account_type
,我們會嘗試識別帳戶類型並聲明有關此行為的警告。
對於高級搜尋產品,我們使用僅應用程式身份驗證,並且不記名令牌不會在過期時間內傳遞。您可以提供: - 您的應用程式金鑰和秘密(庫將處理不記名令牌身份驗證) - 您自己獲得的不記名令牌
許多開發人員可能會發現提供應用程式金鑰和秘密更簡單,並讓該庫為您管理不記名令牌的生成。請參閱此處以了解高級身份驗證方法的概述。
我們支援基於 YAML 檔案的方法和環境變數來儲存憑證,並透過合理的預設值提供靈活的處理。
對於高級客戶,最簡單的憑證文件應如下所示:
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
consumer_key : <CONSUMER_KEY>
consumer_secret : <CONSUMER_SECRET>
對於企業客戶來說,最簡單的憑證文件應該是這樣的:
search_tweets_api :
account_type : enterprise
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
By default, this library expects this file at "~/.twitter_keys.yaml"
, but you can pass the relevant location as needed, either with the --credential-file
flag for the command-line app or as demonstrated below in a Python程式.
上述兩個範例都不需要特殊的命令列參數或程式內參數。除非另有指定,但憑證解析方法將尋找名為search_tweets_api
的 YAML 鍵。
對於擁有多個端點和/或搜尋產品的開發人員,您可以將所有憑證保存在相同檔案中並指定要使用的特定金鑰。 --credential-file-key
在命令列應用程式中指定此行為。一個例子:
search_tweets_30_day_dev :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
consumer_key : <KEY>
consumer_secret : <SECRET>
(optional) bearer_token : <TOKEN>
search_tweets_30_day_prod :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
search_tweets_fullarchive_dev :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
search_tweets_fullarchive_prod :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
bearer_token : <TOKEN>
如果您想要或需要透過環境變數傳遞憑證,您可以為您的產品設定以下適當的變數:
導出 SEARCHTWEETS_ENDPOINT= 導出 SEARCHTWEETS_USERNAME= 匯出 SEARCHTWEETS_PASSWORD= 導出 SEARCHTWEETS_BEARER_TOKEN= 導出 SEARCHTWEETS_ACCOUNT_TYPE= 導出 SEARCHTWEETS_CONSUMER_KEY= 導出 SEARCHTWEETS_CONSUMER_SECRET=
如果load_credentials
函數無法從 YAML 檔案載入字段,它將嘗試尋找這些變量,並且如果已解析這些憑證,它將覆蓋 YAML 檔案中作為環境變數存在的任何憑證。可以透過將load_credentials
參數env_overwrite
設定為False
來變更此行為。
以下單元格示範了 Python 庫中的憑證處理。
from searchtweets import load_credentials
load_credentials ( filename = "./search_tweets_creds_example.yaml" ,
yaml_key = "search_tweets_ent_example" ,
env_overwrite = False )
{'用戶名': '<MY_USERNAME>', '密碼': '<我的密碼>', '端點':'<MY_ENDPOINT>'}
load_credentials ( filename = "./search_tweets_creds_example.yaml" ,
yaml_key = "search_tweets_premium_example" ,
env_overwrite = False )
{'bearer_token': '<A_VERY_LONG_MAGIC_STRING>', '端點':'https://api.twitter.com/1.1/tweets/search/30day/dev.json', 'extra_headers_dict':無}
如果我們設定環境變量,無論 YAML 檔案是否有效或是否存在,程式都會尋找它們。
import os
os . environ [ "SEARCHTWEETS_USERNAME" ] = "<ENV_USERNAME>"
os . environ [ "SEARCHTWEETS_PASSWORD" ] = "<ENV_PW>"
os . environ [ "SEARCHTWEETS_ENDPOINT" ] = "<https://endpoint>"
load_credentials ( filename = "nothing_here.yaml" , yaml_key = "no_key_here" )
無法讀取文件nothing_here.yaml 解析 YAML 檔案時發生錯誤;搜尋有效的環境變數
{'用戶名': '<ENV_USERNAME>', '密碼': '<ENV_PW>', '端點':'<https://端點>'}
標誌:
--credential-file <FILENAME>
--credential-file-key <KEY>
--env-overwrite
用於從命令列應用程式控制憑證行為。
該庫包含一個應用程式search_tweets.py
,可提供對推文的快速存取。當您使用pip
安裝此軟體包時, search_tweets.py
會全域安裝。該檔案位於tools/
目錄中,供那些想要在本地運行的人使用。
請注意, --results-per-call
標誌指定 API 的參數( maxResults
,每次呼叫傳回的結果),而不是作為從此程式傳回的結果數的硬性最大值。參數--max-results
定義從給定呼叫傳回的最大結果數。所有範例均假設您的憑證已在預設位置 - .twitter_keys.yaml
或環境變數中正確設定。
將 json 結果串流到 stdout 而不儲存
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--print-stream
將 json 結果串流到 stdout 並儲存到文件
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--print-stream
儲存到文件而不輸出
search_tweets.py
--max-results 100
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--filename-prefix beyonce_geo
--no-print-stream
可以使用--extra-headers
參數和表示額外標頭字典的 JSON 格式字串從命令列指定一個或多個自訂標頭:
search_tweets.py
--filter-rule " beyonce has:hashtags "
--extra-headers ' {"<MY_HEADER_KEY>":"<MY_HEADER_VALUE>"} '
選項可以透過設定檔(ini 或 YAML)傳遞。範例檔案可以在tools/api_config_example.config
或./tools/api_yaml_example.yaml
檔案中找到,可能如下所示:
[search_rules]
from_date = 2017-06-01
to_date = 2017-09-01
pt_rule = beyonce has:geo
[search_params]
results_per_call = 500
max_results = 500
[output_params]
save_file = True
filename_prefix = beyonce
results_per_file = 10000000
或者這個:
search_rules :
from-date : 2017-06-01
to-date : 2017-09-01 01:01
pt-rule : kanye
search_params :
results-per-call : 500
max-results : 500
output_params :
save_file : True
filename_prefix : kanye
results_per_file : 10000000
可以在設定檔中的特定憑證金鑰下指定自訂標頭:
search_tweets_api :
account_type : premium
endpoint : <FULL_URL_OF_ENDPOINT>
username : <USERNAME>
password : <PW>
extra_headers :
<MY_HEADER_KEY> : <MY_HEADER_VALUE>
將設定檔與命令列公用程式結合使用時,您需要透過--config-file
參數指定設定檔。附加的命令列參數將被添加到設定檔 args 中,或覆寫設定檔 args(如果指定並存在)。
例子:
search_tweets.py --config-檔案 myapiconfig.config --無列印串流
完整選項如下:
$ search_tweets.py -h 用法:search_tweets.py [-h] [--credential-file CREDENTIAL_FILE] [--憑證文件金鑰 CREDENTIAL_YAML_KEY] [--env-overwrite ENV_OVERWRITE] [--設定檔 CONFIG_FILENAME] [--帳戶類型{進階版,企業}] [--計數桶 COUNT_BUCKET] [--開始日期時間 FROM_DATE] [--結束日期時間 TO_DATE] [--過濾規則 PT_RULE] [--每次呼叫結果 RESULTS_PER_CALL] [--最大結果 MAX_RESULTS] [--最大頁數 MAX_PAGES] [--每個文件結果RESULTS_PER_FILE] [--檔名前綴 FILENAME_PREFIX] [--無列印流] [--列印流] [--額外標頭 EXTRA_HEADERS] [--調試] 可選參數: -h, --help 顯示此說明訊息並退出 --憑證文件 CREDENTIAL_FILE 用於保存您的 yaml 檔案的位置 證書。 --憑證檔案金鑰 CREDENTIAL_YAML_KEY 用於此會話的憑證文件中的金鑰 證書。預設為 search_tweets_api --env-overwrite ENV_OVERWRITE 使用任何設定覆蓋 YAML 解析的憑證 環境變數。請參閱 API 文件或自述文件 細節。 --config 檔案 CONFIG_FILENAME 包含所有參數的設定檔。遠一點,更容易 使用比命令列參數版本。 找到文件後,將從那裡填入所有參數。 剩餘的命令列參數將否決找到的參數 在設定檔中。 --帳號類型 {進階、企業} 您使用的帳戶類型 --count-bucket COUNT_BUCKET 設定此項目以發出“計數”請求。計數端點的儲存桶大小。選項:、天、小時、 分鐘。 --開始日期時間 FROM_DATE 日期時間視窗的開始,格式“YYYY-mm-DDTHH:MM” (預設值:-30 天) --結束日期時間 TO_DATE 日期時間視窗結束,格式“YYYY-mm-DDTHH:MM” (預設:最近日期) --過濾規則 PT_RULE PowerTrack 過濾規則(請參閱:http://support.gnip.com/c 客戶/入口網站/文章/901152-powertrack-operators) --每次呼叫結果 RESULTS_PER_CALL 每次呼叫傳回的結果數(預設 100;最大 500) - 對應於 API 中的「maxResults」。如果使用「--count-bucket」發出「counts」請求,則忽略此參數。 --最大結果 MAX_RESULTS 為此返回的推文或計數的最大數量 會話(預設為 500) --最大頁數 MAX_PAGES 為此使用的最大頁面數/API 呼叫數 會議。 --每個文件結果RESULTS_PER_FILE 每個文件保存的最大推文數。 --檔名前綴 FILENAME_PREFIX tweet json 資料所在檔案名稱的前綴 儲存。 --no-print-stream 停用列印串流 --print-stream 將推文流印到標準輸出 --extra-headers EXTRA_HEADERS JSON 格式的 str 表示附加的字典 請求標頭 --debug 列印所有資訊和警告訊息
對於進階版和企業版用戶端來說,在 Python 程式中使用 API 都很簡單。
我們假設憑證位於預設位置~/.twitter_keys.yaml
。
from searchtweets import ResultStream , gen_rule_payload , load_credentials
enterprise_search_args = load_credentials ( "~/.twitter_keys.yaml" ,
yaml_key = "search_tweets_enterprise" ,
env_overwrite = False )
premium_search_args = load_credentials ( "~/.twitter_keys.yaml" ,
yaml_key = "search_tweets_premium" ,
env_overwrite = False )
有一個函數可以將搜尋 API 規則格式化為有效的 json 查詢,稱為gen_rule_payload
。它具有合理的預設值,例如每次呼叫拉取的推文數量多於預設的100 條(但請注意,沙盒環境此處最多只能有100 條,因此如果出現錯誤,請檢查此項目) ,不包括日期。討論產生搜尋規則的細節超出了這些範例的範圍;我鼓勵您查看文件以了解其中的細微差別,但現在讓我們看看規則是什麼樣的。
rule = gen_rule_payload ( "beyonce" , results_per_call = 100 ) # testing with a sandbox account
print ( rule )
{“查詢”:“碧昂絲”,“maxResults”:100}
此規則將符合其中包含文字beyonce
的推文。
從這一點來看,與API互動的方式有兩種。有一種快速方法可以將少量推文收集到記憶體中,該方法需要較少的思考和知識,以及與ResultStream
物件的互動(稍後將介紹)。
我們將使用search_args
變數來支援 API 的配置點。該物件還採用有效的 PowerTrack 規則,並具有在推文和 API 呼叫數量達到限制時切斷搜尋的選項。
我們將使用collect_results
函數,它有三個參數。
對於其餘範例,請根據您的使用情況將參數變更為 premium 或 enterprise。
讓我們看看情況如何:
from searchtweets import collect_results
tweets = collect_results ( rule ,
max_results = 100 ,
result_stream_args = enterprise_search_args ) # change this if you need to
預設情況下,Tweet 有效負載被延遲解析為Tweet
物件。大量推文屬性可直接使用,如下所示:
[ print ( tweet . all_text , end = ' n n ' ) for tweet in tweets [ 0 : 10 ]];
Jay-Z&今晚晚餐時,碧昂絲坐在我們對面,有一次,我與碧昂絲進行了眼神交流。我的四肢變成了果凍,我無法再說出一個連貫的句子。我已經看見了主的眼睛。 碧昂絲和它並不接近。 https://t.co/UdOU9oUtuW 你可能猜到了…碧昂絲的標誌永遠是我的狗屎。 碧昂絲何時收養了一隻狗? https://t.co/U571HyLG4F 等等,你不能只對碧昂絲這樣做 https://t.co/3p14DocGqA 為什麼你們還要繼續用蕾哈娜和碧昂絲的gif 來宣傳節目,而你們卻讓貝3 次失去了她應得的同一個獎項,並讓蕾哈娜除了背上的衣服什麼也沒有離開? https://t.co/w38QpH0wma 30) 有人告訴你你看起來像碧昂絲 https://t.co/Vo4Z7bfSCi 我最愛的碧昂絲 https://t.co/f9Jp600l2B 碧昂絲是必要的。 Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce 現在正在播放 IF I WAS A BOY - BEYONCE.mp3 by ! 我想在死前看看碧昂絲的最後一部
[ print ( tweet . created_at_datetime ) for tweet in tweets [ 0 : 10 ]];
2018-01-17 00:08:50 2018-01-17 00:08:49 2018-01-17 00:08:44 2018-01-17 00:08:42 2018-01-17 00:08:42 2018-01-17 00:08:42 2018-01-17 00:08:40 2018-01-17 00:08:38 2018-01-17 00:08:37 2018-01-17 00:08:37
[ print ( tweet . generator . get ( "name" )) for tweet in tweets [ 0 : 10 ]];
iPhone 版推特 iPhone 版推特 iPhone 版推特 iPhone 版推特 iPhone 版推特 iPhone 版推特 安卓版推特 iPhone 版推特 通話時間專業版 iPhone 版推特
瞧,我們有一些推文。對於互動式環境以及您不關心在單次載入中收集資料或不需要直接對推文流或計數進行操作的其他情況,我建議使用此便利功能。
ResultStream 物件將由search_args
提供支持,並採用規則和其他配置參數,包括頁面數量的硬停止以限制 API 呼叫的使用。
rs = ResultStream ( rule_payload = rule ,
max_results = 500 ,
max_pages = 1 ,
** premium_search_args )
print ( rs )
結果流: { “用戶名”:空, “端點”:“https://api.twitter.com/1.1/tweets/search/30day/dev.json”, 「規則有效負載」:{ "query":"碧昂絲", 「最大結果」:100 }, 「推文」:正確, 「最大結果」:500 }
有一個函數.stream
可以無縫處理給定查詢的請求和分頁。它返回一個生成器,為了獲取 500 條提到beyonce
推文,我們可以這樣做:
tweets = list ( rs . stream ())
使用我們的推文解析器延遲解析推文,因此推文資料很容易被提取。
# using unidecode to prevent emoji/accents printing
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
溫柔的索科羅 kkkkkkkkkk 碧昂絲 https://t.co/kJ9zubvKuf Jay-Z&今晚晚餐時,碧昂絲坐在我們對面,有一次,我與碧昂絲進行了眼神交流。我的四肢變成了果凍,我無法再說出一個連貫的句子。我已經看見了主的眼睛。 碧昂絲和它並不接近。 https://t.co/UdOU9oUtuW 你可能猜到了…碧昂絲的標誌永遠是我的狗屎。 碧昂絲何時收養了一隻狗? https://t.co/U571HyLG4F 等等,你不能只對碧昂絲這樣做 https://t.co/3p14DocGqA 為什麼你們還要繼續用蕾哈娜和碧昂絲的gif 來宣傳節目,而你們卻讓貝3 次失去了她應得的同一個獎項,並讓蕾哈娜除了背上的衣服什麼也沒有離開? https://t.co/w38QpH0wma 30) 有人告訴你你看起來像碧昂絲 https://t.co/Vo4Z7bfSCi 我最愛的碧昂絲 https://t.co/f9Jp600l2B 碧昂絲是必要的。 Que diosa @TiniStoessel https://t.co/gadVJbehQZ Joanne Pearce 現在正在播放 IF I WAS A BOY - BEYONCE.mp3 by !
我們也可以使用搜尋 API 計數端點來取得與我們的規則相符的推文計數。每個請求將返回最多30 天的結果,每個計數請求可以按分鐘、每小時或每天進行。底層ResultStream
物件將處理將端點轉換為計數端點,並且在製定使用它的規則時必須指定count_bucket
參數。
這個過程與抓取推文非常相似,但有一些細微的差別。
警告 - 進階沙箱環境無法存取搜尋 API 計數端點。
count_rule = gen_rule_payload ( "beyonce" , count_bucket = "day" )
counts = collect_results ( count_rule , result_stream_args = enterprise_search_args )
我們的結果非常簡單並且可以快速使用。
counts
[{'count': 366, 'timePeriod': '201801170000'}, {'count': 44580, 'timePeriod': '201801160000'}, {'count': 61932, 'timePeriod': '201801150000'}, {'count': 59678, 'timePeriod': '201801140000'}, {'count': 44014, 'timePeriod': '201801130000'}, {'count': 46607, 'timePeriod': '201801120000'}, {'count': 41523, 'timePeriod': '201801110000'}, {'count': 47056, 'timePeriod': '201801100000'}, {'count': 65506, 'timePeriod': '201801090000'}, {'count': 95251, 'timePeriod': '201801080000'}, {'count': 162883, 'timePeriod': '201801070000'}, {'count': 106344, 'timePeriod': '201801060000'}, {'count': 93542, 'timePeriod': '201801050000'}, {'count': 110415, 'timePeriod': '201801040000'}, {'count': 127523, 'timePeriod': '201801030000'}, {'count': 131952, 'timePeriod': '201801020000'}, {'count': 176157, 'timePeriod': '201801010000'}, {'count': 57229, 'timePeriod': '201712310000'}, {'count': 72277, 'timePeriod': '201712300000'}, {'count': 72051, 'timePeriod': '201712290000'}, {'count': 76371, 'timePeriod': '201712280000'}, {'count': 61578, 'timePeriod': '201712270000'}, {'count': 55118, 'timePeriod': '201712260000'}, {'count': 59115, 'timePeriod': '201712250000'}, {'count': 106219, 'timePeriod': '201712240000'}, {'count': 114732, 'timePeriod': '201712230000'}, {'count': 73327, 'timePeriod': '201712220000'}, {'count': 89171, 'timePeriod': '201712210000'}, {'count': 192381, 'timePeriod': '201712200000'}, {'count': 85554, 'timePeriod': '201712190000'}, {'count': 57829, 'timePeriod': '201712180000'}]
請注意,這僅適用於完整存檔搜尋選項,我的帳戶只能透過企業選項使用該選項。完整的檔案搜尋可能需要不同的端點或存取方法;請參閱您的開發者控制台以了解詳細資訊。
讓我們制定一條新規則並傳遞它這次的日期。
gen_rule_payload
採用以下形式的時間戳記:
YYYYmmDDHHMM
YYYY-mm-DD
(將轉換為午夜 UTC (00:00)YYYY-mm-DD HH:MM
YYYY-mm-DDTHH:MM
注意 - 所有推文均以 UTC 時間儲存。
rule = gen_rule_payload ( "from:jack" ,
from_date = "2017-09-01" , #UTC 2017-09-01 00:00
to_date = "2017-10-30" , #UTC 2017-10-30 00:00
results_per_call = 500 )
print ( rule )
{“查詢”:“來自:傑克”,“maxResults”:500,“toDate”:“201710300000”,“fromDate”:“201709010000”}
tweets = collect_results ( rule , max_results = 500 , result_stream_args = enterprise_search_args )
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
更明確我們的私人資訊政策和執行情況。努力在產品中建立盡可能多的直接上下文 https://t.co/IrwBexPrBA 為了更清楚地說明我們的私人資訊政策,我們添加了具體範例,說明什麼是/不是違規,並深入了解我們需要什麼才能從服務中刪除此類內容。 https://t.co/NGx5hh2tTQ 11 月 22 日啟動暴力團體和仇恨圖像/符號政策 https://t.co/NaWuBPxyO5 我們將於 11 月 22 日推出針對暴力團體、仇恨圖像和仇恨符號的政策。在此處查看有關我們政策制定流程的更多資訊? https://t.co/wx3EeH39BI @WillStick @lizkelley 莉茲生日快樂! 從今日俄羅斯 (RT) 和 Sputnik 擁有的所有帳戶中刪除廣告。 我們將捐贈所有預計收入(1.9 毫米)來支持對 Twitter 在選舉中的使用進行外部研究,包括惡意自動化和錯誤訊息的使用。 https://t.co/zIxfqqXCZr @TMFJMo @anthonynoto 謝謝 @gasca @stratechery @Lefsetz 信 @gasca @stratechery Bridgewater 的每日觀察 是的! ❤️❤️❤️❤️ #davechappelle https://t.co/ybSGNrQpYF @ndimichino 有時 在 @CampFlogGnaw 設定 https://t.co/nVq8QjkKsf
rule = gen_rule_payload ( "from:jack" ,
from_date = "2017-09-20" ,
to_date = "2017-10-30" ,
count_bucket = "day" ,
results_per_call = 500 )
print ( rule )
{“query”:“from:jack”,“toDate”:“201710300000”,“fromDate”:“201709200000”,“bucket”:“天”}
counts = collect_results ( rule , max_results = 500 , result_stream_args = enterprise_search_args )
[ print ( c ) for c in counts ];
{'timePeriod': '201710290000', '計數': 0} {'timePeriod': '201710280000', '計數': 0} {'timePeriod': '201710270000', '計數': 3} {'timePeriod': '201710260000', '計數': 6} {'timePeriod': '201710250000', '計數': 4} {'timePeriod': '201710240000', '計數': 4} {'timePeriod': '201710230000', '計數': 0} {'timePeriod': '201710220000', '計數': 0} {'timePeriod': '201710210000', '計數': 3} {'timePeriod': '201710200000', '計數': 2} {'timePeriod': '201710190000', '計數': 1} {'timePeriod': '201710180000', '計數': 6} {'timePeriod': '201710170000', '計數': 2} {'timePeriod': '201710160000', '計數': 2} {'timePeriod': '201710150000', '計數': 1} {'timePeriod': '201710140000', '計數': 64} {'timePeriod': '201710130000', '計數': 3} {'timePeriod': '201710120000', '計數': 4} {'timePeriod': '201710110000', '計數': 8} {'timePeriod': '201710100000', '計數': 4} {'timePeriod': '201710090000', '計數': 1} {'timePeriod': '201710080000', '計數': 0} {'timePeriod': '201710070000', '計數': 0} {'timePeriod': '201710060000', '計數': 1} {'timePeriod': '201710050000', '計數': 3} {'timePeriod': '201710040000', '計數': 5} {'timePeriod': '201710030000', '計數': 8} {'timePeriod': '201710020000', '計數': 5} {'timePeriod': '201710010000', '計數': 0} {'timePeriod': '201709300000', '計數': 0} {'timePeriod': '201709290000', '計數': 0} {'timePeriod': '201709280000', '計數': 9} {'timePeriod': '201709270000', '計數': 41} {'timePeriod': '201709260000', '計數': 13} {'timePeriod': '201709250000', '計數': 6} {'timePeriod': '201709240000', '計數': 7} {'timePeriod': '201709230000', '計數': 3} {'timePeriod': '201709220000', '計數': 0} {'timePeriod': '201709210000', '計數': 1} {'timePeriod': '201709200000', '計數': 7}
任何貢獻都應遵循以下模式:
git checkout -b my_new_feature
searchtweets/_version.py
中更改版本號以反映您的變更。我們使用語意版本控制,因此不間斷的增強功能應增加次要版本,例如1.5.0 -> 1.6.0
,而錯誤修復將增加最後一個版本, 1.6.0 -> 1.6.1
。拉取請求過程被接受後,套件維護者將處理建置文件並分發到 Pypi。
作為參考,分發到 Pypi 是透過以下命令完成的,從儲存庫的根目錄運行:
python setup.py bdist_wheel
python setup.py sdist
twine upload dist/ *
如何建構文件:
建立文件需要一些 Sphinx 套件來建立網頁:
pip install sphinx
pip install sphinx_bootstrap_theme
pip install sphinxcontrib-napoleon
然後(一旦您的更改提交給 master)您應該能夠運行文檔生成 bash 腳本並按照說明進行操作:
bash build_sphinx_docs.sh master searchtweets
請注意,此自述文件也會生成,因此在任何自述文件更改後,您需要重新建立自述文件(為此需要 pandoc 版本 2.1+)並提交結果:
bash make_readme.sh