Twitter v2 検索エンドポイントには、一致するツイートの時系列合計を返す「カウント」エンドポイントが含まれるようになりました。
このプロジェクトは Twitter プレミアム API とエンタープライズ検索 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>
デフォルトでは、このライブラリはこのファイルが"~/.twitter_keys.yaml"
にあることを想定していますが、コマンドライン アプリの--credential-file
フラグを使用するか、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=
YAML ファイルからフィールドを読み込めない場合、 load_credentials
関数はこれらの変数の検索を試み、環境変数として存在する 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_PASSWORD>', 'エンドポイント': '<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
、CALL ごとに返される結果) を指定することに注意してください。引数--max-results
特定の呼び出しから返される結果の最大数を定義します。すべての例では、資格情報がデフォルトの場所 ( .twitter_keys.yaml
または環境変数に正しく設定されていることを前提としています。
JSON 結果を保存せずに標準出力にストリーミングする
search_tweets.py
--max-results 1000
--results-per-call 100
--filter-rule " beyonce has:hashtags "
--print-stream
json 結果を標準出力にストリーミングし、ファイルに保存します
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 形式の文字列を使用して、コマンド ラインから 1 つ以上のカスタム ヘッダーを指定できます。
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
パラメーターを使用して構成ファイルを指定する必要があります。追加のコマンドライン引数は、構成ファイルの引数に追加されるか、両方が指定されて存在する場合は構成ファイルの引数を上書きします。
例:
search_tweets.py --config-file myapiconfig.config --no-print-stream
完全なオプションを以下に示します。
$ search_tweets.py -h 使用法: search_tweets.py [-h] [--credential-file CREDENTIAL_FILE] [--資格情報ファイルキー CREDENTIAL_YAML_KEY] [--env-overwrite ENV_OVERWRITE] [--config-file CONFIG_FILENAME] [--アカウントの種類 {プレミアム、エンタープライズ}] [--カウント-バケット COUNT_BUCKET] [--開始日時 FROM_DATE] [--終了日時 TO_DATE] [--フィルタールール PT_RULE] [--呼び出しごとの結果 RESULTS_PER_CALL] [--max-results MAX_RESULTS] [--max-pages MAX_PAGES] [--ファイルごとの結果 RESULTS_PER_FILE] [--ファイル名-プレフィックス FILENAME_PREFIX] [--no-print-stream] [--print-stream] [--extra-headers EXTRA_HEADERS] [--debug] オプションの引数: -h、--help このヘルプ メッセージを表示して終了します --credential-file CREDENTIAL_FILE を保持するために使用される yaml ファイルの場所 資格。 --資格情報ファイルキー CREDENTIAL_YAML_KEY このセッションに使用される認証情報ファイル内のキー 資格。デフォルトはsearch_tweets_api --env-overwrite ENV_OVERWRITE YAML で解析された資格情報を任意のセットで上書きします 環境変数。 API ドキュメントまたは Readme を参照してください。 詳細。 --config-file CONFIG_FILENAME すべてのパラメータを含む構成ファイル。遠くへ、もっと簡単に コマンドライン引数のバージョンよりも使用してください。有効な場合は、 ファイルが見つかると、そこからすべての引数が設定されます。 残りのコマンドライン引数は、見つかった引数を無効にします 設定ファイル内。 --account-type {プレミアム、エンタープライズ} 使用しているアカウントの種類 --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 ustomer/portal/article/901152-powertrack-operators) --呼び出しごとの結果 RESULTS_PER_CALL 呼び出しごとに返される結果の数 (デフォルトは 100、最大 500) - API の「maxResults」に対応します。 「--count-bucket」を使用して「counts」リクエストを行う場合、このパラメータは無視されます。 --max-results MAX_RESULTS これに対して返されるツイートまたはカウントの最大数 セッション (デフォルトは 500) --max-pages MAX_PAGES これに使用するページ/API 呼び出しの最大数 セッション。 --ファイルごとの結果 RESULTS_PER_FILE ファイルごとに保存できるツイートの最大数。 --filename-prefix FILENAME_PREFIX ツイートの 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 を操作するには 2 つの方法があります。少量のツイートをメモリに収集するための簡単な方法があり、思考や知識が少なくて済み、後で紹介するResultStream
オブジェクトとの対話も必要ありません。
search_args
変数を使用して、API の構成ポイントを強化します。このオブジェクトは有効な PowerTrack ルールも採用しており、ツイート数と API 呼び出しの両方の制限に達した場合に検索を中止するオプションがあります。
ここでは、3 つのパラメータを持つcollect_results
関数を使用します。
残りの例では、使用状況に応じて引数をプレミアムまたはエンタープライズに変更してください。
様子を見てみましょう:
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
オブジェクトに遅延解析されます。以下のように、圧倒的な数のツイート属性が直接利用可能になります。
[ print ( tweet . all_text , end = ' n n ' ) for tweet in tweets [ 0 : 10 ]];
ジェイ・Z&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;;今夜の夕食時、ビヨンセは私たちの向かいに座っていましたが、ある時点で私はビヨンセとアイコンタクトをとりました。手足がゼリー状になり、もう一貫した文章を作ることができません。主の目を見ました。 ビヨンセとそれは近くない。 https://t.co/UdOU9oUtuW ご想像のとおり、ビヨンセのサインはいつも私にとってはたわごとです。 ビヨンセが犬を飼ったら?? https://t.co/U571HyLG4F ちょっと待って、ビヨンセだけにそんなことはできないよ https://t.co/3p14DocGqA ベイを3回も受賞すべき賞を逃し、リアーナが着の身着のままで退場したのに、なぜ皆さんは番組の宣伝にリアーナとビヨンセのGIFを使い続けるのですか? 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 を再生中です。 死ぬ前にビヨンセのフィンスタを見てみようと思う
[ 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版Twitter iPhone版Twitter iPhone版Twitter iPhone版Twitter iPhone版Twitter iPhone版Twitter Android版ツイッター iPhone版Twitter エアタイムプロ iPhone版Twitter
ほら、ツイートがいくつかあります。インタラクティブな環境や、1 回の読み込みでデータを収集する必要がない場合や、ツイートやカウントのストリームを直接操作する必要がない場合には、この便利な関数を使用することをお勧めします。
ResultStream オブジェクトはsearch_args
によって強化され、API 呼び出しの使用を制限するためのページ数でのハード ストップなどのルールとその他の構成パラメーターを受け取ります。
rs = ResultStream ( rule_payload = rule ,
max_results = 500 ,
max_pages = 1 ,
** premium_search_args )
print ( rs )
結果ストリーム: { "ユーザー名":null、 "エンドポイント":"https://api.twitter.com/1.1/tweets/search/30day/dev.json", "ルールペイロード":{ "クエリ":"ビヨンセ", 「最大結果」:100 }、 「ツイートする」: true、 "最大結果":500 }
特定のクエリのリクエストとページネーションをシームレスに処理する関数.stream
があります。これはジェネレーターを返します。 beyonce
に言及している 500 件のツイートを取得するには、次のようにします。
tweets = list ( rs . stream ())
ツイートはツイート パーサーを使用して遅延解析されるため、ツイート データは非常に簡単に抽出できます。
# using unidecode to prevent emoji/accents printing
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
ジェンテ ソコロ クッッッッッッッッッ ビヨンセ https://t.co/kJ9zubvKuf ジェイ・Z&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;今夜の夕食時、ビヨンセは私たちの向かいに座っていましたが、ある時点で私はビヨンセとアイコンタクトをとりました。手足がゼリー状になり、もう一貫した文章を作ることができません。主の目を見ました。 ビヨンセとそれは近くない。 https://t.co/UdOU9oUtuW ご想像のとおり、ビヨンセのサインはいつも私にとってはたわごとです。 ビヨンセが犬を飼ったら?? https://t.co/U571HyLG4F ちょっと待って、ビヨンセだけにそんなことはできないよ https://t.co/3p14DocGqA ベイを3回も受賞すべき賞を逃し、リアーナが着の身着のままで退場したのに、なぜ皆さんは番組の宣伝にリアーナとビヨンセのGIFを使い続けるのですか? 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 を再生中です。
Search API Counts エンドポイントを使用して、ルールに一致するツイートの数を取得することもできます。各リクエストは最大30 日分の結果を返し、各カウント リクエストは分ごと、時間ごと、または日ごとに実行できます。基礎となるResultStream
オブジェクトは、エンドポイントを count エンドポイントに変換する処理を行います。これを使用するルールを作成する場合は、 count_bucket
引数を指定する必要があります。
このプロセスはツイートの取得と非常に似ていますが、いくつかの小さな違いがあります。
注意 - プレミアム サンドボックス環境では、Search 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'}, {'カウント': 44580, '時間期間': '201801160000'}, {'カウント': 61932, '時間期間': '201801150000'}, {'カウント': 59678, '時間期間': '201801140000'}, {'カウント': 44014, '時間期間': '201801130000'}, {'カウント': 46607, '時間期間': '201801120000'}, {'カウント': 41523, '時間期間': '201801110000'}, {'カウント': 47056, '時間期間': '201801100000'}, {'カウント': 65506, '時間期間': '201801090000'}, {'カウント': 95251, '時間期間': '201801080000'}, {'カウント': 162883, '時間期間': '201801070000'}, {'カウント': 106344, '時間期間': '201801060000'}, {'カウント': 93542, '時間期間': '201801050000'}, {'カウント': 110415, '時間期間': '201801040000'}, {'カウント': 127523, '時間期間': '201801030000'}, {'カウント': 131952, '時間期間': '201801020000'}, {'カウント': 176157, '時間期間': '201801010000'}, {'カウント': 57229, '時間期間': '201712310000'}, {'カウント': 72277, '時間期間': '201712300000'}, {'カウント': 72051, '時間期間': '201712290000'}, {'カウント': 76371, '時間期間': '201712280000'}, {'カウント': 61578, '時間期間': '201712270000'}, {'カウント': 55118, '時間期間': '201712260000'}, {'カウント': 59115, '時間期間': '201712250000'}, {'カウント': 106219, '時間期間': '201712240000'}, {'カウント': 114732, '時間期間': '201712230000'}, {'カウント': 73327, '時間期間': '201712220000'}, {'カウント': 89171, '時間期間': '201712210000'}, {'カウント': 192381, '時間期間': '201712200000'}, {'カウント': 85554, '時間期間': '201712190000'}, {'カウント': 57829, '時間期間': '201712180000'}]
これは完全なアーカイブ検索オプションでのみ機能することに注意してください。このオプションは、エンタープライズ オプションを介して私のアカウントでのみ利用可能です。完全なアーカイブ検索には、別のエンドポイントまたはアクセス方法が必要になる可能性があります。詳細については、開発者コンソールを参照してください。
今度は新しいルールを作成して日付を渡してみましょう。
gen_rule_payload
次の形式のタイムスタンプを受け取ります。
YYYYmmDDHHMM
YYYY-mm-DD
(UTC 午前 0 時 (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 )
{"クエリ":"from:jack","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)とスプートニクが所有するすべてのアカウントからの広告をオフボードします。 私たちは、予想される収益すべて (190 万ドル) を、悪意のある自動化や誤った情報の使用を含む、選挙における Twitter の使用に関する外部調査を支援するために寄付します。 https://t.co/zIxfqqXCZr @TMFJMo @anthonynoto ありがとうございます @gasca @stratetechery @Lefsetz レター @gasca @stratechery ブリッジウォーターの日々の観察 うん!!!! ❤️❤️❤️❤️ #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 )
{"クエリ":"from:jack","toDate":"201710300000","fromDate":"201709200000","bucket":"day"}
counts = collect_results ( rule , max_results = 500 , result_stream_args = enterprise_search_args )
[ print ( c ) for c in counts ];
{'timePeriod': '201710290000', 'count': 0} {'timePeriod': '201710280000', 'count': 0} {'timePeriod': '201710270000', 'count': 3} {'timePeriod': '201710260000', 'count': 6} {'timePeriod': '201710250000', 'count': 4} {'timePeriod': '201710240000', 'count': 4} {'timePeriod': '201710230000', 'count': 0} {'timePeriod': '201710220000', 'count': 0} {'timePeriod': '201710210000', 'count': 3} {'timePeriod': '201710200000', 'count': 2} {'timePeriod': '201710190000', 'count': 1} {'timePeriod': '201710180000', 'count': 6} {'timePeriod': '201710170000', 'count': 2} {'timePeriod': '201710160000', 'count': 2} {'timePeriod': '201710150000', 'count': 1} {'timePeriod': '201710140000', 'count': 64} {'timePeriod': '201710130000', 'count': 3} {'timePeriod': '201710120000', 'count': 4} {'timePeriod': '201710110000', 'count': 8} {'timePeriod': '201710100000', 'count': 4} {'timePeriod': '201710090000', 'count': 1} {'timePeriod': '201710080000', 'count': 0} {'timePeriod': '201710070000', 'count': 0} {'timePeriod': '201710060000', 'count': 1} {'timePeriod': '201710050000', 'count': 3} {'timePeriod': '201710040000', 'count': 5} {'timePeriod': '201710030000', 'count': 8} {'timePeriod': '201710020000', 'count': 5} {'timePeriod': '201710010000', 'count': 0} {'timePeriod': '201709300000', 'count': 0} {'timePeriod': '201709290000', 'count': 0} {'timePeriod': '201709280000', 'count': 9} {'timePeriod': '201709270000', 'count': 41} {'timePeriod': '201709260000', 'count': 13} {'timePeriod': '201709250000', 'count': 6} {'timePeriod': '201709240000', 'count': 7} {'timePeriod': '201709230000', 'count': 3} {'timePeriod': '201709220000', 'count': 0} {'timePeriod': '201709210000', 'count': 1} {'timePeriod': '201709200000', 'count': 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/ *
ドキュメントの作成方法:
ドキュメントを構築するには、Web ページを構築するためのいくつかの Sphinx パッケージが必要です。
pip install sphinx
pip install sphinx_bootstrap_theme
pip install sphinxcontrib-napoleon
その後 (変更がマスターにコミットされると)、ドキュメントを生成する bash スクリプトを実行し、次の指示に従うことができるようになります。
bash build_sphinx_docs.sh master searchtweets
この README も生成されるため、README を変更した後は README を再ビルドし (これには Pandoc バージョン 2.1 以降が必要です)、結果をコミットする必要があることに注意してください。
bash make_readme.sh