تتضمن نقاط نهاية بحث Twitter v2 الآن نقطة نهاية "التعداد" التي تعرض إجماليات السلاسل الزمنية للتغريدات المطابقة.
يعمل هذا المشروع بمثابة غلاف لواجهات برمجة تطبيقات Twitter المتميزة والبحثية للمؤسسات، مما يوفر أداة مساعدة لسطر الأوامر ومكتبة Python. يمكن رؤية المستندات الجميلة هنا.
jq
). مكتبة searchtweets
موجودة على Pypi:
pip install searchtweets
أو يمكنك تثبيت إصدار التطوير محليًا عبر
git clone https://github.com/twitterdev/search-tweets-python
cd search-tweets-python
pip install -e .
تستخدم واجهات برمجة تطبيقات البحث المميزة والمؤسساتية طرق مصادقة مختلفة ونحاول توفير طريقة سلسة للتعامل مع المصادقة لجميع العملاء. نحن نعلم أن بيانات الاعتماد يمكن أن تكون صعبة أو مزعجة - يرجى قراءة هذا بالكامل.
سيتطلب العملاء المميزون حقلي 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
.
توضح الخلايا التالية معالجة بيانات الاعتماد في مكتبة بايثون.
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://endpoint>'}
الأعلام:
--credential-file <FILENAME>
--credential-file-key <KEY>
--env-overwrite
تُستخدم للتحكم في سلوك بيانات الاعتماد من تطبيق سطر الأوامر.
تتضمن المكتبة تطبيقًا، search_tweets.py
، يوفر وصولاً سريعًا إلى التغريدات. عند استخدام pip
لتثبيت هذه الحزمة، يتم تثبيت search_tweets.py
عالميًا. الملف موجود في دليل tools/
لمن يريد تشغيله محليا.
لاحظ أن علامة --results-per-call
تحدد وسيطة لواجهة برمجة التطبيقات ( 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
. ستتم إضافة وسيطات سطر الأوامر الإضافية إلى وسيطات ملف التكوين أو الكتابة فوق وسيطات ملف التكوين إذا تم تحديدهما ووجودهما.
مثال:
search_tweets.py --ملف التكوين 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_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 ustomer/portal/articles/901152-powertrack-operators) --النتائج لكل مكالمة RESULTS_PER_CALL عدد النتائج التي سيتم إرجاعها لكل مكالمة (الافتراضي 100؛ الحد الأقصى 500) - يتوافق مع "maxResults" في واجهة برمجة التطبيقات. إذا قمت بإجراء طلب "counts" باستخدام "-count-bucket"، فسيتم تجاهل هذه المعلمة. --الحد الأقصى للنتائج MAX_RESULTS الحد الأقصى لعدد التغريدات أو الأعداد المراد إرجاعها لهذا الغرض الجلسة (الإعدادات الافتراضية هي 500) --الحد الأقصى للصفحات MAX_PAGES الحد الأقصى لعدد الصفحات/استدعاءات واجهة برمجة التطبيقات (API) التي سيتم استخدامها لهذا الغرض حصة. --النتائج لكل ملف RESULTS_PER_FILE الحد الأقصى للتغريدات التي يمكن حفظها لكل ملف. --اسم الملف-بادئة FILENAME_PREFIX بادئة لاسم الملف حيث ستكون بيانات tweet json مخزنة. --no-print-stream تعطيل دفق الطباعة --print-stream قم بطباعة دفق التغريدات إلى stdout --رؤوس إضافية EXTRA_HEADERS سلسلة بتنسيق JSON تمثل إملاءًا إضافيًا رؤوس الطلب - تصحيح طباعة جميع المعلومات ورسائل التحذير
يعد العمل مع واجهة برمجة التطبيقات (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 )
هناك وظيفة تقوم بتنسيق قواعد واجهة برمجة التطبيقات للبحث في استعلامات json صالحة تسمى gen_rule_payload
. يحتوي على إعدادات افتراضية معقولة، مثل سحب عدد أكبر من التغريدات في كل مكالمة أكثر من العدد الافتراضي 100 (ولكن لاحظ أن بيئة وضع الحماية لا يمكن أن تحتوي إلا على 100 تغريدة كحد أقصى هنا، لذا إذا حصلت على أخطاء، فيرجى التحقق من ذلك) ولا تتضمن التواريخ. إن مناقشة النقاط الدقيقة لإنشاء قواعد البحث خارج نطاق هذه الأمثلة؛ أنا أشجعك على رؤية المستندات للتعرف على الفروق الدقيقة فيها، ولكن الآن دعونا نرى كيف تبدو القاعدة.
rule = gen_rule_payload ( "beyonce" , results_per_call = 100 ) # testing with a sandbox account
print ( rule )
{"query": "beyonce"، "maxResults": 100}
ستطابق هذه القاعدة التغريدات التي تحتوي على النص beyonce
.
من هذه النقطة، هناك طريقتان للتفاعل مع واجهة برمجة التطبيقات. توجد طريقة سريعة لجمع كميات صغيرة من التغريدات في الذاكرة، الأمر الذي يتطلب قدرًا أقل من التفكير والمعرفة والتفاعل مع كائن ResultStream
الذي سيتم تقديمه لاحقًا.
سنستخدم المتغير search_args
لتشغيل نقطة التكوين لواجهة برمجة التطبيقات. يأخذ الكائن أيضًا قاعدة PowerTrack صالحة ولديه خيارات لقطع البحث عند الوصول إلى حدود عدد التغريدات واستدعاءات واجهة برمجة التطبيقات.
سنستخدم الدالة 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
. يتم توفير عدد هائل من سمات التغريدة مباشرةً، على النحو التالي:
[ print ( tweet . all_text , end = ' n n ' ) for tweet in tweets [ 0 : 10 ]];
جاي زي وأمبير. جلست بيونسيه مقابلنا على العشاء الليلة، وفي وقت ما، قمت بالتواصل البصري مع بيونسيه. تحولت أطرافي إلى الجيلي ولم أعد أستطيع تكوين جملة متماسكة. قد رأيت عيون الرب. بيونسيه وهي ليست قريبة. https://t.co/UdOU9oUtuW كما يمكنك أن تتخيل.. ستظل لافتات بيونسيه دائمًا بالنسبة لي. عندما تتبنى بيونسيه كلباً؟؟ https://t.co/U571HyLG4F انتظر، لا يمكنك أن تفعل ذلك لبيونسيه https://t.co/3p14DocGqA لماذا تستمرون جميعًا في استخدام صور Rihanna و Beyoncé المتحركة للترويج للعرض بينما تتركون Bey تخسر نفس الجائزة التي تستحقها 3 مرات وتتركون Rihanna تغادر بلا شيء سوى الملابس التي على ظهرها؟ https://t.co/w38QpH0wma 30) هل يخبرك أحد أنك تشبه بيونسيه https://t.co/Vo4Z7bfSCi مي بيونسيه المفضلة https://t.co/f9Jp600l2B بيونسيه تحتاج إلى رؤية هذا. كيو ديوساTiniStoessel https://t.co/gadVJbehQZ جوان بيرس تلعب الآن لو كنت صبيا - 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 )
تيار النتيجة: { "اسم المستخدم":خالي، "نقطة النهاية": "https://api.twitter.com/1.1/tweets/search/30day/dev.json"، "قاعدة_الحمولة":{ "استعلام": "بيونسيه"، "الحد الأقصى للنتائج": 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 ]];
جينتي سوكورو kkkkkkkkkk بيونسي https://t.co/kJ9zubvKuf جاي زي وأمبير. جلست بيونسيه مقابلنا على العشاء الليلة، وفي وقت ما، قمت بالتواصل البصري مع بيونسيه. تحولت أطرافي إلى الجيلي ولم أعد أستطيع تكوين جملة متماسكة. قد رأيت عيون الرب. بيونسيه وهي ليست قريبة. https://t.co/UdOU9oUtuW كما يمكنك أن تتخيل.. ستظل لافتات بيونسيه دائمًا بالنسبة لي. عندما تتبنى بيونسيه كلباً؟؟ https://t.co/U571HyLG4F انتظر، لا يمكنك أن تفعل ذلك لبيونسيه https://t.co/3p14DocGqA لماذا تستمرون جميعًا في استخدام صور Rihanna و Beyoncé المتحركة للترويج للعرض بينما تتركون Bey تخسر نفس الجائزة التي تستحقها 3 مرات وتتركون Rihanna تغادر بلا شيء سوى الملابس التي على ظهرها؟ https://t.co/w38QpH0wma 30) هل يخبرك أحد أنك تشبه بيونسيه https://t.co/Vo4Z7bfSCi مي بيونسيه المفضلة https://t.co/f9Jp600l2B بيونسيه تحتاج إلى رؤية هذا. كيو ديوساTiniStoessel https://t.co/gadVJbehQZ جوان بيرس تلعب الآن لو كنت صبيا - BEYONCE.mp3 بواسطة!
يمكننا أيضًا استخدام نقطة نهاية أعداد واجهة برمجة التطبيقات للبحث للحصول على أعداد التغريدات التي تطابق قاعدتنا. سيُرجع كل طلب ما يصل إلى 30 يومًا من النتائج، ويمكن إجراء كل طلب حساب على أساس دقيق أو كل ساعة أو يوميًا. سيتعامل كائن ResultStream
الأساسي مع تحويل نقطة النهاية الخاصة بك إلى نقطة نهاية العد، ويجب عليك تحديد وسيطة count_bucket
عند إنشاء قاعدة لاستخدامها.
تشبه العملية إلى حد كبير عملية التقاط التغريدات، ولكن بها بعض الاختلافات البسيطة.
تحذير - لا تتمتع بيئات وضع الحماية المتميزة بإمكانية الوصول إلى نقطة النهاية الخاصة بحساب واجهة برمجة التطبيقات للبحث.
count_rule = gen_rule_payload ( "beyonce" , count_bucket = "day" )
counts = collect_results ( count_rule , result_stream_args = enterprise_search_args )
نتائجنا واضحة جدًا ويمكن استخدامها بسرعة.
counts
[{'العدد': 366، 'الفترة الزمنية': '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
(والتي سيتم تحويلها إلى منتصف الليل بالتوقيت العالمي المنسق (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": "من: جاك"، "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 عيد ميلاد سعيد ليز! إعلانات خارجية من جميع الحسابات المملوكة لروسيا اليوم (RT) وسبوتنيك. نحن نتبرع بجميع الأرباح المتوقعة (1.9 مليون دولار) لدعم الأبحاث الخارجية حول استخدام تويتر في الانتخابات، بما في ذلك استخدام الأتمتة الضارة والمعلومات المضللة. 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 ];
{'الفترة الزمنية': '201710290000'، 'العدد': 0} {'الفترة الزمنية': '201710280000'، 'العدد': 0} {'الفترة الزمنية': '201710270000'، 'العدد': 3} {'الفترة الزمنية': '201710260000'، 'العدد': 6} {'الفترة الزمنية': '201710250000'، 'العدد': 4} {'الفترة الزمنية': '201710240000'، 'العدد': 4} {'الفترة الزمنية': '201710230000'، 'العدد': 0} {'الفترة الزمنية': '201710220000'، 'العدد': 0} {'الفترة الزمنية': '201710210000'، 'العدد': 3} {'الفترة الزمنية': '201710200000'، 'العدد': 2} {'الفترة الزمنية': '201710190000'، 'العدد': 1} {'الفترة الزمنية': '201710180000'، 'العدد': 6} {'الفترة الزمنية': '201710170000'، 'العدد': 2} {'الفترة الزمنية': '201710160000'، 'العدد': 2} {'الفترة الزمنية': '201710150000'، 'العدد': 1} {'الفترة الزمنية': '201710140000'، 'العدد': 64} {'الفترة الزمنية': '201710130000'، 'العدد': 3} {'الفترة الزمنية': '201710120000'، 'العدد': 4} {'الفترة الزمنية': '201710110000'، 'العدد': 8} {'الفترة الزمنية': '201710100000'، 'العدد': 4} {'الفترة الزمنية': '201710090000'، 'العدد': 1} {'الفترة الزمنية': '201710080000'، 'العدد': 0} {'الفترة الزمنية': '201710070000'، 'العدد': 0} {'الفترة الزمنية': '201710060000'، 'العدد': 1} {'الفترة الزمنية': '201710050000'، 'العدد': 3} {'الفترة الزمنية': '201710040000'، 'العدد': 5} {'الفترة الزمنية': '201710030000'، 'العدد': 8} {'الفترة الزمنية': '201710020000'، 'العدد': 5} {'الفترة الزمنية': '201710010000'، 'العدد': 0} {'الفترة الزمنية': '201709300000'، 'العدد': 0} {'الفترة الزمنية': '201709290000'، 'العدد': 0} {'الفترة الزمنية': '201709280000'، 'العدد': 9} {'الفترة الزمنية': '201709270000'، 'العدد': 41} {'الفترة الزمنية': '201709260000'، 'العدد': 13} {'الفترة الزمنية': '201709250000'، 'العدد': 6} {'الفترة الزمنية': '201709240000'، 'العدد': 7} {'الفترة الزمنية': '201709230000'، 'العدد': 3} {'الفترة الزمنية': '201709220000'، 'العدد': 0} {'الفترة الزمنية': '201709210000'، 'العدد': 1} {'الفترة الزمنية': '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