ã¯ãã㫠䜿ã£ãç© æºå ãã®1ïŒtweetãããã ãã®2ïŒç¹å®ã®ãŠãŒã¶ãŒã®tweetãååŸããã ãã®3ïŒæ€çŽ¢ã¯ãŒãã§åŒã£ããã£ãtweetãJSONãã¡ã€ã«ã«ããã ãããã« ã¯ããã« ããã«ã¡ã¯ã rs_chankoã§ãã æ¬æ Œçã«å¯ããªã£ãŠããŸãããã ã¹ããŒããŒã ãæ¥œãã¿ãªå£ç¯ã§ãã å
šç¶é¢ä¿ãªãã®ã§æ¬é¡ã«å
¥ããŸãã ãšã³ãžãã¢ãããã®ãæ
å ±åéã« SNS ã£ãŠæ¬ ãããªãã§ãããã ç§ã¯æ°è»œã«äœ¿ãããããŠãŒã¶ãŒãå€ããã Twitter ãããå©çšããŠããŸãã ãã®æãã·ã¥ââãââââãŒã ãšããã¶âââããšãã UserStreamsã§åžžã«æ°ãã tweet ãæµããŠããã¯ã©ã€ã¢ã³ããæµè¡ããŸãããããïŒæµè¡ããŸããããïŒïŒ ç§ã¯ãããªã¯ã©ã€ã¢ã³ãã䜿ã£ãŠããããããã€å»ããšãã人皮ã§ããã ãã ã API ã®ä»æ§å€æŽã ãšããªãã ãšãã§ãã®ãããªã¯ã©ã€ã¢ã³ããããé¢ããä»ã¯å
¬åŒã«èœã¡çããŠããŸãã åœæã¯ã API ãã£ãŠãªãããããšæãã€ã€ãã調ã¹ãããšãç¹ã«ãããŸããã§ãããïŒé«æ ¡çã®é ã®èªåã®æ¬²ã®ãªããâŠïŒ æè¿ãæ¥åã§ API ããã¯ãªå®è£
ã«è§Šããæã«çªç¶ãã®ããšãæãåºãããã§ãããã ãããŠæããŸããã ãå
Œ΋Ǿ
£ãããšã¯ãããèªåã®çæ³ã®ã¯ã©ã€ã¢ã³ãäœããããé¢çœããïŒïŒã ãšããããšã§ãä»åã¯ã¯ã©ã€ã¢ã³ãäœæãŸã§ã¯ãããŸãããã ã²ãšãŸã API ã§äœãããŠã¿ãããšèšãããšã§åçŽç·šããã£ãã®ã§èšäºã«ããŠã¿ãŸãã 䜿ã£ãç© Twitter ã¢ã«ãŠã³ã Python -3.9.0( VSCode ) æºå Twitter ã§ API ãå©çšããã«ã¯ããŸããå©çšç³è«ããå¿
èŠã«ãªããŸãã ãã®èŸºã¯çµæ§ããããªãµã€ããããã®ã§ãåèã«ããŸããã åèã«ãããµã€ãã¯ãã¡ã www.itti.jp ãããå®äºããŠã¡ãŒã«ãå±ããšããããã API ã䜿ã£ãããããªããšãã§ããŸãã ã²ãšãŸãããã®ããšå¿
èŠã«ãªãäžèš4ã€ãååŸããŸãã consumer_key consumer_secret access _token access _token_secret æ¢ãã®çµæ§èŠåŽãããã§ãããå®ã¯ãŸãšãŸã£ãŠããŸããã äžã®ç»åã®é ã«æ¢ã£ãŠãããšå
šéšååŸã§ããŸããã API _Keyã®ååŸ ããããååŸã§ããããæ©éã³ãŒããæžããŠãããŸããã ãã®1ïŒ tweet ãããã ã¯ã©ã€ã¢ã³ããäœã£ãŠ tweet ãèŠãããšããã§ãèªåã tweet ã§ããªããé¢çœããªãã§ãããã ãªã®ã§ãçŽæžãã§ãšãããã tweet ããŠããïŒãšãã£ãæãã§æžããŠã¿ãŸããã #tweetãæçš¿ import tweepy # æºåã§ååŸããããŒãæ ŒçŽãã consumer_key = "consumer_key" consumer_secret = "consumer_secret" access_token = "access_token" access_token_secret = "access_token_secret" # Twitterãªããžã§ã¯ãã®çæ auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) # tweetãæçš¿ api.update_status( "APIã§ãã€ãŒãã§ããããããã£ããããã" ) #æºåã§ååŸããããŒãæ ŒçŽãã ã®éšåã«ã¯åèªååŸããããŒããããŠãã ããã ãããå®è¡ãããšâŠ tweet _ ã¹ã¯ãªãŒã³ã·ã§ãã ãããªæãã§å®éã« tweet ã§ããŸããã OAuthèªèšŒ ã§ API åŒã³åºãããæãã§ããã ãã®æ®µéã§ãããæå€ãšç°¡åãããããšèªä¿¡ãä»ããããŠãããŸãã API ã£ãŠããèšããšãããå倧ã§ãããã ãã®2ïŒç¹å®ã®ãŠãŒã¶ãŒã® tweet ãååŸããã ä»åã¯æããïŒ DevRakusã® tweet ãååŸããŸãã twitter.com ææ°ã®5tweetããããååŸããŠã¿ãŸãã import tweepy consumer_key = "consumer_key" consumer_secret = "consumer_secret" access_token = "access_token" access_token_secret = "access_token_secret" # Twitterãªããžã§ã¯ãã®çæ auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) #tweetãååŸ Account = "DevRakus" #ååŸããããŠãŒã¶ãŒã®ãŠãŒã¶ãŒIDã代å
¥ tweets = api.user_timeline(Account, count= 5 , page= 1 ) for tweet in tweets: print ( 'tweetId : ' , tweet.id) # tweetã®ID print ( 'tweetUser : ' , tweet.user.screen_name) # ãŠãŒã¶ãŒå print ( 'tweetDate : ' , tweet.created_at) # åããæ¥æ print (tweet.text) # tweetå
容 print ( 'favo : ' , tweet.favorite_count) # tweetã®ãããæ° print ( 'retw : ' , tweet.retweet_count) # tweetã®RTæ° print ( '=' * 80 ) # =ã80å衚瀺(åºåãç·) ãããå®è¡ãããšâŠ tweet _ååŸçµæ ãããªæãã§ tweet ã®ååŸãã§ããïœïœïœïœïŒ ã¯ã©ã€ã¢ã³ãäœã£ãŠãŠãŒã¶ãŒããŒãžéããšãã¯ãããªæãã§ tweet ååŸããŠè¡šç€ºãã⊠ãšããããªæããªãã§ãããã ãã®3ïŒæ€çŽ¢ã¯ãŒãã§åŒã£ããã£ã tweet ã JSON ãã¡ã€ã«ã«ããã ãã£ãã®ããããããã·ã¹ãã ããã¯ã« tweet ãååŸããŠã¿ãŸãããã ä»åã¯åŒç€Ÿã®è£œåã æ¥œæ¥œç²Ÿç® ãšå
¥ã£ã tweet ãæ€çŽ¢ã㊠JSON ãã¡ã€ã«ã«ä»ç«ãŠäžããããšããéèã§ãã #tweetããã¡ã€ã«ãšããŠä¿å import json import datetime import time from requests_oauthlib import OAuth1Session from pytz import timezone from dateutil import parser # ååŸããåçš®ããŒãæ ŒçŽ----------------------------------------------------- consumer_key = "consumer_key" consumer_secret = "consumer_secret" access_token = "access_token" access_token_secret = "access_token_secret" SEARCH_TWEETS_URL = 'https://api.twitter.com/1.1/search/tweets.json' RATE_LIMIT_STATUS_URL = "https://api.twitter.com/1.1/application/rate_limit_status.json" SEARCH_LIMIT_COUNT = 10 # ã»ãã·ã§ã³ç¢ºç« def get_twitter_session (): return OAuth1Session(consumer_key, consumer_secret, access_token, access_token_secret) # ããŒã¯ãŒãæ€çŽ¢ã§åŸãããtweetãååŸãã # max_idã䜿çšããŠæ¬¡ã®100ä»¶ãååŸ def search_twitter_timeline (keyword, since= '' , until= '' , max_id= '' ): timelines = [] id = '' twitter = get_twitter_session() params = { 'q' : keyword, 'count' : SEARCH_LIMIT_COUNT, 'result_type' : 'mixed' } if max_id != '' : params[ 'max_id' ] = max_id if since != '' : params[ 'since' ] = since if until != '' : params[ 'until' ] = until req = twitter.get(SEARCH_TWEETS_URL, params=params) if req.status_code == 200 : search_timeline = json.loads(req.text) for tweet in search_timeline[ 'statuses' ]: # 次ã®10ä»¶ãååŸãããšãã«max_idãšã€ã³ãŒã«ã®ãã®ã¯ãã§ã«ååŸæžã¿ãªã®ã§æšãŠã if max_id == str (tweet[ 'id' ]): print ( 'continue' ) continue timeline = { 'id' : tweet[ 'id' ] , 'created_at' : str (parser.parse(tweet[ 'created_at' ]).astimezone(timezone( 'Asia/Tokyo' ))) , 'text' : tweet[ 'text' ] , 'user_id' : tweet[ 'user' ][ 'id' ] , 'user_created_at' : str (parser.parse(tweet[ 'user' ][ 'created_at' ]).astimezone(timezone( 'Asia/Tokyo' ))) , 'user_name' : tweet[ 'user' ][ 'name' ] , 'user_screen_name' : tweet[ 'user' ][ 'screen_name' ] , 'user_description' : tweet[ 'user' ][ 'description' ] , 'user_location' : tweet[ 'user' ][ 'location' ] , 'user_statuses_count' : tweet[ 'user' ][ 'statuses_count' ] , 'user_followers_count' : tweet[ 'user' ][ 'followers_count' ] , 'user_friends_count' : tweet[ 'user' ][ 'friends_count' ] , 'user_listed_count' : tweet[ 'user' ][ 'listed_count' ] , 'user_favourites_count' : tweet[ 'user' ][ 'favourites_count' ] } # urlãååŸ if 'media' in tweet[ 'entities' ]: medias = tweet[ 'entities' ][ 'media' ] for media in medias: timeline[ 'url' ] = media[ 'url' ] break elif 'urls' in tweet[ 'entities' ]: urls = tweet[ 'entities' ][ 'urls' ] for url in urls: timeline[ 'url' ] = url[ 'url' ] break else : timeline[ 'url' ] = '' timelines.append(timeline) else : print ( "ERROR: %d" % req.status_code) twitter.close() return timelines, id def write_tweet_to_file (timelines, dt): # æ¥ä»ããšã«jsonã§æžã蟌㿠f = open ( "/Users/koichi/Documents/tweet/tweet-" + dt + ".json" , "a" ) for timeline in timelines: json.dump(timeline , f , ensure_ascii= False , sort_keys= True # ,indent=4 , separators=( ',' , ': ' )) f.write( ' \n ' ) f.close() return ## ã¡ã€ã³åŠç timelines = [] # tweetID max_id = '' # æ€çŽ¢ã¯ãŒã keyword = '楜楜粟ç®' # tweetååŸå¯Ÿè±¡æ¥ start_dt = '20201104' start_dt = datetime.datetime.strptime(start_dt, '%Y%m%d' ) for i in range ( 7 ): dt = (start_dt - datetime.timedelta(days=i)).strftime( '%Y-%m-%d' ) # print(dt) since = str (dt) + '_00:00:00_JST' until = str (dt) + '_23:59:59_JST' while True : # tweetæ€çŽ¢ timelines, max_id = search_twitter_timeline(keyword, since, until, max_id) time.sleep( 5 ) if timelines == []: break write_tweet_to_file(timelines, dt) if len (timelines) < SEARCH_LIMIT_COUNT: break å
ã»ã©ãŸã§äœ¿ã£ãŠãã tweepy ãšããã©ã€ãã©ãªã§ã¯ãªãæ¹æ³ã§è©ŠããŠã¿ãŸããã å®è¡ããçµæã¯âŠ tweet _ JSON ãã¡ã€ã« ã§ããã§ããïŒ ãã ãçè
ã¯ããã§åå°œããŠããŸã£ãã®ã§ãã£ãã JSON ã«ããã®ã« tweet ã®åœ¢ã«ããŠåŸ©å
ã¿ãã㪠ããäžæ®µéã®äœæ¥ ããããŸããã§ãã ã¯ã§ããŸããã§ãã⊠ãã ãä»åã¿ãããªããšããããããã§ã ç¹å®ã®ã¯ãŒããå
¥ã£ãtweetããæµããŠããªãTL ã¿ãããªã®ãã§ãããã§é¢çœããã§ãããã (æ®éã«å
¬åŒã®æ€çŽ¢æ©èœãšåãã§ããâŠ) ãããã« ãæ¥ããããªãããçè
ã¯TwitterAPIã§éãã§ã¿ãããšæã£ãŠåã㊠Python ãè§ŠããŸããã(ç°å¢æ§ç¯ ããã ãŸããã) Python ã£ãŠãšãŠãæ±ãããããŠããèšèªã§ãããã(çè
ã¯å¶çŽãå€ãæ¹ã奜ãã§ãã) API ãçžãŸã£ãŠãåçŽç·šãšããŠã¯ããªãæ±ãããããŠãããããããã詊ããŠã¿ãããªããšããæ°æã¡ã«ãªããŸããã Python èªäœãæªç¥ã®äžçã§ãã»ãšãã©åèã«ããèšäºã®å
容ãæåãããŠããã ããŸãããã ãšããããã詊ãã«è§Šã£ãŠã¿ããïŒãšããæ¹ã®ç®ã«çãŸãã°ãããšæããŸãã æ¬¡åã®èšäºã§ã¯ããå°ãå®æåœ¢ã«ãªããããªãã®ãæžãããšâŠãããªâŠ(å°æ¥ã®èªåã«æåŸ
) 以äžã®èšäºãåèã«ããŠããŸãã qiita.com qiita.com ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã forms.gle ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ rakus.connpass.com