def scrape_worldOmeter(korea=True):
    """worldOmeter에서 세계 확진환자수, 격리해제수, 사망자수 수집

    Args:
        world: 대한민국 데이터만 수집하려면, True
               세계 데이터를 수집하려면, False

    Returns:
        (dict) 한국의 확진환자수(cc_sum), 격리해제수(recovered), 사망자수(dead)
    """
    html = requests.get("https://www.worldometers.info/coronavirus/")
    soup = BeautifulSoup(html.text, "html.parser")
    data = soup.select("#main_table_countries > tbody > tr")

    world_data = {}
    world_cc, world_recovered, world_dead = 0, 0, 0
    push = []
    for datum in data:
        country = datum.find_all("td")[0].text.strip()
        cc = datum.find_all("td")[1].text.strip()
        recovered = datum.find_all("td")[5].text.strip()
        dead = datum.find_all("td")[3].text.strip()
        postproc = postprocess([cc, recovered, dead])
        cc, recovered, dead = postproc[0], postproc[1], postproc[2]

        if cc:
            world_cc += cc
        if recovered:
            world_recovered += recovered
        if dead:
            world_dead += dead

        if korea:
            if country != "S. Korea":
                continue
            korea_patients = patients.copy()
            korea_patients["cc_sum"] = cc
            korea_patients["recovered"] = recovered
            korea_patients["dead"] = dead
            push.append(("대한민국", korea_patients))
            SlackHandler().add_scraping_msg(
                "scrape_korea.py >> scrape_worldOmeter()", push)
            return korea_patients

        world_data[country] = patients.copy()
        world_data[country]["cc_sum"] = cc
        world_data[country]["recovered"] = recovered
        world_data[country]["dead"] = dead
        push.append((country, world_data[country]))
        time.sleep(0.2)

    world_data["world"] = patients.copy()
    world_data["world"]["cc_sum"] = world_cc
    world_data["world"]["recovered"] = world_recovered
    world_data["world"]["dead"] = world_dead
    push.append(("world", world_data["world"]))

    SlackHandler().add_scraping_msg(
        "scrape_korea.py >> scrape_worldOmeter(korea=False)", push)
    return world_data
Exemple #2
0
def create_ticket_form():
    data = request.form
    Database.create_conversation(db, data["user_id"], data["channel_id"])
    view = SlackHandler.create_ticket_view(data)
    client.views_open(
        trigger_id=data["trigger_id"],
        view=view
    )
    return "Opening up a ticket request..."
Exemple #3
0
def lambda_handler(event, context):

    metadata = None

    # Make output clearer to read.
    print("\n---")

    print("\n[lambda] instantiated")

    bucket_name = event["Records"][0]["s3"]["bucket"]["name"]
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'],
                                    encoding='utf-8')

    directory = key.rsplit("/", 1)[0]
    print(f"[lambda] directory: {directory}\n")

    # List and get filepaths within "directory"
    filenames = []
    for parser_object in s3.Bucket(bucket_name).objects.filter(
            Prefix=directory):
        filenames.append(parser_object.key)

    for parser_output_file in filenames:
        # Deal with metadata
        if parser_output_file.endswith(".json"):
            metadata = load_metadata(parser_output_file, bucket_name)

    print(f"[lambda] starting slackhandler\n---")
    slack = SlackHandler(metadata)

    if metadata is None:
        print(
            "[lambda] warning: metadata file not parsed. please check the s3 bucket!\n"
        )
        slack.update("metadata file not parsed - stopping lambda")
        return False

    # now that metadata's loaded, deal with the actual report
    load_report(slack, metadata, key, bucket_name)

    # Make output clearer to read.
    print("---\n")

    return True
