올해 1년을 맛있을 것 같은 맥주 사진과 함께 되돌아 본다

16233 단어 Python3TwitterAPIFlask

머리



올해는 후반(전직 후)이 바빠서, 커뮤니티 활동도 혼잡해 버려, 관계 각처에 대단히 폐를 끼쳤습니다. 내년에는 조금 조정해, 여러가지 할 수 있도록 하고 싶습니다(욕망)

올해의 출력



작년부터 참가하고 있는 @tacck씨 주최의, 「유루 웹 공부회 @삿포로 했다.
작성 당시에는 프레임워크도 사용하지 않고 커맨드 라인에서 실행하면 로컬 폴더에 취득한 이미지를 저장하는 것이 었습니다. 수정 중입니다.

실제 소스 코드


# Flask などの必要なライブラリをインポートする
import os
import json
import time
import lxml.html
import cssselect
import itertools
import re
from datetime import datetime, timedelta
from flask import Flask, render_template, request, redirect, url_for
from dotenv import load_dotenv
from TwitterAPI import TwitterAPI

app = Flask(__name__)

load_dotenv()
CK = os.environ.get('CONSUMER_KEY')
CS = os.environ.get('CONSUMER_SECRET')
AT = os.environ.get('ACCESS_TOKEN')
ATS = os.environ.get('ACCESS_TOKEN_SECRET')

SEARCH_TERM = os.environ.get('TARGET_ACCOUNT')
api = TwitterAPI(CK, CS, AT, ATS)
mkdir_name = "bier_illustration"
reg_url = r"https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"

data_next = '0'

# Tweetを取得
def get_target_word(keyword):
    global data_next
    # fullarchive start
    from_date_string = '200603210000'
    if (data_next == '***'):
        return []
    elif (data_next == '0'):
        print('first fetch')
        req = api.request('tweets/search/fullarchive/:bier', {'query': SEARCH_TERM + keyword, 'fromDate': from_date_string})
    else:
        print('next fetch:' + data_next)
        req = api.request('tweets/search/fullarchive/:bier', {'query': SEARCH_TERM + keyword, 'fromDate': from_date_string, 'next': data_next})
    # fullarchive end
    # 30days start
    '''
    from_date = datetime.now()
    from_date -= timedelta(days=30)
    from_date_string = from_date.strftime('%Y%m%d0000')
    req = api.request('tweets/search/30day/:bier', {'query': SEARCH_TERM + keyword, 'fromDate': from_date_string})
    if (data_next == '***'):
        return []
    elif (data_next == '0'):
        print('first fetch')
        req = api.request('tweets/search/30day/:bier', {'query': SEARCH_TERM + keyword, 'fromDate': from_date_string})
    else:
        print('next fetch:' + data_next)
        req = api.request('tweets/search/30day/:bier', {'query': SEARCH_TERM + keyword, 'fromDate': from_date_string, 'next': data_next})
    '''
    # 30days end
    timeline = json.loads(req.text)
    try:
        data_next = timeline['next']
    except KeyError:
        data_next = '***'
    finally:
        return timeline

# 取得したツイートに画像があれば、その画像を取得する
def get_illustration(timeline):
    biers = []
    try:
        for tweet in timeline['results']:
            bier_dic = {}
            time_stirng = time.strftime('%Y-%m-%d', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
            # tweetから直接画像を取得
            extended_entities = tweet.get('extended_entities')
            if extended_entities == None:
                pass
            else:
                media_list = tweet['extended_entities']['media']
                for media in media_list:
                    print('get twitter embedded picture')
                    bier_dic['url'] = media['media_url']
                    bier_dic['file_name'] = time_stirng + "_" + os.path.basename(media['media_url'])
            biers.append(bier_dic)
        return biers
    except KeyError:
        print('KeyError')
        return []
    except:
        import traceback
        traceback.print_exc()
        return []

# ここからウェブアプリケーション用のルーティングを記述
# index にアクセスしたときの処理
@app.route('/')
def index():
    all_biers = []
    # 検索対象の単語を設定
    while True:
        keyword = os.environ.get('TARGET_KEYWORD')
        timeline = get_target_word(keyword)
        ret_bier = get_illustration(timeline)
        if ret_bier == []:
            print('no data')
            break
        else:
            all_biers.append(ret_bier)
    # index.html をレンダリングする
    return render_template('index.html', biers=list(itertools.chain.from_iterable(all_biers)), title=os.environ.get('TITLE'))

if __name__ == '__main__':
    app.debug = True # デバッグモード有効化
    app.run(host='127.0.0.1') # どこからでもアクセス可能に

소스 코드 정보



본 엔트리의 타이틀에도 있는 대로, 완전하게 재료입니다만, 소스 코드 자체는 보통의 TwitterAPI 를 이용한, 화상 수집 프로그램입니다. 내용적으로는 어려운 곳은 없지만, Twitter의 API의 사양을 완전히 파악할 수 없고, 현재는 아직 버그가 있습니다. (100건이 넘는 트윗을 받지 못함)
이외에 템플릿 등도 있지만 큰 내용이 아니므로 생략합니다.

실행 결과





끝에



내년의 공부회를 향해, 이 프로그램을 발전시켜, 기계 학습등도 해 보고 싶습니다.
내년도 잘 부탁드립니다. > 관계자 각위

좋은 웹페이지 즐겨찾기