78
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

自動でArxivから論文を取得して、日本語に直してLineに投稿すれば、受動的に最新情報が収集できるかも!?

Last updated at Posted at 2019-02-25

はじめに

最先端の論文は知りたいけど、時間が無くて論文を読む気にならない。。。
arXiv見ても英語でよくわからないから、日本語がよい。。。
Slackとかよくわかんないし、Lineに通知して欲しい。。。

ということで、これらを満たすようなシステムを構成してみました!

実行イメージはこんな感じです。
image.png

追記★20210421

翻訳でエラーが出たら下記参照!
https://qiita.com/_yushuu/items/83c51e29771530646659

システム構成

こんな感じで実装していきます。トリガーは、Pythonコード実行です。
①~③をpythonコード上に記述し、④、⑤はIFTTTの設定で行います。
image.png

ちなみに、IFTTTの設定を変えれば、投稿先をlineから簡単にslackやtwitterに変えることができます。

では、各々について説明していきます。

①~③:論文取得からPOSTまでの実装

arxivからの取得コードに関しては、下記URLを参考(流用)しております。HK様感謝。
参考 : Slackで論文収集botを作る

主な変更点は2点
①:取得したAbstをGoogle翻訳にかけている
②:Post先がIFTTTのwebhook
となります。

コードの下に、個々の環境で動作させるための変更点が記述してあります。

arxiv2line.py
from datetime import datetime
import re
import requests
import pickle
import os
from googletrans import Translator

import requests

# webhook POST先URL
API_URL = "https://maker.ifttt.com/trigger/<IFTTTに設定するイベント名>/with/key/<IFTTTでの個人用KEY>"

# 検索ワード
QUERY = "(cat:cs.CV)+AND+(abs:depth)"



def parse(data, tag):
    # parse atom file
    # e.g. Input :<tag>XYZ </tag> -> Output: XYZ

    pattern = "<" + tag + ">([\s\S]*?)<\/" + tag + ">"
    if all:
        obj = re.findall(pattern, data)
    return obj


def search_and_send(query, start, ids, api_url):
    translator = Translator()
    while True:
        counter = 0

        url = 'http://export.arxiv.org/api/query?search_query=' + query + '&start=' + str(
            start) + '&max_results=100&sortBy=lastUpdatedDate&sortOrder=descending'
        # Get returned value from arXiv API
        data = requests.get(url).text
        # Parse the returned value
        entries = parse(data, "entry")
        for entry in entries:
            # Parse each entry
            url = parse(entry, "id")[0]
            if not (url in ids):
                # parse
                title = parse(entry, "title")[0]
                abstract = parse(entry, "summary")[0]
                date = parse(entry, "published")[0]

                # abstの改行を取る
                abstract = abstract.replace('\n', '')

                # 日本語化 ★②の部分
                title_jap = translator.translate(title, dest='ja')
                abstract_jap = translator.translate(abstract, dest='ja')

                message = "\n".join(
                     ["<br>Title:  " + title, "<br><br>URL: " + url, "<br><br>Published: " + date, "<br><br>JP_Abstract: " + abstract_jap.text])             
                
                # webhookへPost ★①の部分
                response = requests.post(api_url, data={"value1": message})

                
                ids.append(url)
                counter = counter + 1
                if counter == 10:
                    return 0
        if counter == 0 and len(entries) < 100:
            requests.post(api_url, data={"value1": "Currently, there is no available papers"})
            return 0
        elif counter == 0 and len(entries) == 100:
            # When there is no available paper and full query
            start = start + 100


if __name__ == "__main__":
    print("Publish")
    # setup =========================================================
    # Set URL of API
    api_url = API_URL
       
    # Load log of published data
    if os.path.exists("published.pkl"):
        ids = pickle.load(open("published.pkl", 'rb'))
    else:
        ids = []
        
    # Query for arXiv API
    query = QUERY

    
    # start =========================================================
    start = 0
    
    # Post greeting to your Slack
    dt = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    requests.post(api_url, data={"value1": dt})
    
    # Call function
    search_and_send(query, start, ids, api_url)
    
    # Update log of published data
    pickle.dump(ids, open("published.pkl", "wb"))

個々の環境で動作させるために、変更が必要になる部分は、コード上部の下記の部分になります。

koko.py
# webhook POST先URL
API_URL = "https://maker.ifttt.com/trigger/<①IFTTTに設定するイベント名>/with/key/<②IFTTTでの個人用KEY>"

# 検索ワード
QUERY = "(cat:cs.CV)+AND+(abs:depth)"

API_URLは、webhook POST先URLを、QUERYはarxivでの検索ワードとなります。
API_URLには、
 ①:IFTTTに設定するイベント名
 ②:IFTTTでの個人用KEY
を各自で設定する必要があります。

QUERYに関しては、arxiv APIでググると出てきます。現状は、CV分野でアブストの中にdepthと記述してあるものです。

④、⑤:IFTTT設定

さっそく設定をしていきます。
前提として、IFTTT登録済みとさせていただきます。
まだの方は、下記のページで登録までやっちゃいましょう。
https://ifttt.com/discover

Applet作成

My appletsを選択します。
image.png

New appletをポチ。
image.png

Trigger側の設定作成!

Thisをポチ
image.png

webhookを検索し、選択します。
image.png

image.png

下記の入力ボックスに独自のEvent NameをつけてCreateTriggerをポチります。
ここのEvent Nameが、先ほどのpythonコード中の<①:IFTTTに設定するイベント名>となります。

image.png

Action側の設定作成!

続いて、Action側の設定を行っていきます。

image.png

image.png

あらかじめ、Lineグループを作成しておくと、そこにPostすることができます。
image.png

IFTTTでの個人用KEY取得

右上のsettings->serviceをポチ
image.png
serviceからwebhookを検索し、ポチる。
image.png

右上のsettingsを選択。
image.png

ここの、赤で囲った部分が、IFTTTでの個人用KEYとなります。
image.png

まとめ

こんな感じで実装することで、簡単にLINEに論文まとめを投稿することができます!

今回、僕はgoogle coraboratoryを使用して、これらを実装をいたしました。
https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

次の目標は、AWSで定期的実行する、といったところでしょうか。
IFTTTのよい勉強になりました!

78
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
66

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?