Exemple #4
0
def interactions():

    user_id="UTG9YH3HV"
    id = "CTG9YH7QX"

    client.chat_postEphemeral(channel=id, user=user_id, text="hi")

    data = request.form
    client.chat_postEphemeral(channel=id,user=user_id,text=str(data))

    client.chat_postEphemeral(channel=id,user=user_id, text="hi")

    data = request.form

    channel_id = Database.get_conversation(data["user"]["id"], db=db)
    client.chat_postMessage(channel=channel_id,
                            text="Data: {}".format(str(data)))

    if data["type"] == "block_actions":
        SlackHandler.handle_interactions(client=client, data=data, db=db)
        return jsonify({'ok': True, 'message': 'interaction handled successfully'}), 200
    elif data["type"] == "view_closed":
        SlackHandler.handle_close(client=client, data=data, db=db)
        return jsonify({'ok': True, 'message': 'Closed modal successfully!'}), 200
    elif data["type"] == "view_submission":
        SlackHandler.handle_submission(client=client, data=data, db=db)
        return jsonify({'ok': True, 'message': 'Ticket created successfully!'}), 200
    return jsonify({'ok': True, 'message': 'Unknown'}), 200
def scrape_seoul():
    """서울 발생 동향 수집"""
    html = requests.get("http://www.seoul.go.kr/coronaV/coronaStatus.do")
    soup = BeautifulSoup(html.text, "html.parser")
    time = soup.select_one("div.status-seoul > h4 > span").text
    var_list = [d.text for d in soup.find_all("p", class_="counter")[:7]]
    postproc = postprocess(var_list)

    # TODO: 수집한 데이터를 해당하는 키에 할당
    seoul = {}
    # seoul["increasing"] =
    seoul["cc_sum"] = postproc[0]
    # seoul["recovered"] =
    # seoul["dead"] =
    # seoul["incidence"] =
    seoul["time"] = time
    SlackHandler().add_scraping_msg("scrape_domestic.py >> scrape_seoul()", [("서울", seoul)])
    return seoul
def scrape_KCDC_korea():
    """KCDC에서 대한민국 확진환자수, 격리해제수, 사망자수 수집

    Returns:
        (dict) 한국의 세계 확진환자수(cc), 격리해제수(recovered), 사망자수(dead)
    """
    html = requests.get("http://ncov.mohw.go.kr/index_main.jsp")
    soup = BeautifulSoup(html.text, "lxml")
    data = soup.select("div.co_cur > ul > li > a.num")
    regex = re.compile(r"\d[,\d]+")
    cc = regex.search(data[0].text).group()
    recovered = regex.search(data[1].text).group()
    dead = regex.search(data[2].text).group()
    postproc = postprocess([cc, recovered, dead])
    return_data = patients.copy()
    return_data["cc_sum"] = postproc[0]
    return_data["recovered"] = postproc[1]
    return_data["dead"] = postproc[2]
    SlackHandler().add_scraping_msg("scrape_korea.py >> scrape_KCDC_korea()",
                                    [("대한민국", return_data)])
    return return_data
def scrape_KCDC_citydo():
    """질병관리본부의 시도별 발생동향 수집"""
    request_headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Cookie': '_ga=GA1.3.902460717.1582188059; _gid=GA1.3.1299466237.1583138633; JSESSIONID=hUEn1QgHlDMNI2gSSZJxuN0zYGahJogaUyaeAEvgyXstvqyq4C13pOf4dNGoOdid.mohwwas1_servlet_engine40; NetFunnel_ID=; _gat_gtag_UA_26269343_2=1',
        'Host': 'ncov.mohw.go.kr',
        'Referer': 'http://ncov.mohw.go.kr/bdBoardList_Real.do?brdId=1&brdGubun=13&ncvContSeq=&contSeq=&board_id=&gubun=&fbclid=IwAR3NoNL_j1phitehSggDQedf7S165308xIEeG8ljACy-VRq-T5efcbcTK_s',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
    }

    session = requests.Session()
    session.max_redirects = 6000000
    html = session.get("http://ncov.mohw.go.kr/bdBoardList_Real.do?brdId=1&brdGubun=13&ncvContSeq=&contSeq=&board_id=&gubun=", headers=request_headers)
    soup = BeautifulSoup(html.text, "html.parser")
    time = soup.select_one("p.info > span").text
    data = soup.select("table.num > tbody > tr")

    push = []
    new_data = {}
    for datum in data:
        name = datum.find("th").text
        number = datum.find_all("td")
        var_list = []
        for i in range(4):
            var_list.append(number[i].text)
        postproc = postprocess(var_list)
        new_data[name] = citydo.copy()
        new_data[name]["increasing"] = postproc[0]
        new_data[name]["cc_sum"] = postproc[1]
        new_data[name]["dead"] = postproc[2]
        new_data[name]["incidence"] = postproc[3]
        new_data[name]["time"] = time
        push.append((name, new_data[name]))
    SlackHandler().add_scraping_msg("scrape_domestic.py >> scrape_KCDC_citydo()", push)
    return new_data
