Twitter v2 검색 엔드포인트에는 이제 일치하는 트윗의 시계열 합계를 반환하는 'counts' 엔드포인트가 포함됩니다.
이 프로젝트는 명령줄 유틸리티와 Python 라이브러리를 제공하는 Twitter 프리미엄 및 엔터프라이즈 검색 API의 래퍼 역할을 합니다. 여기에서 예쁜 문서를 볼 수 있습니다.
jq
)로 파이프될 수 있습니다. searchtweets
라이브러리는 Pypi에 있습니다:
pip install searchtweets
또는 다음을 통해 로컬로 개발 버전을 설치할 수 있습니다.
git clone https://github.com/twitterdev/search-tweets-python
cd search-tweets-python
pip install -e .
프리미엄 및 엔터프라이즈 검색 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= 내보내기
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_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 결과를 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-file myapiconfig.config --인쇄 스트림 없음
전체 옵션은 다음과 같습니다.
$ search_tweets.py -h 사용법: search_tweets.py [-h] [--credential-file CREDENTIAL_FILE] [--credential-file-key CREDENTIAL_YAML_KEY] [--env-overwrite ENV_OVERWRITE] [--구성 파일 CONFIG_FILENAME] [--계정 유형 {프리미엄,기업}] [--카운트버킷 COUNT_BUCKET] [--start-datetime FROM_DATE] [--end-datetime TO_DATE] [--필터 규칙 PT_RULE] [--호출당 결과 RESULTS_PER_CALL] [--max-결과 MAX_RESULTS] [--최대-페이지 MAX_PAGES] [--파일당 결과 RESULTS_PER_FILE] [--파일 이름-접두사 FILENAME_PREFIX] [--인쇄-스트림 없음] [--인쇄-스트림] [--추가 헤더 EXTRA_HEADERS] [--디버그] 선택적 인수: -h, --help 이 도움말 메시지를 표시하고 종료합니다. --자격 증명 파일 CREDENTIAL_FILE 저장하는 데 사용되는 yaml 파일의 위치 신임장. --credential-file-key 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 트윗 json 데이터가 포함될 파일 이름의 접두사 저장되었습니다. --no-print-stream 인쇄 스트리밍 비활성화 --print-stream 트윗 스트림을 표준 출력으로 인쇄합니다. --추가 헤더 EXTRA_HEADERS 추가 사전을 나타내는 JSON 형식의 문자열 요청 헤더 --debug 모든 정보 및 경고 메시지 인쇄
Python 프로그램 내에서 API를 사용하는 작업은 Premium 및 Enterprise 클라이언트 모두에게 간단합니다.
자격 증명이 기본 위치인 ~/.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 규칙을 gen_rule_payload
라는 유효한 json 쿼리로 형식화하는 함수가 있습니다. 날짜를 포함하지 않고 통화당 더 많은 트윗을 기본 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
함수를 사용할 것입니다.
나머지 예에서는 사용량에 따라 인수를 프리미엄 또는 엔터프라이즈로 변경하세요.
어떻게 진행되는지 살펴보겠습니다.
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 ]];
제이지 & 비욘세는 오늘 밤 저녁 식사에서 우리 맞은편에 앉았고 어느 순간 비욘세와 눈을 마주쳤습니다. 내 팔다리가 젤로로 변했고 더 이상 일관된 문장을 만들 수 없습니다. 나는 주님의 눈을 보았습니다. 비욘세와는 가깝지 않습니다. https://t.co/UdOU9oUtuW 짐작할 수 있듯이 .. Beyoncé의 사인은 항상 내 것이 될 것입니다. 비욘세가 개를 입양하면?? https://t.co/U571HyLG4F 잠깐만, 비욘세한테만 그러면 안 돼 https://t.co/3p14DocGqA Bey가 3번이나 받을 자격이 있는 동일한 상을 잃게 하고 Rihanna가 등에 옷만 걸치고 떠나게 놔두는데 왜 계속 Rihanna와 Beyoncé gif를 사용하여 쇼를 홍보하는 거죠? https://t.co/w38QpH0wma 30) 당신이 비욘세와 닮았다고 말하는 사람 https://t.co/Vo4Z7bfSCi Mi Beyoncé 가장 좋아하는 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 ]];
아이폰용 트위터 아이폰용 트위터 아이폰용 트위터 아이폰용 트위터 아이폰용 트위터 아이폰용 트위터 안드로이드용 트위터 아이폰용 트위터 에어타임 프로 아이폰용 트위터
짜잔, 트윗이 몇 개 있습니다. 대화형 환경 및 단일 로드로 데이터를 수집하는 데 관심이 없거나 트윗 스트림이나 카운트 스트림에서 직접 작업할 필요가 없는 기타 경우에는 이 편의 기능을 사용하는 것이 좋습니다.
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", "rule_payload":{ "쿼리":"비욘세", "maxResults":100 }, "트윗하다":사실, "최대_결과":500 }
주어진 쿼리에 대한 요청과 페이지 매김을 원활하게 처리하는 .stream
함수가 있습니다. 생성기를 반환하고 beyonce
언급한 500개의 트윗을 가져오려면 다음을 수행할 수 있습니다.
tweets = list ( rs . stream ())
트윗은 Tweet Parser를 사용하여 느리게 구문 분석되므로 트윗 데이터를 매우 쉽게 추출할 수 있습니다.
# using unidecode to prevent emoji/accents printing
[ print ( tweet . all_text ) for tweet in tweets [ 0 : 10 ]];
젠테 소코로 ㅋㅋㅋㅋㅋㅋㅋㅋ 비욘세 https://t.co/kJ9zubvKuf 제이지 & 비욘세는 오늘 밤 저녁 식사에서 우리 맞은편에 앉았고 어느 순간 비욘세와 눈을 마주쳤습니다. 내 팔다리가 젤로로 변했고 더 이상 일관된 문장을 만들 수 없습니다. 나는 주님의 눈을 보았습니다. 비욘세와는 가깝지 않습니다. https://t.co/UdOU9oUtuW 짐작할 수 있듯이 .. Beyoncé의 사인은 항상 내 것이 될 것입니다. 비욘세가 개를 입양하면?? https://t.co/U571HyLG4F 잠깐만, 비욘세한테만 그러면 안 돼 https://t.co/3p14DocGqA Bey가 3번이나 받을 자격이 있는 동일한 상을 잃게 하고 Rihanna가 등에 옷만 걸치고 떠나게 놔두는데 왜 계속 Rihanna와 Beyoncé gif를 사용하여 쇼를 홍보하는 거죠? https://t.co/w38QpH0wma 30) 당신이 비욘세와 닮았다고 말하는 사람 https://t.co/Vo4Z7bfSCi Mi Beyoncé 가장 좋아하는 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
인수를 지정해야 합니다.
이 프로세스는 트윗을 가져오는 것과 매우 유사하지만 몇 가지 사소한 차이점이 있습니다.
주의 사항 - 프리미엄 샌드박스 환경은 검색 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'}, {'개수': 61932, 'timePeriod': '201801150000'}, {'개수': 59678, 'timePeriod': '201801140000'}, {'count': 44014, 'timePeriod': '201801130000'}, {'count': 46607, 'timePeriod': '201801120000'}, {'count': 41523, 'timePeriod': '201801110000'}, {'개수': 47056, 'timePeriod': '201801100000'}, {'count': 65506, 'timePeriod': '201801090000'}, {'개수': 95251, 'timePeriod': '201801080000'}, {'개수': 162883, 'timePeriod': '201801070000'}, {'개수': 106344, 'timePeriod': '201801060000'}, {'개수': 93542, 'timePeriod': '201801050000'}, {'개수': 110415, 'timePeriod': '201801040000'}, {'개수': 127523, 'timePeriod': '201801030000'}, {'개수': 131952, 'timePeriod': '201801020000'}, {'개수': 176157, 'timePeriod': '201801010000'}, {'개수': 57229, 'timePeriod': '201712310000'}, {'개수': 72277, 'timePeriod': '201712300000'}, {'개수': 72051, 'timePeriod': '201712290000'}, {'개수': 76371, 'timePeriod': '201712280000'}, {'개수': 61578, 'timePeriod': '201712270000'}, {'개수': 55118, 'timePeriod': '201712260000'}, {'개수': 59115, 'timePeriod': '201712250000'}, {'개수': 106219, 'timePeriod': '201712240000'}, {'개수': 114732, 'timePeriod': '201712230000'}, {'개수': 73327, 'timePeriod': '201712220000'}, {'개수': 89171, 'timePeriod': '201712210000'}, {'개수': 192381, 'timePeriod': '201712200000'}, {'개수': 85554, 'timePeriod': '201712190000'}, {'개수': 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 )
{"query":"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 리즈 생일 축하해요! Russia Today(RT) 및 Sputnik이 소유한 모든 계정의 오프보딩 광고. 우리는 악의적인 자동화 및 잘못된 정보의 사용을 포함하여 선거에서 트위터 사용에 대한 외부 연구를 지원하기 위해 모든 예상 수입(190만 달러)을 기부하고 있습니다. 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":"day"}
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
그런 다음 (변경 사항이 마스터에 커밋되면) 문서 생성 bash 스크립트를 실행하고 지침을 따를 수 있어야 합니다.
bash build_sphinx_docs.sh master searchtweets
이 README도 생성되므로 README를 변경한 후에는 README를 다시 빌드하고(이를 위해서는 pandoc 버전 2.1 이상이 필요함) 결과를 커밋해야 합니다.
bash make_readme.sh