Конечные точки поиска Twitter v2 теперь включают конечную точку «подсчета», которая возвращает итоговые временные ряды совпадающих твитов.
Этот проект служит оболочкой для API-интерфейсов премиум- и корпоративного поиска Twitter, предоставляя утилиту командной строки и библиотеку Python. Красивые документы можно увидеть здесь.
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. программа.
Оба приведенных выше примера не требуют специальных аргументов командной строки или внутрипрограммных аргументов. Методы анализа учетных данных, если не указано иное, будут искать ключ YAML с именем search_tweets_api
.
Разработчики, у которых есть несколько конечных точек и/или продуктов поиска, могут хранить все учетные данные в одном файле и указывать конкретные ключи для использования. --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://endpoint>'}
флаги:
--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 на стандартный вывод без сохранения
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, представляющую словарь дополнительных заголовков:
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 --no-print-stream
Полные варианты перечислены ниже:
$ search_tweets.py -h использование: search_tweets.py [-h] [--credential-file CREDENTIAL_FILE] [--credential-file-key CREDENTIAL_YAML_KEY] [--env-overwrite ENV_OVERWRITE] [--config-file ИМЯ_ФАЙЛА_CONFIG] [--тип-аккаунта {premium,enterprise}] [--count-bucket COUNT_BUCKET] [--start-datetime FROM_DATE] [--end-datetime TO_DATE] [--filter-rule PT_RULE] [--results-per-call RESULTS_PER_CALL] [--max-results MAX_RESULTS] [--max-pages MAX_PAGES] [--results-per-file RESULTS_PER_FILE] [--filename-prefix FILENAME_PREFIX] [--no-print-stream] [--print-stream] [--extra-headers EXTRA_HEADERS] [--debug] необязательные аргументы: -h, --help показать это справочное сообщение и выйти --credential-file CREDENTIAL_FILE Расположение файла yaml, используемого для хранения вашего реквизиты для входа. --credential-file-key CREDENTIAL_YAML_KEY ключ в файле учетных данных, используемый для этого сеанса реквизиты для входа. По умолчанию — search_tweets_api. --env-overwrite ENV_OVERWRITE Перезаписать учетные данные, проанализированные в формате YAML, любым набором переменные среды. См. документацию по API или файл readme для подробности. --config-file ИМЯ_ФАЙЛА_CONFIG Конфигурационный файл со всеми параметрами. Далеко, проще используйте версию args для командной строки. Если допустимый файл найден, все аргументы будут заполнены оттуда. Остальные аргументы командной строки отменяют найденные аргументы. в конфиге файл. --account-type {премиум, предприятие} Тип учетной записи, которую вы используете --count-bucket COUNT_BUCKET Установите этот параметр, чтобы сделать запрос «подсчета». Размер сегмента для конечной точки подсчета. Опции:, день, час, минута. --start-datetime FROM_DATE Начало окна даты и времени, формат «ГГГГ-мм-ДДТЧЧ: ММ». (по умолчанию: -30 дней) --end-datetime TO_DATE Конец окна даты и времени в формате «ГГГГ-мм-ДДТЧЧ: ММ». (по умолчанию: самая последняя дата) --filter-rule PT_RULE Правило фильтра PowerTrack (см.: http://support.gnip.com/c). пользователь/портал/статьи/901152-powertrack-operators) --results-per-call RESULTS_PER_CALL Количество результатов, возвращаемых за вызов (по умолчанию 100; макс. 500) — соответствует «maxResults» в API. При выполнении запроса «counts» с помощью «--count-bucket» этот параметр игнорируется. --max-results MAX_RESULTS Максимальное количество твитов или счетчиков, возвращаемых для этого сеанс (по умолчанию 500) --max-pages MAX_PAGES Максимальное количество страниц/вызовов API, которые можно использовать для этого. сессия. --results-per-file RESULTS_PER_FILE Максимальное количество твитов для сохранения на файл. --filename-prefix ИМЯ ФАЙЛА_PREFIX префикс имени файла, в котором будут храниться данные твита в формате json хранится. --no-print-stream отключить потоковую передачу печати --print-stream Вывести поток твитов на стандартный вывод --extra-headers EXTRA_HEADERS Строка в формате JSON, представляющая набор дополнительных заголовки запросов --debug вывести всю информацию и предупреждающие сообщения
Работа с API в программе Python проста как для клиентов 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 поиска в действительные запросы 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
, имеющую три параметра.
В остальных примерах измените аргументы на премиум или корпоративный в зависимости от вашего использования.
Давайте посмотрим, как это происходит:
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 ]];
Джей-Зи и amp; Сегодня вечером за ужином Бейонсе сидела напротив нас, и в какой-то момент я посмотрел ей в глаза. Мои конечности превратились в желе, и я больше не могу составить связное предложение. Я видел глаза господина. Бейонсе и это не близко. https://t.co/UdOU9oUtuW Как вы могли догадаться... Надписи Бейонсе всегда будут моей фишкой. Когда Бейонсе усыновит собаку?? https://t.co/U571HyLG4F Подожди, ты не можешь просто так поступить с Бейонсе. https://t.co/3p14DocGqA Почему вы продолжаете использовать гифки с Рианной и Бейонсе для продвижения шоу, в то время как вы позволили Бэй потерять ту же награду, которую она заслужила 3 раза, и позволили Рианне уйти ни с чем, кроме одежды на спине? https://t.co/w38QpH0wma 30) кто-нибудь скажет тебе, что ты похожа на Бейонсе https://t.co/Vo4Z7bfSCi Моя любимая Бейонсе https://t.co/f9Jp600l2B Бейонсе нужна эта версия. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Джоан Пирс сейчас играет 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 Твиттер для iPhone Твиттер для iPhone Твиттер для iPhone Твиттер для iPhone Твиттер для iPhone Твиттер для Android Твиттер для iPhone Эфирное время Про Твиттер для iPhone
Вуаля, у нас есть несколько твитов. Для интерактивных сред и других случаев, когда вам не нужен сбор данных за одну загрузку или вам не нужно напрямую работать с потоком твитов или подсчетом, я рекомендую использовать эту удобную функцию.
Объект ResultStream будет работать на основе search_args
и принимать правила и другие параметры конфигурации, включая жесткую остановку количества страниц для ограничения использования вызовов API.
rs = ResultStream ( rule_payload = rule ,
max_results = 500 ,
max_pages = 1 ,
** premium_search_args )
print ( rs )
РезультатПоток: { «имя пользователя»: ноль, "endpoint":"https://api.twitter.com/1.1/tweets/search/30day/dev.json", "rule_payload":{ "запрос":"Бейонсе", «МаксРезультаты»:100 }, "твитнуть": правда, "max_results":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 ]];
gente socorro kkkkkkkkkk BEYONCE https://t.co/kJ9zubvKuf Джей-Зи и amp; Сегодня вечером за ужином Бейонсе сидела напротив нас, и в какой-то момент я посмотрел ей в глаза. Мои конечности превратились в желе, и я больше не могу составить связное предложение. Я видел глаза господина. Бейонсе и это не близко. https://t.co/UdOU9oUtuW Как вы могли догадаться... Надписи Бейонсе всегда будут моей фишкой. Когда Бейонсе усыновит собаку?? https://t.co/U571HyLG4F Подожди, ты не можешь просто так поступить с Бейонсе. https://t.co/3p14DocGqA Почему вы продолжаете использовать гифки с Рианной и Бейонсе для продвижения шоу, в то время как вы позволили Бэй потерять ту же награду, которую она заслужила 3 раза, и позволили Рианне уйти ни с чем, кроме одежды на спине? https://t.co/w38QpH0wma 30) кто-нибудь скажет тебе, что ты похожа на Бейонсе https://t.co/Vo4Z7bfSCi Моя любимая Бейонсе https://t.co/f9Jp600l2B Бейонсе нужна эта версия. Que diosa @TiniStoessel https://t.co/gadVJbehQZ Джоан Пирс сейчас играет IF I WAS A BOY - BEYONCE.mp3 от !
Мы также можем использовать конечную точку счетчиков 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
(которое преобразуется в полночь по всемирному координированному времени (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 Запуск политики агрессивных группировок и ненавистнических изображений/символов 22 ноября https://t.co/NaWuBPxyO5 22 ноября мы запустим нашу политику в отношении агрессивных групп, разжигающих ненависть образов и символов ненависти. В процессе разработки мы получили ценные отзывы, которые мы реализуем до того, как они будут опубликованы и введены в действие. Дополнительную информацию о процессе разработки нашей политики можно найти здесь? https://t.co/wx3EeH39BI @WillStick @lizkelley С днем рождения, Лиз! Оффбординговая реклама со всех аккаунтов, принадлежащих Russia Today (RT) и Sputnik. Мы жертвуем весь прогнозируемый доход (1,9 миллиона долларов) на поддержку внешних исследований использования Twitter на выборах, включая использование вредоносной автоматизации и дезинформации. https://t.co/zIxfqqXCZr @TMFJMo @anthonynoto Спасибо @gasca @stratechery @Лефсетц письмо @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 )
{"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', '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/ *
Как составить документацию:
Для создания документации требуется несколько пакетов 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