def run_main():
    """전체 프로세스 실행"""
    sleep_interval = 60 * 15

    while True:
        print("\n##########################################################\n")

        now_time = datetime.datetime.now()
        print(now_time, end="\n")

        push = []
        old_domestic = load_json(domestic_path)
        old_korea = old_domestic["대한민국"]
        old_korea["time"] = None

        print("\n================= <대한민국> 업데이트 중")
        new_korea = scrape_korea.run_korea()
        ko_check = check_korea(old_korea, new_korea)
        if ko_check:
            push.append(["대한민국", old_korea.copy(), new_korea])
            old_domestic["대한민국"].update(new_korea)

        print("\n================= <국내 시/도> 업데이트 중")
        new_domestic = scrape_domestic.run_domestic()
        do_check, up_list = check_update(old_domestic, new_domestic)
        if do_check:
            for ul in up_list:
                key = list(ul.keys())[0]
                push.append([key, old_domestic[key].copy(), ul[key]])
                old_domestic[key].update(ul[key])

        wo_check = False
        if now_time.hour in range(0, 24, 3) and now_time.minute in range(
                0, 15):
            print("\n================= <세계> 업데이트 중")
            old_world = load_json(world_path)
            new_world = scrape_korea.scrape_worldOmeter(korea=False)
            wo_check, up_list = check_update(old_world, new_world)
            if wo_check:
                for ul in up_list:
                    key = list(ul.keys())[0]
                    if key not in old_world.keys():
                        new = patients.copy()
                        push.append([key, new, ul[key]])
                    else:
                        push.append([key, old_world[key].copy(), ul[key]])
                    old_world.update(ul)

        if ko_check or do_check:
            print("\n================= <대한민국 및 시/도> 데이터 업데이트 중")
            old_domestic["대한민국"]["time"] = str(datetime.datetime.now())
            save_json(old_domestic, domestic_path)
            SlackHandler().push_file_msg("./_domestic.json")

        if wo_check:
            print("\n================= <세계> 데이터 업데이트 중")
            save_json(old_world, world_path)
            SlackHandler().push_file_msg("./_world.json")

        if ko_check or do_check or wo_check:
            SlackHandler().add_update_msg(push)

        SlackHandler().push_scraping_message()
        SlackHandler().push_update_message()

        print("\n##########################################################\n")
        time.sleep(sleep_interval)
Exemple #9
0
        if status_code is not None:
            self.status_code = status_code
        self.payload = payload

    def to_dict(self):
        rv = dict(self.payload or ())
        rv["message"] = self.message
        return rv


cfg = load_config()

meta_data_handler = MetaDataHandler()
db_handler = DBHandler(**cfg["db_handler"])
log_handler = LogHandler(**cfg["log_handler"])
slack_handlers = [SlackHandler(**args) for args in cfg["slack_handlers"]]

app = Flask(__name__)
CORS(app, **cfg["cors"])


@app.route("/")
def index():
    return jsonify({})


def get_start() -> int:
    start = request.args.get(
        "start", "0")  # NOTE: set the default value as a string object.
    if not start.isdecimal():
        raise InvalidUsage('Parameter "start" must be an integer.')